Di portal janji temu visa dan layanan imigrasi, menyelesaikan BLS CAPTCHA justru bagian yang paling mudah — CaptchaAI mengembalikan jawabannya lewat API dalam hitungan detik. Bagian yang sering menggagalkan otomatisasi ada sesudahnya: menjaga sesi tetap hidup, membawa token CSRF yang benar, dan mengirim formulir sebelum slot atau sesi kedaluwarsa.
Panduan ini menunjukkan cara menyelesaikan BLS CAPTCHA dengan tingkat keberhasilan tinggi pada tipe yang didukung, sekaligus pola alur yang membuat pengiriman formulir portal pemerintah benar-benar tembus. Contoh kode memakai Python (requests) dan Puppeteer. Untuk tim di Indonesia yang deploy ke region seperti ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta), latensi rendah ke portal ikut membantu merampungkan seluruh alur dalam satu jendela sesi.
Intinya: selesaikan CAPTCHA di saat-saat terakhir, pertahankan satu sesi tetap hidup, dan pastikan setiap POST membawa token CSRF beserta seluruh field tersembunyinya.
Bentuk tantangan BLS CAPTCHA
BLS CAPTCHA bukan satu jenis tunggal. Di lapangan Anda akan bertemu beberapa bentuk sekaligus:
- Gambar berisi teks terdistorsi yang harus dibaca
- Soal ekspresi matematika sederhana
- Tugas memilih gambar tertentu
- Teka-teki berbasis teks
Setiap bentuk butuh kode instructions yang berbeda — parameter inilah yang memberi tahu CaptchaAI cara memperlakukan gambar, misalnya membaca teks atau menghitung hasil. Mengirim instructions yang tepat sering lebih menentukan hasil daripada kualitas gambarnya.
Di mana BLS CAPTCHA muncul di portal pemerintah
BLS CAPTCHA hampir selalu dipasang di titik dengan permintaan tinggi, tepat sebelum aksi yang ingin dilindungi dari otomatisasi massal:
- Pemesanan janji temu visa — sebelum pemilihan slot, agar slot tidak diambil secara massal.
- Formulir unggah dokumen — sebelum penyerahan, untuk memastikan ada interaksi manusia.
- Cek status janji temu — sebelum status ditampilkan, untuk membatasi laju pengecekan otomatis.
- Formulir aplikasi — sebelum formulir dikirim, untuk mencegah pengiriman otomatis.
Menjaga sesi portal tetap valid
Sebelum masuk ke kode, pahami dulu aturan sesi yang diberlakukan portal pemerintah — inilah yang paling sering membuat pengiriman gagal, bukan CAPTCHA-nya:
| Yang harus dijaga | Cara menerapkannya |
|---|---|
| Cookie terbawa persis | Pakai requests.Session() atau konteks browser persisten |
| Tidak melampaui batas laju | Beri jeda 2–5 detik antar pemuatan halaman |
| Token CSRF ikut terkirim | Ekstrak token CSRF dan sertakan di setiap POST |
| Alur selesai sebelum sesi habis | Rampungkan seluruh alur dalam jendela sesi |
| Rantai redirect diikuti | Izinkan redirect otomatis di klien HTTP Anda |
Menyelesaikan BLS CAPTCHA lewat API CaptchaAI
Alurnya mengikuti pola CaptchaAI yang sama di semua tipe:
- Ambil gambar CAPTCHA dari halaman portal.
- Kirim ke
in.php, lalu simpan task ID yang dikembalikan. - Polling
res.phpsampai jawaban siap. - Tempelkan jawaban ke formulir dan kirim dengan sesi yang sama.
Tiga langkah kode berikut memakai satu requests.Session() supaya cookie portal terbawa utuh dari awal sampai pengiriman.
Langkah 1: ambil gambar dan petunjuk CAPTCHA
Muat halaman portal, temukan elemen gambar CAPTCHA, lalu ubah menjadi base64 — baik dari data URI inline maupun dari URL terpisah:
import requests
from bs4 import BeautifulSoup
import base64
session = requests.Session()
# Load the portal page
page = session.get("https://portal.example.gov/appointment")
soup = BeautifulSoup(page.text, "html.parser")
# Find the CAPTCHA image
captcha_img = soup.select_one("img#captcha-image, img.captcha")
captcha_url = captcha_img["src"]
# Download the CAPTCHA image
if captcha_url.startswith("data:"):
# Base64 encoded inline image
img_data = captcha_url.split(",")[1]
else:
# URL-referenced image
img_response = session.get(captcha_url)
img_data = base64.b64encode(img_response.content).decode()
Langkah 2: kirim ke CaptchaAI dan polling hasilnya
Kirim gambar base64 ke in.php, simpan task ID, lalu polling res.php sampai status bernilai 1. Fungsi berikut polling tiap 3 detik dengan batas aman agar tidak menggantung selamanya:
import time
def solve_bls_captcha(image_base64, instructions=""):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "base64",
"body": image_base64,
"instructions": instructions,
"json": 1
})
task_id = resp.json()["request"]
for _ in range(30):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("BLS solve timed out")
# Solve
captcha_answer = solve_bls_captcha(img_data)
Langkah 3: kirim formulir dengan sesi yang sama
Tempelkan jawaban ke field CAPTCHA, lengkapi field formulir lain, lalu POST memakai session yang sama supaya cookie dan status login tetap konsisten:
# Find form fields
form_data = {
"captcha_response": captcha_answer,
"appointment_type": "visa",
"location": "embassy-city",
# ... other form fields
}
# Submit with the same session (cookies preserved)
result = session.post(
"https://portal.example.gov/appointment/submit",
data=form_data
)
if "success" in result.text.lower():
print("Form submitted successfully")
Pola alur khas portal pemerintah
Menyelesaikan CAPTCHA saja jarang cukup. Portal pemerintah punya beberapa pola alur yang perlu ditangani secara eksplisit agar formulir tidak ditolak di detik terakhir.
Pola 1: formulir multi-langkah
Banyak portal memecah proses menjadi beberapa langkah dan baru memunculkan CAPTCHA di langkah terakhir. Jaga urutan POST-nya tetap dalam satu sesi:
# Step 1: Select service type
session.post(url, data={"service": "passport"})
# Step 2: Fill personal details
session.post(url, data={"name": "...", "dob": "..."})
# Step 3: Select appointment slot
session.post(url, data={"slot": "2026-04-10-09:00"})
# Step 4: Solve CAPTCHA and confirm
captcha_answer = solve_bls_captcha(get_captcha_image(session))
session.post(url, data={"captcha": captcha_answer, "confirm": "true"})
Pola 2: CAPTCHA di-refresh setiap jawaban salah
Kalau jawaban salah, portal biasanya membuang CAPTCHA lama dan membuat yang baru. Jangan mengirim ulang jawaban yang sama — ambil gambar segar di setiap percobaan:
max_attempts = 3
for attempt in range(max_attempts):
# Get fresh CAPTCHA for each attempt
captcha_image = get_captcha_image(session)
answer = solve_bls_captcha(captcha_image)
result = session.post(submit_url, data={"captcha": answer})
if "incorrect" not in result.text.lower():
break
print(f"Attempt {attempt + 1} — CAPTCHA refreshed, retrying")
Pola 3: sesi dengan batas waktu
Sesi portal kerap berakhir setelah beberapa menit. Pantau umur sesi dan siapkan sesi baru sebelum kedaluwarsa, apalagi jika langkah-langkah sebelumnya memakan waktu:
import time
session_start = time.time()
SESSION_TIMEOUT = 600 # 10 minutes typical
def check_session_valid():
elapsed = time.time() - session_start
if elapsed > SESSION_TIMEOUT - 60: # 1 min safety margin
print("Session expiring — refresh needed")
return False
return True
# Before CAPTCHA submission
if not check_session_valid():
# Start a fresh session
session = requests.Session()
session.get(portal_url)
session_start = time.time()
Alternatif: otomatisasi browser dengan Puppeteer
Sebagian portal berat dengan JavaScript atau punya validasi sisi klien yang rumit. Untuk kasus itu, jalankan browser sungguhan, ambil gambar CAPTCHA dari canvas, selesaikan lewat CaptchaAI, lalu ketikkan jawabannya:
const puppeteer = require('puppeteer');
async function handleBLSPortal() {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://portal.example.gov/appointment');
// Wait for CAPTCHA to load
await page.waitForSelector('img#captcha-image');
// Get CAPTCHA image as base64
const imgBase64 = await page.evaluate(() => {
const img = document.querySelector('img#captcha-image');
const canvas = document.createElement('canvas');
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
return canvas.toDataURL('image/png').split(',')[1];
});
// Solve with CaptchaAI
const answer = await solveBLSCaptcha(imgBase64);
// Type the answer
await page.type('#captcha-input', answer);
// Submit
await page.click('#submit-button');
// Wait for result
await page.waitForNavigation();
}
Catatan kepatuhan untuk data portal pemerintah
Otomatisasi portal pemerintah menyentuh data yang sensitif, jadi batasi cakupannya pada portal yang memang Anda kelola atau yang secara sah boleh Anda otomatiskan — misalnya alur milik sendiri, lingkungan staging, atau proses yang sudah berizin. Sesuai UU Pelindungan Data Pribadi (UU 27/2022), olah hanya data yang berhak Anda proses dan hindari mengumpulkan data pribadi pihak lain tanpa dasar yang sah. Ini bukan nasihat hukum, melainkan soal menjaga ruang lingkup teknis tetap sehat.
Pertanyaan umum
Apa fungsi kode instructions pada BLS CAPTCHA?
Kode instructions memberi tahu CaptchaAI cara memperlakukan gambar — membaca teks, menghitung ekspresi matematika, atau memilih objek tertentu. Untuk teks terdistorsi biasa, instructions boleh dikosongkan; untuk bentuk lain, kirim petunjuk yang sesuai agar jawaban yang kembali benar-benar relevan.
Berapa lama satu BLS CAPTCHA diselesaikan?
Pada tipe yang didukung, CaptchaAI mengembalikan jawaban BLS dalam waktu di bawah 1 detik. Secara end-to-end Anda tetap perlu menganggarkan beberapa detik, karena polling di contoh kode berjalan tiap 3 detik ditambah latensi jaringan. Rampungkan solve tepat sebelum submit supaya tidak kehabisan jendela sesi.
Paket CaptchaAI mana yang cukup untuk beban portal?
Ukurannya adalah berapa banyak sesi yang Anda proses secara bersamaan, bukan jumlah CAPTCHA:
- BASIC ($15/bulan, 5 thread) — pengisian formulir sesekali atau satu-dua sesi sekaligus.
- ADVANCE ($90/bulan, 50 thread) — banyak sesi portal berjalan paralel.
Penagihan berbasis thread dengan solve tak terbatas per thread, jadi biaya tetap prediktabel berapa pun jumlah CAPTCHA yang diselesaikan.
Kenapa jawaban sudah benar tapi formulir tetap ditolak?
Hampir selalu karena token CSRF atau field tersembunyi yang belum ikut terkirim. Portal pemerintah memvalidasi keduanya di sisi server, jadi ekstrak seluruh input tersembunyi dari HTML formulir dan sertakan di POST — bukan hanya field CAPTCHA.
Mengatasi masalah yang sering muncul
| Masalah | Penyebab | Solusi |
|---|---|---|
| "Sesi kedaluwarsa" setelah solve | Terlalu lama antara solve dan submit | Selesaikan CAPTCHA tepat sebelum pengiriman |
| Gambar CAPTCHA gagal dimuat | Butuh header Referer tertentu | Set Referer ke URL halaman portal |
| Jawaban benar tapi formulir ditolak | Token CSRF hilang atau field tersembunyi kosong | Ekstrak semua input tersembunyi dari formulir |
| Portal memblokir setelah beberapa percobaan | Pembatasan laju permintaan | Perlambat laju, beri jeda lebih panjang, dan hormati batas laju portal |
| CAPTCHA berganti tiap permintaan | Portal membuat CAPTCHA baru per request | Ambil gambar segar dan selesaikan tiap kali |
Artikel terkait
- Panduan langkah demi langkah menyelesaikan BLS CAPTCHA
- Menyelesaikan BLS CAPTCHA dengan Node.js
Langkah selanjutnya
Siap menangani BLS CAPTCHA di portal pemerintah? Ambil kunci API CaptchaAI Anda dan selesaikan CAPTCHA pertama dengan tingkat keberhasilan tinggi pada tipe yang didukung.