API Tutorials

Cara Solve BLS CAPTCHA Langkah demi Langkah

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:

  1. Ambil gambar dan teks instruksi dari halaman.
  2. Kirim keduanya ke method bls di API CaptchaAI.
  3. Polling sampai hasil siap.
  4. 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.

Panduan Terkait

Komentar dinonaktifkan untuk artikel ini.