Die meisten Fehler beim Lösen von BLS-CAPTCHA lassen sich auf drei Ursachen zurückführen. Wer diese drei Fehlerklassen kennt, findet die Ursache eines fehlgeschlagenen Solves meist in unter einer Minute – statt blind einzelne Parameter zu variieren:
- Übermittlungsfehler: Die Payload an
in.phpist unvollständig oder falsch formatiert – CaptchaAI beginnt gar nicht erst mit dem Lösen. - Extraktionsfehler: Die Kacheln landen nicht oder in falscher Form in der Anfrage, weil sie dynamisch, als Canvas oder hinter einem Hotlinking-Schutz geladen werden.
- Timing-Fehler: Das CAPTCHA läuft ab, bevor die Lösung zurückkommt – das Gültigkeitsfenster ist knapp.
BLS-CAPTCHA verlangt besondere Aufmerksamkeit, weil es keine Standard-Widget-Bibliothek nutzt, sondern eine eigene Bild-Auswahl-Implementierung. In der DACH-Region begegnet es vielen Entwicklern vor allem an den Terminportalen von BLS International, wo das Zeitfenster knapp und der Andrang hoch ist – genau dort summieren sich kleine Integrationsfehler schnell zu abgebrochenen Läufen.
Hinweis: Automatisieren Sie ausschließlich Portale und Konten, für die Sie eine Berechtigung haben, und halten Sie die jeweiligen Nutzungsbedingungen ein.
Schnelldiagnose: Welcher Fehler gehört wohin?
Ordnen Sie das Symptom zuerst einer der drei Klassen zu – diese Tabelle führt direkt zum passenden Abschnitt:
| Symptom | Wahrscheinliche Ursache | Abschnitt |
|---|---|---|
API antwortet sofort mit ERROR_* |
Payload unvollständig | Fehler bei der API-Übermittlung |
| Anfrage ist leer oder enthält falsche Bilder | Extraktion im Browser | Bilder aus dem DOM extrahieren |
| Solve war korrekt, Absenden scheitert trotzdem | Index- oder Reihenfolgefehler | Lösung auf das Formular anwenden |
| Abbruch nach rund 60 Sekunden | Gültigkeitsfenster überschritten | Timeouts und Ablauf |
Fehler bei der API-Übermittlung
Diese Fehlerklasse tritt auf, bevor CaptchaAI überhaupt mit dem Lösen beginnt: Die Anfrage an in.php ist unvollständig oder falsch formatiert. Die API antwortet dann sofort mit einem Fehlercode statt mit einer Task-ID.
ERROR_BAD_PARAMETERS
API-Antwort:
ERROR_BAD_PARAMETERS
Ursache: Ein Pflichtparameter fehlt – meist der Anweisungstext oder die Bilddaten. Die BLS-Methode braucht beides: instructions beschreibt, was ausgewählt werden soll, und mindestens ein image_base64_*-Feld liefert die Kacheln.
Lösung: Übermitteln Sie beide Pflichtfelder gemeinsam:
instructionsmit dem Auswahlhinweis – genau so, wie er im CAPTCHA angezeigt wird.- mindestens ein
image_base64_*-Feld mit den Kacheln.
# 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
API-Antwort:
ERROR_WRONG_FILE_EXTENSION
Ursache: Die Bilddaten sind kein gültiges Base64 oder liegen in einem nicht unterstützten Format vor. Häufigster Auslöser: Das data:image/...;base64,-Präfix aus einer Data-URI wurde versehentlich mitgesendet.
Lösung:
- Kodieren Sie die Bilder als Base64 im Format PNG oder JPEG.
- Entfernen Sie das Präfix
data:image/...;base64,. - Prüfen Sie, dass die Base64-Zeichenkette nicht abgeschnitten ist.
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
API-Antwort:
ERROR_CAPTCHA_UNSOLVABLE
Ursache: Die Bilder sind zu niedrig aufgelöst oder verschwommen, oder die extrahierte Anweisung ist mehrdeutig.
Lösung:
- Erfassen Sie die Bilder in voller Auflösung, nicht als herunterskalierte Thumbnails.
- Stellen Sie sicher, dass der Anweisungstext vollständig und korrekt ausgelesen wird.
- Wiederholen Sie den Versuch – manche Abfragen sind naturgemäß schwerer und lösen erst im zweiten Anlauf.
Bilder zuverlässig aus dem DOM extrahieren
Die zweithäufigste Fehlerquelle liegt nicht in der API, sondern im Browser: Die Bilder landen gar nicht oder in falscher Form in Ihrer Payload. Drei Muster tauchen dabei immer wieder auf – dynamisches Nachladen, Kacheln auf <canvas> statt in <img> und ein Hotlinking-Schutz, der den direkten Abruf blockiert.
Bilder werden dynamisch geladen
Liegen die Bilder beim ersten Seitenaufbau noch nicht im DOM, weil JavaScript sie erst nachlädt, warten Sie explizit, bis das CAPTCHA vollständig gerendert ist:
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"))
)
Bilder sind Canvas-Elemente statt img-Tags
Zeichnen manche BLS-Varianten die Kacheln auf <canvas>-Elemente, statt sie als <img> einzubinden, lesen Sie die Canvas-Daten direkt als Base64 aus:
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
Bilder hinter Anti-Hotlinking-Schutz
Liefern die Bild-URLs einen 403-Fehler, sobald sie außerhalb des Browsers abgerufen werden, greift ein Hotlinking-Schutz. Extrahieren Sie die Bilddaten dann im Browserkontext, wo die Session-Cookies bereits gültig sind:
# 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)
Die Lösung korrekt auf das Formular anwenden
Jetzt hat CaptchaAI korrekt gelöst – und trotzdem schlägt die Auswahl fehl. Das liegt fast immer an der Zuordnung zwischen den zurückgegebenen Indizes und den tatsächlich angezeigten Kacheln.
Falsche Kacheln werden angeklickt
Weicht die Reihenfolge der Bilder bei der Extraktion von der Anzeigereihenfolge ab, klickt die Automatisierung die falschen Kacheln an. Halten Sie deshalb eine konsistente Reihenfolge ein:
# 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)
Lösungsindizes passen nicht zusammen
CaptchaAI liefert 1-basierte Indizes zurück, während Ihr Array-Zugriff 0-basiert ist. Ziehen Sie vor dem Klick jeweils 1 ab:
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
Formular lässt sich trotz korrekter Auswahl nicht absenden
Fehlen zusätzliche Formularfelder oder versteckte Token beim Absenden, schlägt der POST trotz korrekter Auswahl fehl. Suchen Sie nach versteckten Feldern, die zusammen mit dem CAPTCHA übermittelt werden müssen:
# 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}")
Timeouts und das Ablaufen des CAPTCHAs
BLS-CAPTCHA hat ein besonders kurzes Gültigkeitsfenster – hier entscheidet das Timing über Erfolg oder Abbruch.
Achtung: An stark frequentierten Terminportalen invalidieren die Server das CAPTCHA oft schon nach wenigen Sekunden Inaktivität.
Das CAPTCHA läuft ab, bevor der Solve fertig ist
Das Gültigkeitsfenster ist kurz, und jede Verzögerung zwischen Extraktion und Übermittlung kostet Sie den Versuch. Halten Sie den Ablauf deshalb straff:
- Extrahieren Sie die Bilder und senden Sie sie sofort an CaptchaAI.
- Bauen Sie keine Wartezeiten zwischen Extraktion und Absenden ein.
- Dauert der Solve länger als 60 Sekunden, ist das CAPTCHA vermutlich abgelaufen – laden Sie es neu und starten Sie den Versuch erneut.
Das Polling dauert zu lange
Lösung: Stellen Sie sicher, dass Sie den Status im richtigen Intervall abfragen:
# 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")
Debugging-Checkliste
Wenn ein Solve fehlschlägt, arbeiten Sie diese Punkte der Reihe nach ab – meist steckt die Ursache in einem der ersten drei:
| Prüfpunkt | Aktion |
|---|---|
| Anweisung extrahiert? | Anweisungstext ausgeben und gegen die Anzeige prüfen |
| Bilder gültig? | Base64 in eine Datei schreiben und zur Kontrolle öffnen |
| Bildanzahl korrekt? | Anzahl gesendeter mit angezeigten Bildern vergleichen |
| Bildreihenfolge korrekt? | DOM-Reihenfolge mit Anzeigereihenfolge abgleichen |
| Base64-Präfix entfernt? | data:image/...;base64, abschneiden |
| Lösungsformat? | Kommagetrennte, 1-basierte Indizes parsen |
| Indexkonvertierung? | Für 0-basierten Zugriff jeweils 1 subtrahieren |
Häufige Fragen
Warum erhalte ich ERROR_CAPTCHA_UNSOLVABLE, obwohl die Bilder korrekt aussehen?
Meist liegt es an der Auflösung oder am Anweisungstext, nicht an den Kacheln selbst. Erfassen Sie die Bilder in voller Größe und prüfen Sie, ob der instructions-Text vollständig ausgelesen wurde – ein abgeschnittener Hinweis macht die Abfrage mehrdeutig.
Wie viele Bilder muss ich an die BLS-Methode senden?
Alle im CAPTCHA angezeigten Kacheln, typischerweise 3–9. Nutzen Sie die Felder image_base64_1 bis image_base64_9 in der Anzeigereihenfolge.
Wie verhindere ich Timeouts bei kurzen Gültigkeitsfenstern?
Extrahieren und übermitteln Sie in einem Zug, ohne Zwischenschritte. Bauen Sie keine Wartezeiten zwischen Bildextraktion und dem in.php-Aufruf ein und starten Sie das Polling unmittelbar nach dem Absenden.
Was mache ich, wenn BLS das CAPTCHA-Layout ändert?
Anpassen müssen Sie in der Regel nur den Extraktionscode im Browser. Die CaptchaAI-Parameter (method=bls, instructions, image_base64_*) bleiben unverändert, egal wie das Frontend aufgebaut ist.
Welcher CaptchaAI-Tarif eignet sich für viele parallele BLS-Abfragen?
CaptchaAI rechnet pro gleichzeitigem Thread ab, nicht pro Lösung – jede Stufe enthält unbegrenzte Solves pro Thread. Für kleine Automatisierungen reicht BASIC (15 $/Monat, 5 Threads); größere Batch-Läufe an Terminportalen profitieren von ADVANCE (90 $/Monat, 50 Threads).