Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
500 artikel
- 05.04backend
Scraping Lewat Panel Preview: Sesi Adalah Kredensial
Sesi panel preview adalah kredensial scraping: token URL berotasi, klik gagal palsu, dan CDP sengaja mati.
TL;DR: Sesi di panel itu ternyata kredensialnya, bukan sekadar alat bantu—fetch URL sama dari luar cuma dapat captcha interstitial terus. Token tiap halaman juga berotasi, jadi navigasi mesti digerakkan klik beneran, nggak bisa asal susun URL sendiri. Hasilnya? 4.828 perkara kepailitan sukses ditarik dari portal Jakarta Pusat, padahal awalnya sering gagal gara-gara gerbang anti-bot.
#scraping#browser-automation#captcha - 04.22backend
GraphQL dari Bundle Situs: 7 Permintaan Ganti 533 Halaman
Menemukan endpoint GraphQL situs dari bundle JS publik: dataset 5330 baris cukup 7 permintaan, bukan 533 halaman HTML.
TL;DR: Awalnya penulis kira harus scraping 533 halaman HTML tiap hari, ternyata dugaan itu meleset total. Setelah intip file JavaScript situsnya, ketemu API GraphQL GetBlacklists yang bisa ambil data tanpa login sama sekali. Cuma butuh 7 request sekitar 10 detik buat dapetin 5330 baris, parsing HTML pun langsung dipensiunkan deh.
#scraping#graphql#nextjs - 04.17backend
Stealth Proxy Tidak Bisa Membeli Captcha yang Mengukur Browser
Stealth proxy lolos WAF tapi tewas di gerbang captcha yang mengukur browser.
TL;DR: Stealth proxy cuma ampuh buat WAF biasa, soalnya gerbang captcha gak bisa dibohongin. Cloudflare Turnstile di Jakarta Selatan lolos sendiri pake Chromium asli, sementara reCAPTCHA v2 dijakpus kena pake Firefox anti-detect, tinggal tekan Tab-Spasi doang. Detail perkara butuh sesi aktif, makanya strategi scraping dirombak jadi tiga tingkat biar hasilnya lebih stabil.
#scraping#captcha#browser-automation - 03.23backend
Tiga Pintu Registri Publik Sebelum Menulis Scraper
Probe sembilan host registri publik: dua terbuka, satu captcha, dua WAF. Kenali tiga pola gerbang akses sebelum menulis satu baris scraper.
TL;DR: Dikira semua portal SIPP struktur sama, ternyata beda-beda: ada yang kebuka, kena captcha, ditolak 403, bahkan koneksi ditolak. Jadi tiap host dites satu GET sopan, responsnya disimpen jadi fixture biar server nggak kebanyakan request. Host yang nolak nggak dilawan, cukup dicatat, dan perkara pailit/PKPU diklasifikasiin lokal soalnya token menunya nggak nge-filter beneran.
#scraping#open-data#sipp - 03.20backend
Menyusun Pilot Ingest Sinyal Harian dari Registri Publik
Dua registri publik lolos probe: susun scraper atas satu seam, paksa idempotensi lewat content hash, dan jadwalkan ingest harian pukul lima pagi.
TL;DR: Jadi intinya pilot ini ngambil data harian dari daftar hitam LKPP sama daftar perkara pailit/PKPU pengadilan, semua scraper lewat satu antarmuka yang sama. Biar nggak dobel, tiap sinyal dikasih hash, database nolak kalau udah masuk, jadi aman dijalan ulang kapan aja. Ingestnya sekali sehari jam lima pagi, sopan dikit, dikasih jeda antar request biar servernya nggak keberatan.
#scraping#open-data#automation - 02.48backend
Sensus 348 Endpoint SIPP Sebelum Membangun Scraper
Perencanaan scraper dari tebakan endpoint gagal cepat: sensus 348 endpoint SIPP dan 12 sumber resmi jadi fondasi sebelum satu baris pengambil data ditulis.
TL;DR: Asumsi ada satu API pusat ternyata meleset total, tiap pengadilan negeri punya SIPP sendiri-sendiri dan dijaga reCAPTCHA pula. Sensus Oktober nemu 348 dari 350 endpoint aktif plus 12 sumber resmi lain, eksekusinya bertahap mulai dari daftar hitam LKPP yang termurah. Sinyalnya kebaca kayak kurva: sanksi pengadaan, permohonan pailit, terus pengumuman kurator.
#scraping#open-data#sipp - 23.53security
Rate Limit Saja Tidak Cukup: Dummy Hash untuk Login
Dua lapis pertahanan endpoint login: sliding window per IP dan per akun, plus ekualisasi waktu dengan dummy hash bcrypt.
TL;DR: Endpoint login DemandScope tadinya gampang dibobol karena tanpa batas percobaan dan responsnya lebih cepat buat email yang nggak terdaftar. Solusinya dua lapis: rate limit berbasis sliding window pakai IP asli, plus hashing bcrypt dummy biar waktu respons nggak membocorkan keberadaan akun. Bonusnya, /docs ditutup di produksi dan duplikat email kini balas HTTP 409.
#security#fastapi#python - 23.04backend
CI merah karena schema kosong: migrasi dulu, baru pytest
Pipeline CI gagal pada database service yang masih kosong; satu baris alembic upgrade head sebelum pytest menyelaraskan kontrak CI dengan container produksi.
TL;DR: Pipeline CI jadi merah gara-gara database kosong, bukan karena kode error—ternyata migrasi nggak pernah jalan di CI. Solusinya gampang, tinggal tambahin alembic upgrade head sebelum pytest biar urutannya sama kayak produksi: schema dulu, baru tes. Sekarang error yang muncul beneran nunjukin bug kode, bukan tabel yang belum dibuat, jadi debugging nggak buang waktu lagi.
#ci#alembic#pytest - 23.01backend
Sweep ruff tiga lapis: alias UTC, isort, artefak build
Satu sweep ruff ternyata menyentuh tiga lapis: alias datetime.UTC, blok TYPE_CHECKING plus batas isort alembic, dan artefak build yang merusak image.
TL;DR: Jadi pas sweep ruff di pipeline CI, build Docker tiba-tiba gagal gara-gara error flat-layout. Ternyata urusannya tiga lapis: ganti datetime.now(timezone.utc) jadi datetime.now(UTC), atur klasifikasi import isort biar alembic dikenali, dan bersihkan folder build yang numpuk di image. Setelah semua beres plus konfigurasi pyproject.toml, pipeline balik hijau deh.
#python#ruff#isort