Export Data LimeSurvey Menggunakan Python Citric

Sebenarnya saya sudah banyak membahas tentang Python Citric pada blog ini. Dan bahkan saya telah membuat skrip untuk mengambil data dari LimeSurvey dengan Python Citric dan menyimpannya dalam sqlite baik struktur maupun datanya.

Nah tadi ada kebutuhan sekedar mengambil data responses dari LimeSuryey yang barisnya melebihi 12.000 baris. Dalam database memang kalau kolomnya banyak menjadi agak berat, apalagi barisnya juga banyak.

Diambil lewat menu pada Limesurvey ternyata gagal. Mungkin karena terbentur limitasi memori pada setting PHP atau LiteSpeed, saya sendiri kurang paham, atau bisa jadi kena timeout. Namun ketika diambil menggunakan jalur API, data berhasil diambil dengan sempurna.

Oke skrip ini sangat tergantung dengan library pandas dan citric. Maka langkah pertama adalah neginstall library pandas dan citric.

pip install citric pandas

Kemudian install juga xlsx writer biar bisa nulis ke excel

pip install openpyxl

Jika sudah, kita tinggal membuka editor text copas  code dibawah ini, dan atur beberapa nilai variabelnya.

"""
Script created by Edy Santoso ([email protected])
Modified on: 2025-10-07
Purpose: Export LimeSurvey responses directly to XLSX
"""

from citric import Client
import io
import pandas as pd
import datetime

# Ganti sesuai survey kamu
SURVEY_ID = 811491

# Inisialisasi koneksi LimeSurvey
client = Client(
    'https://alamat_limesurvey_kamu/index.php/admin/remotecontrol',
    'username_kamu',
    'password_kamu'
)

# Buat nama file berdasarkan waktu sekarang
current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"responses_{SURVEY_ID}_{current_time}.xlsx"

print("Downloading responses...")

# Ambil data responses dalam format CSV (lebih stabil lalu diubah ke XLSX)
with io.BytesIO() as file:
    file.write(client.export_responses(
        SURVEY_ID,
        file_format="csv",          # ambil dalam bentuk CSV dulu
        heading_type='code',        # gunakan code pertanyaan
        response_type='long',       # isi teks panjang
        completion_status='all'     # ambil semua, termasuk incomplete
    ))
    file.seek(0)

    # Baca CSV ke DataFrame pandas
    responses_df = pd.read_csv(file, delimiter=";", low_memory=False)

# Simpan ke Excel
responses_df.to_excel(output_file, index=False)
print(f"Responses saved as {output_file}")

Simpan file tersebut dan beri nama misalnya getDataXLSX.py

Nantinya kamu tinggal mausk ke folder yang bersangkutan dan jalankan dengan perintah:

python getDataXLSX.py

Tunggu beberapa saat, dan kita akan mendapatkan data dalam bentuk xlsx…

Update 2025-10-27:

Tadi ada laporan dari analis yang mencoba mendownload data, namun ada error. Setelah saya analisis karena data terlalu besar. Akhirnya saya memodifikasi skrip agar bisa download data dari id sekian ke id sekian. Nanti digabungkan sendiri

 

"""
Script created by Edy Santoso ([email protected])
Modified on: 2025-10-27
Purpose: Export LimeSurvey responses directly to XLSX
"""

from citric import Client
import io
import pandas as pd
import datetime

# Ganti sesuai survey kamu
SURVEY_ID = 811491
ID_START = 5001
ID_END = 5010

# Inisialisasi koneksi LimeSurvey
client = Client(
    'https://alamat_limesurvey_kamu/index.php/admin/remotecontrol',
    'username_kamu',
    'password_kamu'
)

# Buat nama file berdasarkan waktu sekarang
current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"responses_{SURVEY_ID}_{current_time}.xlsx"

print("Downloading responses...")

# Ambil data responses dalam format CSV (lebih stabil lalu diubah ke XLSX)
with io.BytesIO() as file:
    file.write(client.export_responses(
        SURVEY_ID,
        file_format="csv",          # ambil dalam bentuk CSV dulu
        heading_type='code',        # gunakan code pertanyaan
        response_type='long',       # isi teks panjang
        completion_status='all'     # ambil semua, termasuk incomplete
        from_response_id=ID_START,  # id start
        to_response_id=ID_END       # id end 
    ))
    file.seek(0)

    # Baca CSV ke DataFrame pandas
    responses_df = pd.read_csv(file, delimiter=";", low_memory=False)

# Simpan ke Excel
responses_df.to_excel(output_file, index=False)
print(f"Responses saved as {output_file}")

Berikut parameter pada export_responses() jika ingin melakukan modifikasi output:

survey_id (int) – Survey to add the response to.
token (str | None) – Optional participant token to get responses for.
file_format (str | citric.enums.ResponsesExportFormat) – Type of export. One of PDF, CSV, XLS, DOC or JSON.
language (str | None) – Export responses made to this language version of the survey.
completion_status (str | citric.enums.SurveyCompletionStatus) – Incomplete, complete or all.
heading_type (str | citric.enums.HeadingType) – Use response codes, long or abbreviated titles.
response_type (str | citric.enums.ResponseType) – Export long or short text responses.
from_response_id (int | None) – First response to export.
to_response_id (int | None) – Last response to export.
fields (collections.abc.Sequence[str] | None) – Which response fields to export. If none, exports all fields.
additional_options (citric.types.ExportAdditionalOptions | None) – Dictionary of additional options to format the export.

Okey demikian

Membuat Variabel Dinamis Pada Dokumen Word (docx)

Adalah hal menyebalkan ketika kita diminta membuat dokumen kenaikan pangkat/jenjang dalam organisasi. Karena jamannya online,  kita diminta mengedit dokumen docx dan menyerahkan ke pimpinan. Online yang setengah-setengah :). Kalau online beneran ya pakai databaselah, bukan nyerahin file docx 🙂

Bayangkan jika satu orang harus melampirkan 2 dokumen saja,  30 orang sudah 60 dokumen, Membuka 60 file word satu-satu maaaaak. Ampuuun….

Apalagi kalau harus ada yang diupdate di semua dokumen karena ada format dokumen yang salah, ada yang harus diedit. Buka – edit – simpan 60 dokumen. Ampuuun Caaaak.

Kadang tidak sampai disitu, data harus direkap dalam bentuk tabel spreadsheet. Buka satu-satu copas … hadooh…

Sampai disitu ada instruksi nama file harus urut abjat nama orang. Ngiiing ….

Lebih enak bahwa semua data itu kita masukkan database atau Google Sheet yang diisi melalui Google Form. Lalu kita membuat template word. Dan terakhir kita sambungkan data dengan template word  menggunakan skrip.

Selanjutnya »

Download Mp3 dari Youtube

Saya suka mendengarkan lagu dalam format mp3. Namun mendapatkan format mp3 ini tidak mudah didapat. Hari ini yang ada mpeg (lagu dengan video) yang didownload langsung dari Youtube.

Saya masih tertarik mendengarkan mp3nya saja. Video itu hanya menambah-nambah ukuran file saja.

Memang ada beberapa aplikasi online konversi dari URL Youtube ke Mp3, namun penuh kelemahan, seperti adanya iklan berbasis link yang tidak masuk akal sampai pada tidak bisa download mp3 yang panjang.

Akhirnya dengan bantuan ChatGPT, saya membuat program untuk mengatasi hal tersebut :

# pip install yt_dlp
import yt_dlp
def getmp3(url):
    ydl_opts = {
        "format": "bestaudio/best",
        "postprocessors": [{
            "key": "FFmpegExtractAudio",
            "preferredcodec": "mp3",
            "preferredquality": "192",
        }],
    }
    try:
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])
        return True  # Berhasil
    except yt_dlp.utils.DownloadError as e:
        print(f"Error: {e}")
        return False  # Gagal

while True:
    url = input("Enter the URL of the video you want to download: \n>> ").strip()
    
    if not url:
        print("No URL entered. Please try again.")
        continue  # Kembali meminta URL jika kosong

    # Coba unduh URL
    if getmp3(url):
        print("Download successful! \n\n")
        continue  # Kembali meminta URL jika masih mau input URL kembali
    else:
        print("Invalid URL or an error occurred. Please try again.")

Namun sering library seperti ini cepat tidak bekerja seiring layanan yang menutup celah agar tidak bisa di dlownload.

Python: Pdf2Docx

Tadi malam saya ingin mengirimkan dokumen yang harusnya dikirim dalam bentuk docx, namun file yang dikirim ke saya ada yang berbentuk docx ada yang pdf.

Males juga mengubah secara manual dari pdf ke docx. Apalagi jumlahnya mungkin sekitar 20-an file.

Ok, kita selesaikan dengan Python:

pip install Converter
pip install pdf2docx

Kemudian gunakan skrips eperti ini:

# install dulu librarynya:
# pip install Converter
# pip install pdf2docx

from pdf2docx import Converter
import os

### dir_path for input reading and output files & a for loop ###

path_input = './cay-pdf/'
path_output = './cay-output/'

# Pastikan folder output ada, jika tidak buat
os.makedirs(path_output, exist_ok=True)

# Loop melalui semua file di folder input
for file in os.listdir(path_input):
    # Filter hanya file PDF
    if file.lower().endswith('.pdf'):
        # Dapatkan nama file tanpa ekstensi
        file_name = os.path.splitext(file)[0]

        # Path lengkap untuk input dan output
        input_path = os.path.join(path_input, file)
        output_path = os.path.join(path_output, file_name + '.docx')

        # Konversi file
        try:
            cv = Converter(input_path)
            cv.convert(output_path, start=0, end=None)
            cv.close()
            print(f"Berhasil mengonversi: {file}")
        except Exception as e:
            print(f"Error saat mengonversi {file}: {e}")

Terus hasilnya bagaimana. Ya, lumayanlah …

Membuat File Bacaan Sholat

Saya “terpaksa” membuat file bacaan sholat sendiri karena saya sulit mendapatkan file bacaan sholat dengan kriteria:

  1. Lengkap (sampai pada doa sesudah sholat)
  2. Ringkas ( bacaannya mengambil bacaan yang tidak lambat dan mengambil versi pendeknya saja)

Mengapa? Karena file-file itu akan saya gunakan untuk menuntun sholat orang yang sakit menahun yang ingatannya tidak terlalu baik, seperti orang alzimer, stroke, atau penyakit tua.

Sebenarnya saya nemu beberapa di internet, namun yang lengkap dari sholat subuh sampai isya tidak saya ketemukan.

Saya sendiri pada dasarnya berat untuk merekam bacaan sholat dari Subuh sampai Isya. Apalagi kamu tahu dalam rekaman, sering ada kesalahan di tengah-tengah. Berat.

Akhirnya saya membuat pecahan bacaan-bacaan sholat itu. Saya merekamnya dengan Audacity yang juga baru saya install.

  1. niat-sholat-subuh.mp3
  2. niat-sholat-dhuhur.mp3
  3. niat-sholat-ashar.mp3
  4. niat-sholat-maghrib.mp3
  5. niat-sholat-isya.mp3
  6. doa-iftitah.mp3
  7. surat-alfatihah.mp3
  8. surat-alikhlash.mp3
  9. surat-annas.mp3
  10. rukuk-sujud.mp3
  11. rukuk-qunut-sujud.mp3
  12. attahiyat-awwal.mp3
  13. attahiyat-akhir.mp3
  14. doa-sesudah-sholat.mp3

Jadi saya hanya merekam 14 file saja, yang nanti harus disusun berdasarkan sholatnya.

Untuk memudahkan penggabungan saya mempunyai kiat khusus

  1. Pada akhir file niat, rukuk – sujud, rukuk – qunut – sujud, attahiyat awwal diakhiri dengan takbir
  2. Pada akhir attahiyat akhir diakhiri dengan salam.

Dengan demikian saya tidak harus membuat file takbir dan salam sendiri.

Kedua, soal penggabungan file mp3-nya saya serahkan kepada python dengan program yang tentu saja minta bantuan chatgpt :D.

Install ffmpeg

Berikut cara untuk menginstall ffmpeg di Windows. Tanpa ffmpeg, kamu tidak akan bisa menggabungkan file mp3.

  1. Unduh ffmpeg:
    • Buka situs ffmpeg.org dan unduh versi yang sesuai dengan sistem operasi Anda (Windows).
    • Pilih link untuk versi static build untuk memudahkan instalasi.
  2. Ekstrak ffmpeg:
    • Setelah mengunduh, ekstrak file ZIP ke folder yang mudah diakses, misalnya C:\ffmpeg.
  3. Tambahkan ffmpeg ke PATH:
    • Buka Control Panel > System and Security > System > Advanced System Settings.
    • Klik tombol Environment Variables.
    • Di bagian System variables, cari variabel Path, kemudian klik Edit.
    • Klik New dan tambahkan lokasi folder bin dari ffmpeg, misalnya:
      C:\ffmpeg\bin
    • Klik OK pada semua jendela untuk menyimpan perubahan.
  4. Cek Instalasi ffmpeg:
    • Buka command prompt dan jalankan perintah berikut untuk memastikan ffmpeg terinstall dengan benar:
      ffmpeg -version
    • Jika instalasi berhasil, Anda akan melihat informasi versi ffmpeg yang terinstall.

Menggabungkan file Mp3

Berikut studi kasus untuk untuk sholat Isya

Jangan lupa jika kamu belum menginstall library pydub di python, install dulu dengan:.

pip install pydub

Sebenarnya library inilah yang membutuhkan ffmpeg.

Berikut program penggabungannya:

from pydub import AudioSegment
# Fungsi untuk memuat, menormalkan, dan menggabungkan audio
def load_and_combine(files):
    combined = AudioSegment.empty()  # Inisialisasi audio kosong
    for file in files:
        audio = AudioSegment.from_mp3(file)  # Muat file MP3
        audio = audio.normalize()  # Normalkan audio untuk menyelaraskan volume
        combined += audio  # Gabungkan audio
    return combined

# Daftar file MP3 untuk setiap bagian
niat_dan_rakaat_pertama = [
    "niat-sholat-isya.mp3",
    "doa-iftitah.mp3",
    "surat-alfatihah.mp3",
    "surat-alikhlash.mp3",
    "rukuk-sujud.mp3"
]

rakaat_kedua = [
    "surat-alfatihah.mp3",
    "surat-annas.mp3",
    "rukuk-sujud.mp3",
    "attahiyat-awwal.mp3"
]

rakaat_ketiga = [
    "surat-alfatihah.mp3",
    "rukuk-sujud.mp3"
]

rakaat_keempat_dan_doa = [
    "surat-alfatihah.mp3",
    "rukuk-sujud.mp3",
    "attahiyat-akhir.mp3",
    "doa-sesudah-sholat.mp3"
]

# Gabungkan setiap bagian
combined_niat_dan_rakaat_pertama = load_and_combine(niat_dan_rakaat_pertama)
combined_rakaat_kedua = load_and_combine(rakaat_kedua)
combined_rakaat_ketiga = load_and_combine(rakaat_ketiga)
combined_rakaat_keempat_dan_doa = load_and_combine(rakaat_keempat_dan_doa)

# Gabungkan semua bagian menjadi satu audio
final_audio = (combined_niat_dan_rakaat_pertama + combined_rakaat_kedua + 
               combined_rakaat_ketiga + combined_rakaat_keempat_dan_doa)

# Simpan hasil gabungan ke file baru
final_audio.export("sholat_isya.mp3", format="mp3")

Penjelasan

  • audio.normalize(): Menormalkan setiap file audio sehingga tingkat volume seimbang sebelum digabungkan.
  • Hasil akhirnya akan disimpan dalam file sholat_isya.mp3, dengan volume yang seragam di semua bagian.

Ok demikian sebagai catatan singkat pengalaman hari ini. Mudah-mudahan bermanfaat.