BLS CAPTCHA adalah challenge gambar khusus milik BLS International, dipakai di halaman appointment visa mereka — bukan reCAPTCHA generik, tapi widget custom yang mirip image grid reCAPTCHA: beberapa gambar ditampilkan sekaligus, dan Anda harus memilih yang cocok dengan instruksi teks, misalnya "Pilih semua gambar dengan mobil". Menyelesaikannya secara otomatis mengikuti alur yang sama setiap kali:
- Ambil gambar dan teks instruksi dari halaman.
- Kirim keduanya ke method
blsdi API CaptchaAI. - Polling sampai hasil siap.
- Klik gambar sesuai indeks yang dikembalikan.
Seluruh proses biasanya selesai dalam 15–30 detik. Panduan ini menunjukkan cara menjalankan keempat langkah itu sepenuhnya otomatis dengan Python atau Node.js, tanpa campur tangan manual saat mengisi form appointment.
Contoh di panduan ini memakai domain BLS placeholder. Ganti dengan portal BLS yang benar-benar Anda automasikan, dan pastikan Anda memang berwenang memproses data appointment yang bersangkutan.
Siapa yang biasanya butuh panduan ini? Developer otomatisasi dan agen travel di Indonesia yang mengurus appointment visa Schengen untuk klien — BLS International punya portal terpisah untuk Italia, Spanyol, Prancis, dan negara lain dengan format CAPTCHA yang sama. Memprosesnya manual satu per satu jelas tidak scalable dibanding automation yang andal, terutama untuk klien yang sudah memberi kuasa dan datanya sendiri.
Yang Perlu Disiapkan Sebelum Mulai
Sebelum menulis kode, siapkan empat hal ini:
- API key CaptchaAI — ambil dari captchaai.com sebelum mulai coding.
- Gambar BLS CAPTCHA — di-encode Base64 langsung dari halaman.
- Teks instruksi — string yang memberi tahu gambar mana yang harus dipilih.
- Environment — Python 3.7+ atau Node.js 14+, sesuai stack Anda.
Langkah 1: Ambil Gambar dan Instruksi dari Halaman BLS
Halaman appointment BLS biasanya menampilkan 3 sampai 9 gambar sekaligus, disertai instruksi teks seperti "Pilih semua gambar dengan mobil". Tangkap keduanya — instruksi dan seluruh gambar — sebelum mengirim apa pun ke CaptchaAI, karena API butuh keduanya dalam satu request yang sama.
Menggunakan Selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
import base64
import requests as req
driver = webdriver.Chrome()
driver.get("https://blsitalypakistan.com/appointment")
# Get instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
print(f"Instruction: {instruction}")
# Get all captcha images as base64
images = {}
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
for i, img in enumerate(captcha_imgs, 1):
src = img.get_attribute("src")
if src.startswith("data:image"):
# Already base64
images[f"image_base64_{i}"] = src.split(",")[1]
else:
# Download and encode
img_data = req.get(src).content
images[f"image_base64_{i}"] = base64.b64encode(img_data).decode()
Simpan instruksi dan gambar dalam permintaan yang sama — memisahkan langkah ekstraksi dari langkah kirim membuka celah race condition kalau BLS me-refresh gambar di antara keduanya.
Alur yang sama berlaku kalau stack Anda pakai Node.js — bedanya di Puppeteer:
Menggunakan Puppeteer
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.goto('https://blsitalypakistan.com/appointment');
// Get instruction
const instruction = await page.$eval('.captcha-instruction', el => el.textContent);
// Get images as base64
const images = await page.$$eval('.captcha-image img', imgs =>
imgs.map((img, i) => ({
key: `image_base64_${i + 1}`,
value: img.src.startsWith('data:') ? img.src.split(',')[1] : null
}))
);
Langkah 2: Kirim Gambar dan Instruksi ke API CaptchaAI
Setelah gambar dan instruksi siap, kirim keduanya sekaligus ke method bls di endpoint in.php. CaptchaAI menerima sampai sembilan gambar dalam satu request, masing-masing diberi key image_base64_1 sampai image_base64_9.
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
payload = {
"key": API_KEY,
"method": "bls",
"instructions": instruction,
"json": 1
}
# Add each image (up to 9)
for key, value in images.items():
payload[key] = value
response = requests.post("https://ocr.captchaai.com/in.php", data=payload)
data = response.json()
if data.get("status") != 1:
raise Exception(f"Submit error: {data.get('request')}")
task_id = data["request"]
print(f"Task submitted: {task_id}")
CaptchaAI menolak request kalau jumlah gambar melebihi sembilan — potong array gambar Anda dulu kalau halaman BLS menampilkan lebih banyak dari itu.
Struktur payload-nya sama persis di Node.js — cuma cara mengirim request-nya yang beda:
Node.js
const axios = require('axios');
const FormData = require('form-data');
async function submitBLS(instruction, images) {
const params = {
key: 'YOUR_API_KEY',
method: 'bls',
instructions: instruction,
json: 1,
...Object.fromEntries(images.map(img => [img.key, img.value]))
};
const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, { params });
if (data.status !== 1) throw new Error(data.request);
return data.request;
}
Langkah 3: Polling Hasil Sampai Solusi Siap
API tidak langsung mengembalikan hasil di response pertama. Anda perlu polling endpoint res.php berulang kali sampai statusnya berubah jadi sukses. Hasil akhirnya berupa indeks gambar yang benar, dipisahkan koma — misalnya 1,3,5.
Python
def get_bls_solution(task_id):
for _ in range(30):
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"] # e.g., "1,3,5" (image indices)
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result.get('request')}")
raise Exception("Timeout")
solution = get_bls_solution(task_id)
print(f"Select images: {solution}") # e.g., "1,3,5"
Interval 5 detik kali 30 percobaan memberi jendela toleransi sekitar 150 detik. Kalau volume solve Anda tinggi, turunkan intervalnya ke 3 detik supaya antrean tidak menumpuk tanpa membebani API secara berlebihan.
Langkah 4: Klik Gambar Sesuai Indeks Hasil
Parse string indeks itu, lalu klik setiap gambar yang cocok di halaman sebelum submit form appointment:
# Parse the solution indices
selected = [int(i) for i in solution.split(",")]
# Click each correct image
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
for idx in selected:
captcha_imgs[idx - 1].click() # Convert 1-based to 0-based
time.sleep(0.3) # Small delay between clicks
# Submit the form
driver.find_element(By.CSS_SELECTOR, ".captcha-submit").click()
Dua hal yang mudah terlewat di langkah ini:
- Indeks dari API mulai dari 1, bukan 0 — konversi dulu sebelum dipakai untuk indexing array gambar.
- Beri jeda singkat antar klik, seperti
time.sleep(0.3)di atas, supaya elemen halaman BLS sempat render ulang sebelum klik berikutnya.
Kesalahan Umum dan Cara Mengatasinya
Empat masalah ini paling sering muncul saat menyelesaikan BLS CAPTCHA:
| Error | Penyebab | Solusi |
|---|---|---|
ERROR_BAD_PARAMETERS |
Instruksi atau gambar tidak ada | Sertakan teks instruksi dan minimal satu gambar |
ERROR_CAPTCHA_UNSOLVABLE |
Gambar terlalu buram atau tidak dapat dikenali | Ambil gambar dengan kualitas lebih tinggi; pastikan encoding base64 benar |
| Gambar yang dipilih salah | Urutan gambar salah | Pastikan gambar diberi nomor dalam urutan tampilan yang benar |
| Solusi ditolak | Gambar berubah setelah ekstraksi | Ekstrak gambar dan submit segera |
Dua hal lain juga sering jadi biang solusi ditolak, terutama untuk tim yang menjalankan automation dari jaringan yang tidak stabil:
- Koneksi mobile atau residential dengan latensi naik-turun memperbesar jeda antara ekstraksi dan submit — perpendek jeda itu sebisa mungkin.
- Retry otomatis tanpa mengekstrak ulang gambar cuma mengulang kegagalan yang sama — selalu ambil gambar baru sebelum retry, jangan pakai ulang gambar lama.
Contoh Kode Python Lengkap, Siap Jalan
Berikut versi gabungan dari keempat langkah di atas dalam satu skrip:
import requests
import time
import base64
from selenium import webdriver
from selenium.webdriver.common.by import By
API_KEY = "YOUR_API_KEY"
driver = webdriver.Chrome()
driver.get("https://blsitalypakistan.com/appointment")
# 1. Extract instruction and images
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
payload = {"key": API_KEY, "method": "bls", "instructions": instruction, "json": 1}
for i, img in enumerate(captcha_imgs, 1):
src = img.get_attribute("src")
if src.startswith("data:image"):
payload[f"image_base64_{i}"] = src.split(",")[1]
# 2. Submit to CaptchaAI
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload).json()
task_id = resp["request"]
# 3. Poll for solution
for _ in range(30):
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:
selected = [int(i) for i in result["request"].split(",")]
break
# 4. Click correct images and submit
for idx in selected:
captcha_imgs[idx - 1].click()
time.sleep(0.3)
driver.find_element(By.CSS_SELECTOR, ".captcha-submit").click()
print("CAPTCHA solved!")
driver.quit()
Proyek Contoh Lengkap di GitHub
Cuplikan di atas cukup untuk memahami alurnya, tapi versi production-ready di repo GitHub CaptchaAI mencakup lebih banyak:
- Setup environment dan dependency lengkap
- Polling dengan retry dan backoff
- Error handling untuk seluruh kode error CaptchaAI
Buka proyek contoh lengkap di GitHub →
Pertanyaan Umum Seputar BLS CAPTCHA
Apakah method bls berlaku sama untuk semua portal BLS International (Italia, Spanyol, Prancis, dll)?
Secara teknis, ya — method bls dirancang untuk format challenge BLS International secara umum, bukan per negara. Gambar dan pola instruksinya konsisten di berbagai portal, jadi implementasi yang sama biasanya bisa dipakai ulang. Tetap uji dulu di portal spesifik yang Anda targetkan sebelum mengandalkannya di production.
Kenapa solusi BLS CAPTCHA kadang ditolak walau API CaptchaAI mengembalikan status sukses?
Penyebab paling umum: gambar di halaman BLS berubah atau di-refresh setelah Anda mengekstraknya, tapi sebelum hasil solve dipakai untuk klik. Ekstrak gambar, kirim ke API, dan submit hasilnya dalam satu alur berurutan tanpa jeda manual di tengah.
Bisakah BLS CAPTCHA diselesaikan tanpa Selenium atau Puppeteer, murni lewat HTTP request?
Bisa, selama Anda punya cara lain untuk mengambil gambar dan teks instruksi dari halaman. API CaptchaAI sendiri cuma butuh gambar base64 dan teks instruksi — tidak ada dependency ke browser otomatis di sisi API.
Berapa lama rata-rata waktu penyelesaian BLS CAPTCHA, dan apakah lebih lambat dari reCAPTCHA grid?
Biasanya 15–30 detik, sedikit lebih lama dari kebanyakan challenge reCAPTCHA grid karena BLS CAPTCHA mengandalkan pengenalan gambar dengan instruksi teks bebas, bukan kategori tetap. Perhitungkan rentang waktu ini di timeout automation Anda — jangan set timeout di bawah 30 detik.
Apakah otomatisasi ini aman dipakai untuk membantu proses booking appointment visa klien?
Aman selama Anda memproses data yang memang diberikan dan dikuasakan klien sendiri untuk keperluan appointment mereka. Dua prinsip praktis yang sejalan dengan UU Pelindungan Data Pribadi (UU 27/2022):
- Proses hanya data appointment yang otorisasinya jelas dari klien, bukan data pihak lain yang Anda kumpulkan tanpa izin.
- Simpan data pribadi klien seperlunya saja, lalu hapus setelah proses appointment selesai.
Solve BLS CAPTCHA Tanpa Menghambat Proses Appointment
Ambil API key CaptchaAI Anda di captchaai.com dan hubungkan ke method bls:
- Uji dulu di satu portal BLS dengan volume kecil — setup awal biasanya kurang dari satu jam.
- Setelah polling dan retry terbukti stabil, naikkan volume sesuai kebutuhan tim Anda.