Task BLS CAPTCHA gagal, dan pertanyaan pertamanya bukan "kenapa CaptchaAI menolaknya?" — tapi "apakah ini bug di kode ekstraksi saya, atau masalah di sisi API?" BLS memakai implementasi kustom yang berbeda dari reCAPTCHA atau Turnstile, jadi sebagian besar kegagalan berasal dari cara gambar dan instruksi diambil dari halaman, bukan dari respons CaptchaAI. Panduan ini memetakan kesalahan paling umum per tahap alur kerja — kirim, ekstrak, terapkan, batas waktu — dengan tabel diagnosis cepat di atas supaya Anda langsung ke akar masalah.
Diagnosis cepat: mulai dari sini
Sebelum menelusuri kategori kesalahan di bawah, jalankan tujuh pengecekan ini. Sebagian besar kasus BLS CAPTCHA yang gagal langsung ketahuan akar masalahnya dari tabel ini saja.
| Periksa | Tindakan |
|---|---|
| Instruksi sudah diekstraksi? | Cetak teks instruksi di terminal, bandingkan dengan yang tampil di browser |
| Gambar base64 valid? | Simpan string base64 ke file .png lalu buka untuk memverifikasi isinya |
| Jumlah gambar sudah benar? | Bandingkan jumlah image_base64_N yang dikirim vs jumlah gambar yang tampil di grid |
| Urutan gambar sudah cocok? | Verifikasi urutan DOM sama dengan urutan tampilan visual |
| Awalan data URI sudah dihapus? | Pastikan tidak ada data:image/...;base64, yang ikut terkirim |
| Format solusi sudah dipahami? | result["request"] adalah string indeks berbasis 1 dipisah koma |
| Konversi indeks sudah benar? | Kurangi 1 sebelum dipakai untuk akses elemen array |
Kalau ketujuh baris ini sudah beres tapi errornya tetap muncul, lanjut ke kategori yang paling relevan dengan pesan error yang Anda lihat.
Kesalahan saat mengirim task ke API
Tiga error ini muncul langsung di respons in.php, sebelum task sempat masuk antrean pemrosesan CaptchaAI.
ERROR_BAD_PARAMETERS
Kode ini muncul saat parameter wajib tidak dikirim — paling sering instruksi tantangan yang hilang, kadang gambarnya sendiri yang tidak ada. CaptchaAI memvalidasi parameter sebelum task masuk antrean, jadi error langsung balik di respons in.php, tanpa perlu menunggu polling.
# WRONG — missing instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "bls",
"image_base64_1": img1, "json": 1
})
# CORRECT — include instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "bls",
"instructions": "Select all images with a car",
"image_base64_1": img1, "json": 1
})
ERROR_WRONG_FILE_EXTENSION
Data gambar yang dikirim bukan base64 yang valid, atau formatnya tidak didukung. Biasanya penyebabnya awalan data URI yang ikut terkirim atau string base64 yang terpotong karena batas panjang pada payload.
Cara memastikannya bersih:
- Pastikan gambar berkode base64 PNG atau JPEG
- Hapus awalan
data:image/...;base64, - Pastikan string base64 tidak terpotong
import base64
# Strip the data URI prefix
src = img_element.get_attribute("src")
if src.startswith("data:image"):
b64 = src.split(",")[1]
else:
# Download and encode
img_data = requests.get(src).content
b64 = base64.b64encode(img_data).decode()
ERROR_CAPTCHA_UNSOLVABLE
Kualitas gambar terlalu rendah, buram, atau instruksinya ambigu. Ini bukan selalu kesalahan kode Anda — beberapa instance BLS memang lebih sulit dibaca secara visual, termasuk oleh manusia. Agen visa dan biro perjalanan Indonesia yang memantau slot janji temu BLS International (Italia, Spanyol, Portugal) sering menemui pola ini saat server merender gambar dengan kompresi lebih agresif di jam sibuk.
- Ambil gambar pada resolusi penuh, jangan resolusi thumbnail
- Pastikan teks instruksi diekstraksi persis, tanpa terpotong
- Coba lagi dengan task baru — beberapa tantangan memang inheren lebih sulit
Kesalahan saat mengekstrak gambar dari halaman
Kalau ketiga error API di atas tidak relevan, masalahnya kemungkinan besar bukan di CaptchaAI, tapi di cara skrip Anda mengambil gambar dari DOM sebelum dikirim.
Gambar belum ada saat halaman pertama kali dimuat
Gambar CAPTCHA belum ada di DOM ketika skrip Anda langsung mencoba mengambilnya — BLS merender grid secara asinkron setelah request awal. Tunggu sampai captcha benar-benar tampil sebelum mengekstrak:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Wait for captcha images to load
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".captcha-image img"))
)
Gambar dirender di elemen canvas, bukan img
Beberapa implementasi BLS menggambar gambar langsung ke elemen <canvas>, jadi tidak ada atribut src untuk diambil. Solusinya, ambil isi canvas sebagai base64 lewat JavaScript:
canvas_elements = driver.find_elements(By.CSS_SELECTOR, ".captcha-canvas")
for i, canvas in enumerate(canvas_elements, 1):
b64 = driver.execute_script(
"return arguments[0].toDataURL('image/png').split(',')[1];",
canvas
)
payload[f"image_base64_{i}"] = b64
Gambar dilindungi anti-hotlinking
URL gambar mengembalikan status 403 saat diambil dari luar konteks browser — misalnya lewat requests.get() langsung. Server BLS memeriksa header referer/cookie sesi yang hanya ada di dalam browser. Ambil gambar dari dalam konteks browser lewat canvas, bukan dengan HTTP request terpisah:
# Get image data from within the browser
b64 = driver.execute_script("""
var img = arguments[0];
var canvas = document.createElement('canvas');
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
canvas.getContext('2d').drawImage(img, 0, 0);
return canvas.toDataURL('image/png').split(',')[1];
""", img_element)
Kesalahan saat menerapkan hasil solusi
CaptchaAI sudah mengembalikan indeks yang benar di titik ini — ketiga pola berikut adalah penyebab paling umum kenapa hasil itu tetap berujung klik yang salah.
Gambar yang diklik salah
Urutan gambar yang dikirim ke CaptchaAI tidak cocok dengan urutan yang tampil di layar, jadi indeks solusi yang dibalikkan menunjuk ke gambar yang salah. Pertahankan urutan yang sama dari ekstraksi sampai klik:
# Ensure images are indexed in display order
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
# The order of find_elements matches DOM order = display order
for i, img in enumerate(captcha_imgs, 1):
payload[f"image_base64_{i}"] = extract_base64(img)
Indeks solusi tidak cocok
CaptchaAI mengembalikan indeks berbasis 1 ("1,3,5"), sementara array di kode Anda berbasis 0. Lupa mengurangi 1 adalah penyebab paling umum dari "solusi benar tapi klik gambar salah":
solution = result["request"] # e.g., "1,3,5"
indices = [int(i) for i in solution.split(",")]
# Convert to 0-based for array access
for idx in indices:
captcha_imgs[idx - 1].click() # 1-based → 0-based
Pengiriman formulir gagal setelah pemilihan benar
Gambar yang diklik sudah tepat, tapi formulir tetap ditolak — biasanya ada token atau field tersembunyi tambahan yang harus ikut terkirim bersama pilihan captcha. Periksa semua input tersembunyi sebelum submit:
# Look for hidden captcha tokens
hidden_fields = driver.find_elements(By.CSS_SELECTOR, "input[type='hidden']")
for field in hidden_fields:
name = field.get_attribute("name")
value = field.get_attribute("value")
print(f"Hidden field: {name}={value}")
Kesalahan batas waktu dan polling
BLS punya jendela validitas lebih ketat dibanding reCAPTCHA atau Turnstile, jadi timeout di sini sering soal arsitektur, bukan bug.
Captcha kedaluwarsa sebelum penyelesaian selesai
BLS CAPTCHA punya masa berlaku singkat, jadi jeda antara ekstraksi gambar dan pengiriman ke CaptchaAI harus seminimal mungkin. Untuk tim yang men-deploy worker di Asia Tenggara — AWS ap-southeast-1 (Singapura) atau GCP asia-southeast2 (Jakarta) — latensi ke server BLS di Eropa memakan jatah waktu ini, jadi arsitektur "ekstrak lalu antre" lebih rawan timeout dibanding "ekstrak lalu langsung kirim".
- Ekstrak gambar dan segera kirim ke CaptchaAI, tanpa jeda
- Jangan mengekstrak gambar lalu menunggu sebelum mengirimkannya
- Jika penyelesaian memakan waktu >60 detik, captcha kemungkinan sudah kedaluwarsa — segarkan halaman dan ulangi dari awal
Polling memakan waktu terlalu lama
Kalau task tidak kunjung selesai, kemungkinan besar pola polling Anda yang salah, bukan CaptchaAI-nya. Pastikan polling dilakukan dengan interval dan batas percobaan yang wajar:
# Standard polling pattern
for _ in range(30): # 30 attempts × 5 seconds = 150 seconds max
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
# Don't keep polling — start over
raise Exception("Unsolvable")
Pertanyaan seputar BLS CAPTCHA
Kenapa ERROR_CAPTCHA_UNSOLVABLE tetap muncul padahal gambar dan instruksi sudah saya periksa?
Kalau gambar sudah resolusi penuh dan instruksi sudah cocok persis dengan yang tampil di browser, penyebabnya biasanya tantangan itu sendiri — sebagian instance BLS memang lebih ambigu secara visual. Buat task baru dan coba lagi; jangan kirim ulang task ID yang sama.
Apa bedanya menangani BLS CAPTCHA dengan reCAPTCHA v2 dari sisi kode?
reCAPTCHA v2 cukup mengirim site key dan menunggu token g-recaptcha-response. BLS tidak punya site key — Anda harus mengekstrak gambar grid dan teks instruksi sendiri dari DOM sebelum mengirim ke in.php, jadi sebagian besar bug ada di tahap ekstraksi, bukan di integrasi API-nya.
Berapa banyak gambar sebaiknya saya kirim untuk satu task BLS CAPTCHA?
Kirim semua gambar yang tampil di grid, biasanya 3 sampai 9 gambar. Gunakan parameter image_base64_1 sampai image_base64_9 sesuai jumlah gambar yang ditampilkan.
Bagaimana memastikan urutan gambar yang saya kirim sama dengan urutan yang dilihat pengguna?
Ambil semua elemen gambar dengan satu pemanggilan find_elements dan pakai urutan array itu apa adanya — urutan DOM pada grid BLS selalu sama dengan urutan tampilan, jadi jangan diurutkan ulang secara manual.
Bagaimana jika instruksi BLS CAPTCHA muncul dalam bahasa selain Inggris?
Kirim teks instruksi persis seperti yang tertampil, tanpa diterjemahkan. CaptchaAI menangani instruksi multibahasa, termasuk bahasa Spanyol, Italia, atau Portugis yang umum muncul di formulir visa Eropa yang diproses lewat BLS.
Panduan terkait
Lanjutkan dengan panduan langkah demi langkah atau daftar kode error lengkap:
Kalau setelah menjalankan tabel diagnosis dan memeriksa kategori yang relevan errornya masih berlanjut, kemungkinan penyebabnya ada di luar kendali kode Anda — buat task baru dengan gambar segar sebelum menghubungi support.