BLS CAPTCHA lösen Sie in vier Schritten: die Bilder und den Anweisungstext aus der Seite auslesen, beides an die CaptchaAI-API übermitteln, die zurückgegebenen Bild-Indizes abfragen und die passenden Kacheln anklicken. Genau diesen Ablauf zeigt dieser Leitfaden – mit lauffähigem Code für Python und Node.js.
BLS CAPTCHA ist die bildbasierte Abfrage in den Visa-Terminportalen von BLS International – für viele Antragsteller im DACH-Raum die letzte technische Hürde vor einem freien Termin. Sie ähnelt dem reCAPTCHA-Raster: mehrere Bilder, dazu eine Anweisung wie „Wählen Sie alle Bilder mit einem Auto aus“. Anders als bei reCAPTCHA stammt der Bildersatz von BLS selbst. Setzen Sie die Automatisierung nur für eigene, legitime Anträge ein.
Der Ablauf in Kürze
- Bilder und Anweisungstext aus der Seite auslesen (Selenium oder Puppeteer).
- Beides in einer Anfrage an CaptchaAI übermitteln (Methode
bls). - Das Ergebnis per Polling abholen – zurück kommen die Indizes der richtigen Bilder.
- Die genannten Kacheln anklicken und das Formular absenden.
Was Sie brauchen
- CaptchaAI API-Schlüssel – aus Ihrem Konto auf captchaai.com.
- BLS CAPTCHA-Bilder – Base64-kodiert von der Seite.
- Anweisungstext – der Satz, der angibt, welche Bilder auszuwählen sind.
- Laufzeit – Python 3.7+ oder Node.js 14+.
CaptchaAI rechnet Thread-basiert ab statt pro Lösung: Jeder Tarif enthält unbegrenzte Lösungen pro Thread, der Einstieg BASIC kostet 15 $/Monat mit 5 Threads. Für die BLS-Abfrage nutzen Sie die Methode bls; übermittelt wird an in.php, das Ergebnis holen Sie über res.php. Beide Endpunkte liegen unter ocr.captchaai.com.
Schritt 1: Bilder und Anweisungstext aus der Seite auslesen
Ein BLS CAPTCHA zeigt in der Regel 3–9 Bilder und darüber eine Textanweisung, etwa „Wählen Sie alle Bilder mit einem Auto aus“. Lesen Sie beides – die Anweisung und jedes Bild als Base64 – direkt aus dem DOM aus.
Mit 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()
Mit 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
}))
);
Liegen die Bilder bereits als data:image-URL vor, genügt der Teil nach dem Komma; externe Bild-URLs laden Sie herunter und kodieren sie selbst nach Base64.
Schritt 2: Bilder an CaptchaAI übermitteln
Schicken Sie Anweisungstext und alle Bilder in derselben Anfrage an den BLS-Solver – ohne Anweisung kann der Solver nicht wissen, welche Kacheln gemeint sind.
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}")
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;
}
Die API antwortet mit einer task_id für die Ergebnisabfrage.
Schritt 3: Lösung per Polling abfragen
Fragen Sie den Status mit der task_id in kurzen Abständen ab. Die fertige Lösung enthält die Indizes der richtigen Bilder, zum Beispiel 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"
Solange die Antwort CAPCHA_NOT_READY lautet, ist die Lösung noch in Arbeit – jede andere Meldung ist ein Fehler und sollte die Schleife abbrechen. Mit 30 Versuchen im 5-Sekunden-Takt deckt die Schleife ein Zeitfenster von bis zu 150 Sekunden ab; das reicht für BLS-Abfragen komfortabel. Fragen Sie nicht enger als alle 5 Sekunden ab, um unnötige Last auf dem res.php-Endpunkt zu vermeiden.
Schritt 4: Richtige Bilder anklicken und Formular absenden
Wandeln Sie die zurückgegebenen Indizes in Klicks um. Die API zählt ab 1, Listen in Python ab 0 – deshalb der Versatz um eine Position. Die kurze Pause zwischen den Klicks hält das Verhalten nah an einer realen Bedienung; erst nach allen Auswahlklicks senden Sie das Formular ab.
# 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()
Häufige Fehler und ihre Behebung
Bevor Sie das komplette Skript zusammensetzen, lohnt ein Blick auf die vier Meldungen, die in der Praxis am häufigsten auftreten:
| Fehler | Ursache | Lösung |
|---|---|---|
ERROR_BAD_PARAMETERS |
Anweisung oder Bilder fehlen | Legen Sie den Anweisungstext und mindestens ein Bild derselben Anfrage bei |
ERROR_CAPTCHA_UNSOLVABLE |
Bilder zu unscharf oder nicht auswertbar | Bilder in höherer Qualität erfassen; Base64-Kodierung prüfen |
| Falsche Kacheln ausgewählt | Bildreihenfolge stimmt nicht | Bilder in der tatsächlichen Anzeigereihenfolge durchnummerieren |
| Lösung abgelehnt | Bilder haben sich nach dem Auslesen geändert | Bilder auslesen und sofort übermitteln, bevor die Seite neu lädt |
Vollständiges Python-Beispiel
Die vier Schritte in einem durchgehenden Skript – vom Auslesen der Seite bis zum Absenden des Formulars:
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()
Möchten Sie stattdessen ein fertiges Projekt mit Umgebungseinrichtung, Polling, Wiederholungslogik und sauberer Fehlerbehandlung? Das vollständige, ausführbare Beispiel liegt auf GitHub:
Das vollständige ausführbare Beispiel finden Sie auf GitHub →
Häufige Fragen
Ist das automatische Lösen von BLS CAPTCHA rechtlich zulässig?
Für eigene, legitime Anträge im Rahmen der Nutzungsbedingungen in aller Regel ja – die Technik ersetzt nur das manuelle Anklicken der Kacheln. Prüfen Sie vorab die AGB des Portals und, falls personenbezogene Daten anfallen, Ihre DSGVO-Grundlagen.
Was kostet das Lösen von BLS CAPTCHA mit CaptchaAI?
CaptchaAI rechnet Thread-basiert ab, nicht pro Lösung. Jeder Tarif enthält unbegrenzte Lösungen pro Thread; der Einstieg BASIC kostet 15 $/Monat mit 5 Threads. Für gelegentliche BLS-Termine reicht der kleinste Tarif meist aus.
Wie lange dauert das Lösen eines BLS CAPTCHA?
Meist 15–30 Sekunden. Bilderkennung braucht länger als textbasierte CAPTCHAs, deshalb ist die Polling-Schleife auf mehrere Versuche im 5-Sekunden-Takt ausgelegt.
Warum wird eine korrekte Lösung manchmal abgelehnt?
Häufigste Ursache ist ein Zeitproblem: Der Bildersatz auf der Seite hat sich zwischen Auslesen und Absenden geändert. Lesen Sie die Bilder unmittelbar vor der Übermittlung aus und klicken Sie die Kacheln direkt nach Erhalt der Indizes an, ohne die Seite zwischendurch neu zu laden.
Kann ich BLS CAPTCHA ohne Selenium lösen?
Ja. Sobald Sie Bilder und Anweisungstext per HTTP-Anfrage gewinnen, benötigt die CaptchaAI-API nur die Base64-Bilder und den Text. Selenium oder Puppeteer sind nur bei JavaScript-gerenderten Seiten nötig.