Grab JDIHN berdasarkan jenis dokumen.
<?php
/**
* Skrip interaktif untuk mengambil data dari API jdihn.go.id
* dan mengonversinya menjadi file CSV.
* Pengguna dapat memilih jenis dokumen dari daftar yang tersedia.
*/
// Non-aktifkan waktu eksekusi maksimum PHP, karena prosesnya bisa memakan waktu.
// Hapus baris ini jika Anda berada di lingkungan hosting yang membatasi fungsi ini.
set_time_limit(0);
// --- Langkah 0: Tampilkan daftar jenis dokumen dan minta input dari pengguna ---
// Data JSON yang berisi daftar jenis dokumen
$jenisDokumenJson = '[
{"id":4,"name":"MONOGRAFI HUKUM"},
{"id":5,"name":"ARTIKEL HUKUM"},
{"id":7,"name":"UNDANG-UNDANG DASAR"},
{"id":8,"name":"KETETAPAN MPR"},
{"id":9,"name":"UNDANG-UNDANG"},
{"id":10,"name":"PERATURAN PEMERINTAH PENGGANTI UNDANG-UNDANG"},
{"id":11,"name":"PERATURAN PEMERINTAH"},
{"id":12,"name":"PERATURAN PRESIDEN"},
{"id":13,"name":"KEPUTUSAN PRESIDEN"},
{"id":14,"name":"INSTRUKSI PRESIDEN"},
{"id":15,"name":"PENETAPAN PRESIDEN"},
{"id":16,"name":"UNDANG-UNDANG DARURAT"},
{"id":17,"name":"PENGATURAN PENGUASA PERANG TERTINGGI"},
{"id":27,"name":"PERATURAN KEMENTERIAN"},
{"id":28,"name":"PERATURAN BERSAMA"},
{"id":29,"name":"KEPUTUSAN KEMENTERIAN"},
{"id":30,"name":"KEPUTUSAN BERSAMA"},
{"id":31,"name":"INSTRUKSI KEMENTERIAN"},
{"id":33,"name":"SURAT EDARAN KEMENTERIAN"},
{"id":34,"name":"PERATURAN ESELON 1"},
{"id":35,"name":"KEPUTUSAN ESELON 1"},
{"id":36,"name":"PERATURAN LEMBAGA NEGARA"},
{"id":42,"name":"PERATURAN BPK"},
{"id":44,"name":"KEPUTUSAN LEMBAGA NEGARA"},
{"id":45,"name":"PERATURAN LEMBAGA PEMERINTAH NON KEMENTERIAN"},
{"id":47,"name":"PERATURAN KEPALA"},
{"id":48,"name":"KEPUTUSAN LEMBAGA PEMERINTAH NON KEMENTERIAN"},
{"id":49,"name":"PERATURAN LEMBAGA NON STRUKTURAL"},
{"id":56,"name":"KEPUTUSAN LEMBAGA NON STRUKTURAL"},
{"id":57,"name":"PERATURAN DAERAH PROVINSI"},
{"id":58,"name":"PERATURAN DAERAH KABUPATEN"},
{"id":59,"name":"PERATURAN DAERAH KOTA"},
{"id":60,"name":"PERATURAN DPRD PROVINSI"},
{"id":61,"name":"PERATURAN DPRD KABUPATEN"},
{"id":62,"name":"PERATURAN DPRD KOTA"},
{"id":63,"name":"PERATURAN GUBERNUR"},
{"id":64,"name":"PERATURAN BUPATI"},
{"id":65,"name":"PERATURAN WALIKOTA"},
{"id":67,"name":"PERATURAN DESA"},
{"id":68,"name":"KEPUTUSAN GUBERNUR"},
{"id":69,"name":"KEPUTUSAN BUPATI"},
{"id":70,"name":"KEPUTUSAN WALIKOTA"},
{"id":71,"name":"KEPUTUSAN DPRD"},
{"id":72,"name":"INSTRUKSI GUBERNUR"},
{"id":73,"name":"INSTRUKSI BUPATI"},
{"id":74,"name":"INSTRUKSI WALIKOTA"},
{"id":75,"name":"SURAT EDARAN PEMERINTAH DAERAH"},
{"id":76,"name":"STAATSBLAD"},
{"id":77,"name":"BUKU HUKUM"},
{"id":78,"name":"NASKAH AKADEMIK KEMENKUMHAM"},
{"id":79,"name":"NASKAH AKADEMIK"},
{"id":80,"name":"PENELITIAN HUKUM DAN HAM"},
{"id":81,"name":"PENGKAJIAN HUKUM"},
{"id":83,"name":"PENULISAN KARYA ILMIAH"},
{"id":84,"name":"KOMPENDIUM HUKUM"},
{"id":85,"name":"ANALISIS DAN EVALUASI"},
{"id":86,"name":"MAJALAH HUKUM NASIONAL"},
{"id":87,"name":"MAJALAH HUKUM"},
{"id":89,"name":"KLIPING MAJALAH KORAN"},
{"id":90,"name":"JURNAL HUKUM"},
{"id":91,"name":"YURISPRUDENSI"},
{"id":92,"name":"PUTUSAN MAHKAMAH AGUNG"},
{"id":93,"name":"PUTUSAN MAHKAMAH KONSTITUSI"},
{"id":94,"name":"RANCANGAN"},
{"id":95,"name":"RANCANGAN PERATURAN DAERAH"},
{"id":96,"name":"RANCANGAN PERATURAN DAERAH PROVINSI"},
{"id":97,"name":"RANCANGAN PERATURAN DAERAH KABUPATEN"},
{"id":98,"name":"RANCANGAN PERATURAN DAERAH KOTA"},
{"id":100,"name":"RANCANGAN PERATURAN BUPATI"},
{"id":103,"name":"MEMORANDUM OF UNDERSTANDING"},
{"id":104,"name":"PERJANJIAN KERJA SAMA"},
{"id":105,"name":"ARTIKEL"},
{"id":162,"name":"SURAT EDARAN"},
{"id":163,"name":"INSTRUKSI LEMBAGA PEMERINTAH NON KEMENTERIAN"},
{"id":217,"name":"LOKAKARYA"},
{"id":492,"name":"OSAMU SEIREI"},
{"id":493,"name":"OSAMU KANREI"},
{"id":624,"name":"PENELITIAN HUKUM"},
{"id":683,"name":"RANCANGAN PERATURAN BADAN"},
{"id":685,"name":"SURAT EDARAN LEMBAGA NEGARA"},
{"id":686,"name":"SURAT EDARAN LEMBAGA PEMERINTAH NON KEMENTERIAN"},
{"id":687,"name":"SURAT EDARAN LEMBAGA NON STRUKTURAL"},
{"id":688,"name":"RISALAH SIDANG"},
{"id":696,"name":"KEPUTUSAN PIMPINAN DPRD"},
{"id":720,"name":"RISALAH DPRD"},
{"id":794,"name":"KEPUTUSAN REKTOR"},
{"id":804,"name":"SURAT EDARAN KEPALA DESA"},
{"id":815,"name":"SURAT KEPUTUSAN DPRD KABUPATEN"},
{"id":816,"name":"KEPUTUSAN BERSAMA DPRD"},
{"id":817,"name":"SURAT KEPUTUSAN"},
{"id":823,"name":"KEPUTUSAN ESELON II"},
{"id":826,"name":"PERATURAN KEPALA DESA"},
{"id":831,"name":"HIMPUNAN"},
{"id":833,"name":"KESEPAKATAN BERSAMA BUPATI"},
{"id":841,"name":"PERATURAN DEWAN"},
{"id":844,"name":"HIMPUNAN PERATURAN"},
{"id":892,"name":"STATUTEN"},
{"id":911,"name":"PERATURAN KOMISI"},
{"id":973,"name":"KEPUTUSAN BADAN MUSYAWARAH DPRD"},
{"id":1013,"name":"BERITA ACARA"},
{"id":1027,"name":"KEPUTUSAN KEPALA DESA"},
{"id":1031,"name":"RANCANGAN DPRD"},
{"id":1033,"name":"KEPUTUSAN SEKRETARIS DPRD"},
{"id":1035,"name":"KARYA TULIS"},
{"id":1103,"name":"PERATURAN PERGURUAN TINGGI"},
{"id":1104,"name":"KEPUTUSAN PERGURUAN TINGGI"},
{"id":1105,"name":"SURAT EDARAN PERGURUAN TINGGI"},
{"id":1108,"name":"INSTRUKSI PERGURUAN TINGGI"},
{"id":1110,"name":"CONVENTION"},
{"id":1111,"name":"TREATY"},
{"id":1112,"name":"DECLARATION"},
{"id":1113,"name":"PROTOCOL"},
{"id":1114,"name":"COVENANT"},
{"id":1115,"name":"AGREEMENT"},
{"id":1147,"name":"PERJANJIAN KERJA SAMA PERGURUAN TINGGI"},
{"id":1155,"name":"PERJANJIAN KERJASAMA"},
{"id":1157,"name":"INSTRUKSI MENTERI"},
{"id":1159,"name":"KEPUTUSAN MENTERI"},
{"id":1198,"name":"PERATURAN DPR"},
{"id":1363,"name":"ZYOOREI"},
{"id":1364,"name":"SYUUREI"},
{"id":1365,"name":"MAKLOEMAT GUNSEIKAN"},
{"id":1366,"name":"OSAMU GUNREI"},
{"id":1689,"name":"PERATURAN ESELON 2 DAERAH"},
{"id":1690,"name":"KEPUTUSAN ESELON 1 DAERAH"},
{"id":1691,"name":"KEPUTUSAN ESELON 2 DAERAH"}
]';
// Decode JSON menjadi array asosiatif
$jenisDokumenList = json_decode($jenisDokumenJson, true);
// Buat array untuk pencarian cepat (id => name)
$lookup = array_column($jenisDokumenList, 'name', 'id');
echo "========================================\n";
echo " Daftar Jenis Dokumen JDIHN\n";
echo "========================================\n";
foreach ($jenisDokumenList as $dokumen) {
// Menggunakan sprintf untuk formatting output yang rapi
echo sprintf("ID: %-5s | Nama: %s\n", $dokumen['id'], $dokumen['name']);
}
echo "========================================\n";
// Loop untuk meminta input yang valid dari pengguna
do {
$input = readline("Masukkan kode jenis dokumen yang ingin diambil (ID): ");
if (!ctype_digit($input)) {
echo "Error: Input harus berupa angka. Silakan coba lagi.\n";
} elseif (!isset($lookup[$input])) {
echo "Error: Kode '$input' tidak ditemukan dalam daftar. Silakan coba lagi.\n";
} else {
// Input valid, keluar dari loop
break;
}
} while (true);
$jenisId = (int)$input;
$jenisName = $lookup[$jenisId];
echo "\nAnda memilih: ID {$jenisId} ({$jenisName}).\n";
echo "Memulai proses pengambilan data...\n\n";
// --- Langkah 1: Dapatkan total halaman dari halaman pertama ---
$baseUrl = 'https://jdihn.go.id/api/search?jenis=' . $jenisId . '&page=';
$totalPages = 0;
try {
$firstPageContent = @file_get_contents($baseUrl . '1');
if ($firstPageContent === false) {
throw new Exception("Gagal mengambil data dari halaman pertama. Periksa koneksi internet atau ketersediaan API.");
}
$firstPageData = json_decode($firstPageContent, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception("Gagal mem-parsing JSON dari halaman pertama: " . json_last_error_msg());
}
if (!isset($firstPageData['meta']['last_page'])) {
throw new Exception("Struktur JSON tidak sesuai, 'meta.last_page' tidak ditemukan.");
}
$totalPages = $firstPageData['meta']['last_page'];
echo "Ditemukan total {$totalPages} halaman.\n\n";
} catch (Exception $e) {
die("Error: " . $e->getMessage() . "\n");
}
// --- Langkah 2: Buat nama file CSV secara dinamis ---
$startPage = 1;
$source = 'JDIHN';
// Bersihkan nama dokumen untuk digunakan sebagai nama file
$fileNameSafe = str_replace([' ', '/'], '_', $jenisName);
$outputFile = $jenisId . '_' . $fileNameSafe . '_page_' . $startPage . '_' . $totalPages . '_' . $source . '.csv';
echo "Membuka file CSV untuk ditulis: {$outputFile}\n";
$handle = fopen($outputFile, 'w');
if ($handle === false) {
die("Gagal membuka file {$outputFile} untuk ditulis. Periksa izin penulisan folder.\n");
}
// Tentukan header kolom CSV
$csvHeader = [
'judul', 'nomor', 'id_anggota', 'id_dokumen', 'hit_see', 'hit_download',
'jenis_peraturan_id', 'jenis_peraturan_second_id', 'jenis_peraturan_parent_id', 'jenis_peraturan_name',
'jenis_peraturan_status', 'jenis_peraturan_created_by', 'jenis_peraturan_updated_by',
'jenis_peraturan_created_time', 'jenis_peraturan_updated_time', 'jenis_peraturan_setPublish',
'tahun_terbit', 'instansi', 'download'
];
// Tulis header ke file CSV
fputcsv($handle, $csvHeader);
// --- Langkah 3: Looping melalui semua halaman dan tulis data ---
for ($page = $startPage; $page <= $totalPages; $page++) {
echo "Memproses halaman {$page} dari {$totalPages}... ";
$pageContent = @file_get_contents($baseUrl . $page);
if ($pageContent === false) {
echo "[GAGAL] Tidak dapat mengambil halaman {$page}. Melewati.\n";
continue;
}
$pageData = json_decode($pageContent, true);
if (json_last_error() !== JSON_ERROR_NONE || !isset($pageData['data'])) {
echo "[GAGAL] Gagal mem-parsing JSON pada halaman {$page}. Melewati.\n";
continue;
}
$itemsOnPage = count($pageData['data']);
foreach ($pageData['data'] as $item) {
$csvRow = [
$item['judul'] ?? '', $item['nomor'] ?? '', $item['id_anggota'] ?? '', $item['id_dokumen'] ?? '',
$item['hit_see'] ?? '', $item['hit_download'] ?? '',
$item['jenis_peraturan']['id'] ?? '', $item['jenis_peraturan']['second_id'] ?? '',
$item['jenis_peraturan']['parent_id'] ?? '', $item['jenis_peraturan']['name'] ?? '',
$item['jenis_peraturan']['status'] ?? '', $item['jenis_peraturan']['_created_by'] ?? '',
$item['jenis_peraturan']['_updated_by'] ?? '', $item['jenis_peraturan']['_created_time'] ?? '',
$item['jenis_peraturan']['_updated_time'] ?? '', $item['jenis_peraturan']['setPublish'] ?? '',
$item['tahun_terbit'] ?? '', $item['instansi'] ?? '', $item['download'] ?? ''
];
fputcsv($handle, $csvRow);
}
echo "[SUKSES] ({$itemsOnPage} item ditambahkan)\n";
sleep(1);
}
// --- Langkah 4: Tutup file dan selesai ---
fclose($handle);
echo "\nProses selesai! Semua data telah disimpan dalam file '{$outputFile}'.\n";
?>
Hasilnya:
Enak pakai CSV atau supabase?


Top comments (0)