Angka tiga digit yang tampil di atas grid 3×3 pada BLS CAPTCHA — misalnya 664 atau 123 — bukan angka acak. Itu kode instruksi: penanda sel mana dari sembilan gambar yang harus dipilih. Begitu kode dan kesembilan gambar berhasil diekstrak dari halaman, seluruh proses pencocokan dan pemilihan sel bisa dijalankan otomatis lewat API, tanpa campur tangan manual. BLS termasuk salah satu dari 15+ tipe CAPTCHA yang didukung CaptchaAI (12 tipe GA, termasuk BLS, plus 3 tipe beta), dengan tingkat keberhasilan tinggi pada tipe yang didukung. Panduan ini membahas cara mengekstrak grid gambar dan kode instruksi, mengirimkannya ke CaptchaAI, membaca array indeks sel dari respons, lalu mengklik sel yang tepat memakai Selenium atau Puppeteer — lengkap dengan fungsi siap pakai di bagian akhir.
Cara kerja BLS CAPTCHA: grid 3×3 dan kode instruksi
BLS CAPTCHA menampilkan sembilan gambar dalam grid 3×3, plus kode instruksi numerik di atasnya. Nomor sel mengikuti urutan baca standar — kiri ke kanan, atas ke bawah:
1 2 3
4 5 6
7 8 9
Kode instruksi (misalnya 664, 123, 546) menentukan pola atau konten yang harus dicocokkan pada kesembilan gambar. Solver perlu mencocokkan kode ini dengan isi gambar, lalu mengembalikan array indeks sel (1–9) yang sesuai — itulah bagian yang dikerjakan CaptchaAI di Langkah 2.
Kenapa BLS CAPTCHA butuh pipeline API, bukan solve manual
Tim automation dan QA di Indonesia — termasuk kontraktor lepas yang mengerjakan proyek scraping dan price monitoring lewat Upwork maupun Fastwork — biasanya menjalankan environment staging yang meniru halaman produksi berisi BLS CAPTCHA. Menyelesaikannya satu per satu secara manual jelas tidak scalable begitu volume task naik. Alur ekstrak → kirim → polling → klik pada panduan ini dirancang untuk berjalan headless, cocok dipasang di worker yang di-deploy di region seperti AWS ap-southeast-1 (Singapura) atau GCP asia-southeast2 (Jakarta) demi latensi rendah ke API CaptchaAI. Karena CaptchaAI menagih per thread aktif — bukan per solve — biaya tetap flat berapa pun jumlah task BLS CAPTCHA yang diproses dalam sebulan: paket BASIC ($15/bulan, 5 thread) sudah cukup untuk uji coba, tim dengan volume lebih besar biasanya naik ke ADVANCE ($90/bulan, 50 thread).
Langkah 1: Ambil grid gambar dan kode instruksi BLS CAPTCHA
Sebelum mengirim apa pun ke API, ambil dulu kesembilan gambar grid dan teks kode instruksi dari DOM halaman. Kalau elemen gambar memakai atribut src eksternal (bukan data URI), unduh dan konversi ke base64 di sisi server — cara ini juga mencegah masalah cross-origin yang sering muncul di Langkah 3.
Python (Selenium)
import base64
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/bls-protected-page")
# Find the grid container
grid_cells = driver.find_elements(By.CSS_SELECTOR, ".captcha-grid img")
images = []
for cell in grid_cells:
src = cell.get_attribute("src")
if src.startswith("data:image"):
images.append(src)
else:
# Download and convert to base64
import requests
img_data = requests.get(src).content
b64 = base64.b64encode(img_data).decode()
images.append(f"data:image/png;base64,{b64}")
# Extract the instruction code
instruction_el = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction")
instruction_code = instruction_el.text.strip()
# e.g., "664" or parsed from "Select all boxes with number 664"
import re
code_match = re.search(r'(\d{3,})', instruction_code)
instruction = code_match.group(1) if code_match else instruction_code
print(f"Instruction: {instruction}")
print(f"Images extracted: {len(images)}")
JavaScript (Puppeteer)
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com/bls-protected-page');
// Extract grid images as base64
const images = await page.evaluate(() => {
const cells = document.querySelectorAll('.captcha-grid img');
return Array.from(cells).map(img => {
const canvas = document.createElement('canvas');
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
canvas.getContext('2d').drawImage(img, 0, 0);
return canvas.toDataURL('image/png');
});
});
// Extract instruction code
const instruction = await page.evaluate(() => {
const el = document.querySelector('.captcha-instruction');
const match = el.textContent.match(/(\d{3,})/);
return match ? match[1] : el.textContent.trim();
});
console.log(`Instruction: ${instruction}, Images: ${images.length}`);
Setelah instruction dan images terkumpul, keduanya siap dikirim ke endpoint CaptchaAI di langkah berikut.
Langkah 2: Kirim task BLS CAPTCHA ke API CaptchaAI
Solver BLS memerlukan tiga hal dalam satu request:
- field
methoddiisibls - kode
instructionsyang sudah diekstrak di Langkah 1 - kesembilan gambar sebagai field
image_base64_1sampaiimage_base64_9
Setelah submit berhasil, simpan task_id dari respons lalu polling res.php sampai statusnya berubah dari CAPCHA_NOT_READY menjadi hasil final. Pola kirim → simpan task ID → polling → pakai hasil ini konsisten di semua tipe CAPTCHA CaptchaAI, bukan cuma BLS.
Python
import requests
import time
import json
API_KEY = "YOUR_API_KEY"
# Prepare submission data
data = {
"key": API_KEY,
"method": "bls",
"instructions": instruction,
"json": "1",
}
# Add all 9 images
files = {}
for i, img in enumerate(images):
files[f"image_base64_{i+1}"] = (None, img)
# Submit
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data=data,
files=files
).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
print(f"Task ID: {task_id}")
# Poll for result
for _ in range(20):
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["status"] == 1:
solution = json.loads(result["request"])
print(f"Selected cells: {solution}") # e.g., [1, 4, 7, 8]
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
JavaScript
const axios = require('axios');
const FormData = require('form-data');
const form = new FormData();
form.append('key', 'YOUR_API_KEY');
form.append('method', 'bls');
form.append('instructions', instruction);
form.append('json', '1');
images.forEach((img, i) => {
form.append(`image_base64_${i + 1}`, img);
});
const submit = await axios.post('https://ocr.captchaai.com/in.php', form, {
headers: form.getHeaders(),
});
const taskId = submit.data.request;
// Poll
let solution = null;
for (let i = 0; i < 20; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (poll.data.status === 1) {
solution = JSON.parse(poll.data.request);
break;
}
}
console.log('Selected cells:', solution); // e.g., [2, 4, 7]
Langkah 3: Klik sel yang benar dan submit form
Respons CaptchaAI berupa array indeks sel, misalnya [1, 4, 7, 8]. Karena penomoran di sini 1-based sedangkan elemen array DOM bersifat 0-based, kurangi 1 dari tiap indeks sebelum memilih elemennya — detail kecil ini penyebab paling umum kalau sel yang terklik ternyata salah.
# Selenium — click the cells returned by CaptchaAI
grid_cells = driver.find_elements(By.CSS_SELECTOR, ".captcha-grid .cell")
for cell_index in solution:
# cell_index is 1-based
grid_cells[cell_index - 1].click()
# Submit the form
submit_btn = driver.find_element(By.CSS_SELECTOR, ".captcha-submit")
submit_btn.click()
// Puppeteer
const cells = await page.$$('.captcha-grid .cell');
for (const idx of solution) {
await cells[idx - 1].click();
}
await page.click('.captcha-submit');
Alur kerja lengkap: fungsi solve_bls_captcha() siap pakai
Fungsi berikut merangkum keempat langkah di atas — ekstraksi, submit ke CaptchaAI, polling, dan klik — jadi satu pemanggilan. Cocok dipasang langsung di pipeline scraping atau QA Anda:
def solve_bls_captcha(driver, api_key):
"""Extract, solve, and submit a BLS CAPTCHA."""
import base64, requests, time, json, re
# 1. Extract images
grid_cells = driver.find_elements(By.CSS_SELECTOR, ".captcha-grid img")
images = []
for cell in grid_cells:
src = cell.get_attribute("src")
if src.startswith("data:image"):
images.append(src)
else:
img_data = requests.get(src).content
b64 = base64.b64encode(img_data).decode()
images.append(f"data:image/png;base64,{b64}")
# 2. Extract instruction
el = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction")
match = re.search(r'(\d{3,})', el.text)
instruction = match.group(1)
# 3. Submit to CaptchaAI
data = {"key": api_key, "method": "bls", "instructions": instruction, "json": "1"}
files = {f"image_base64_{i+1}": (None, img) for i, img in enumerate(images)}
resp = requests.post("https://ocr.captchaai.com/in.php", data=data, files=files).json()
task_id = resp["request"]
# 4. Poll
for _ in range(20):
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["status"] == 1:
solution = json.loads(result["request"])
break
# 5. Click cells
clickable = driver.find_elements(By.CSS_SELECTOR, ".captcha-grid .cell")
for idx in solution:
clickable[idx - 1].click()
return solution
Kesalahan umum saat menyelesaikan BLS CAPTCHA
Empat masalah berikut paling sering muncul saat mengintegrasikan BLS CAPTCHA, beserta cara memperbaikinya:
| Masalah | Penyebab | Solusi |
|---|---|---|
ERROR_BAD_PARAMETERS |
Gambar hilang atau tidak ada instruksi | Pastikan kesembilan gambar merupakan URI data base64 yang valid |
| Sel yang salah dipilih | Pemetaan sel-ke-indeks salah | Pastikan sel diberi nomor 1–9 dari kiri ke kanan, atas ke bawah |
| Gambar tidak dimuat | Pembatasan cross-origin | Unduh gambar di sisi server dan konversikan ke base64 |
| Kode instruksi kosong | Instruksi disembunyikan dalam gambar | Ekstrak teks instruksi atau OCR gambar instruksi |
Pertanyaan seputar BLS CAPTCHA
Apa arti kode instruksi pada BLS CAPTCHA?
Kode instruksi (misalnya "664") menandai pola atau konten yang harus dicocokkan pada kesembilan gambar grid. Anda tidak perlu menafsirkannya sendiri — kirim kode dan gambar ke CaptchaAI, sistem yang mencocokkan dan mengembalikan indeks sel yang benar.
Apakah CaptchaAI bisa menyelesaikan BLS CAPTCHA secara otomatis penuh?
Ya. BLS termasuk salah satu dari 12 tipe CAPTCHA GA yang didukung CaptchaAI — kirim gambar dan kode instruksi lewat method=bls, dan API mengembalikan array indeks sel tanpa perlu solver manusia di sisi Anda.
Berapa lama CaptchaAI menyelesaikan satu task BLS CAPTCHA?
Berdasarkan data solve time CaptchaAI:
- BLS CAPTCHA biasanya selesai di bawah 1 detik per task
- Tingkat keberhasilan tergolong tinggi pada tipe yang didukung
- Loop polling berjeda 5 detik pada contoh kode di atas lebih dari cukup untuk sebagian besar task
Kenapa sel yang diklik CaptchaAI kadang salah?
Dua penyebab paling umum:
- Pemetaan indeks yang keliru — pastikan sel di DOM Anda diberi nomor 1–9 dari kiri ke kanan, atas ke bawah, dan indeks dari respons (1-based) dikurangi 1 sebelum dipakai memilih elemen array
- Gambar gagal dimuat karena pembatasan cross-origin — unduh dan konversi ke base64 di sisi server seperti pada Langkah 1
Selesaikan BLS CAPTCHA Pertama Anda dengan CaptchaAI
Yang Anda dapat begitu daftar:
- API key aktif di captchaai.com, siap dipakai di kode Python maupun Node.js pada panduan ini
- Akses ke endpoint
in.php/res.phpyang sama untuk BLS dan seluruh tipe CAPTCHA lain yang didukung CaptchaAI - Paket thread-based mulai BASIC ($15/bulan, 5 thread) — tanpa biaya per solve
Panduan CAPTCHA lainnya
Untuk pendalaman lebih jauh soal BLS CAPTCHA, baca deep-dive parameter kode instruksi BLS CAPTCHA atau cara menangani urutan gambar dan respons grid BLS CAPTCHA. Kalau API mengembalikan status gagal di luar tabel Kesalahan Umum di atas, cek daftar lengkap kode error CaptchaAI.