Ein Rasterbild-CAPTCHA lösen Sie automatisch, indem Sie das komplette Raster als ein Bild erfassen, es an den OCR-Endpunkt von CaptchaAI senden (method=post mit recaptcha=1) und die zurückgegebenen Zellen bzw. Klick-Koordinaten in Ihrem Browser anwenden. Kein manuelles Erraten, kein Klick-Training – ein API-Aufruf pro Abfrage.
Gemeint ist damit nicht das klassische Google-reCAPTCHA-Raster, sondern die vielen eigenen Bildraster, die Websites selbst zusammenbauen: ein großes Bild, aufgeteilt in 3×3 oder 4×4 Kacheln, mit der Aufforderung „Wählen Sie alle Felder mit …". Genau diese Nicht-reCAPTCHA-Raster deckt dieser Leitfaden ab.
Raster-Methode oder reCAPTCHA-Token – welcher Weg passt?
Bevor Sie Code schreiben, klären Sie die Art der Abfrage – das entscheidet über die Methode und spart Ihnen später viel Fehlersuche:
- Echtes Google-reCAPTCHA (das Widget mit dem reCAPTCHA-Branding, bei dem angeklickte Kacheln nachladen): Hier gehört die Token-Methode (
method=userrecaptcha) her. Sie ist stabiler, weil CaptchaAI die gesamte Abfrage übernimmt und Ihnen ein fertiges Token zurückgibt. - Eigenständiges Bildraster (ein statisches Bild ohne reCAPTCHA-Logik): Hier passt die Raster-Methode (
method=postmitrecaptcha=1). Sie laden das Bild hoch, CaptchaAI analysiert es als Ganzes und meldet Ihnen die passenden Zellen zurück.
Faustregel: Lädt die Abfrage nach jedem Klick neue Kacheln nach, ist es dynamisches reCAPTCHA – dann die Token-Methode. Bleibt das Bild statisch, ist die Raster-Methode der direkte Weg. Auf unterstützten Typen liefert der Raster-Solver laut CaptchaAI eine hohe Erfolgsquote bei einer Lösungszeit von typischerweise unter einer Sekunde – das Warten in der Praxis entsteht fast nur durch das Polling-Intervall, nicht durch die Analyse selbst.
Voraussetzungen
| Element | Wert |
|---|---|
| CaptchaAI API-Schlüssel | Von captchaai.com |
| Rasterbild | Screenshot oder Base64 des vollständigen Rasters |
| Sprache | Python 3.7+ oder Node.js 14+ |
Schritt 1: Das Rasterbild erfassen
Der Solver braucht das gesamte Raster als ein Bild – nicht die einzelnen Kacheln. Erfassen Sie deshalb den Container in voller Auflösung. Zwei Wege haben sich bewährt.
Methode A: Screenshot des CAPTCHA-Elements
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/protected-form")
# Screenshot just the captcha container
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
captcha_element.screenshot("captcha_grid.png")
Methode B: Bild aus dem src-Attribut extrahieren
Liegt das Raster als <img> vor, sparen Sie sich den Screenshot und lesen das Bild direkt aus – entweder als eingebettetes Base64-Data-URI oder über die Bild-URL:
import base64
import requests
captcha_img = driver.find_element(By.CSS_SELECTOR, ".grid-captcha img")
src = captcha_img.get_attribute("src")
if src.startswith("data:image"):
image_b64 = src.split(",")[1]
else:
image_data = requests.get(src).content
image_b64 = base64.b64encode(image_data).decode()
Schritt 2: Das Bild an CaptchaAI übermitteln
Der Endpunkt ist in.php. Sie übermitteln das Bild entweder als Datei-Upload oder als Base64-String und erhalten eine Task-ID zurück, mit der Sie anschließend das Ergebnis abfragen.
Datei-Upload verwenden (Python)
import requests
import time
API_KEY = "YOUR_API_KEY"
with open("captcha_grid.png", "rb") as f:
response = requests.post("https://ocr.captchaai.com/in.php",
data={
"key": API_KEY,
"method": "post",
"recaptcha": 1,
"json": 1
},
files={"file": f}
)
data = response.json()
task_id = data["request"]
print(f"Task: {task_id}")
Base64 verwenden (Python)
Der Base64-Weg eignet sich, wenn Sie das Bild ohnehin schon aus Methode B im Speicher haben und keine Datei anlegen wollen:
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "post",
"body": image_b64,
"recaptcha": 1,
"json": 1
})
task_id = response.json()["request"]
Node.js
const axios = require('axios');
const fs = require('fs');
async function submitGridCaptcha(imagePath) {
const imageB64 = fs.readFileSync(imagePath).toString('base64');
const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'post',
body: imageB64,
recaptcha: 1,
json: 1
}
});
return data.request;
}
Schritt 3: Das Ergebnis abfragen (Polling)
Mit der Task-ID fragen Sie res.php in kurzen Abständen ab, bis das Ergebnis vorliegt. Solange die Antwort CAPCHA_NOT_READY lautet, warten Sie weiter; jeder andere Wert außer einer Lösung ist ein Fehlercode und sollte abgefangen werden. Die folgende Schleife pollt bis zu 30-mal im Abstand von fünf Sekunden:
def get_grid_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"]
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
raise Exception("Timeout")
solution = get_grid_solution(task_id)
print(f"Solution: {solution}")
# Returns click coordinates or cell indices
Schritt 4: Die Lösung anwenden
CaptchaAI liefert die Lösung in einem von zwei Formaten zurück: als Zellindizes (etwa 2,5,6) oder als Klick-Koordinaten (etwa x=120,y=80;x=250,y=200). Prüfen Sie das Format und wählen Sie den passenden Ansatz – das ist die häufigste Fehlerquelle beim ersten Integrationsversuch.
Nach Zellindex anklicken
# If solution returns cell indices (e.g., "2,5,6")
selected = [int(i) for i in solution.split(",")]
cells = driver.find_elements(By.CSS_SELECTOR, ".grid-cell")
for idx in selected:
cells[idx - 1].click()
time.sleep(0.2)
driver.find_element(By.CSS_SELECTOR, ".verify-button").click()
Nach Koordinaten anklicken
from selenium.webdriver.common.action_chains import ActionChains
# If solution returns coordinates (e.g., "x=120,y=80;x=250,y=200")
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
actions = ActionChains(driver)
for coord in solution.split(";"):
parts = dict(p.split("=") for p in coord.split(","))
x, y = int(parts["x"]), int(parts["y"])
actions.move_to_element_with_offset(captcha_element, x, y).click()
actions.perform()
Praxisbeispiel: Raster-Abfrage in einem Monitoring-Worker
Angenommen, ein Team in Frankfurt betreibt auf einem Hetzner-Server einen Worker, der ein autorisiertes Portal regelmäßig ausliest. Das Portal schaltet bei häufigen Zugriffen ein eigenes Bildraster vor – kein reCAPTCHA, sondern ein statisches 4×4-Bild. Der Worker erfasst das Raster mit Methode A, schickt es per Base64 an in.php und klickt die zurückgemeldeten Zellen an. Weil der Raster-Solver typischerweise in unter einer Sekunde antwortet, bleibt das Polling-Intervall der einzige spürbare Zeitfaktor.
Für die Kostenseite zählt bei CaptchaAI nicht die Anzahl der Lösungen, sondern die Zahl paralleler Threads. Schon der BASIC-Tarif (15 $/Monat, 5 Threads) deckt fünf gleichzeitige Abfragen mit unbegrenzten Lösungen pro Thread ab – für einen einzelnen Monitoring-Worker reichlich Reserve. Preise werden in US-Dollar abgerechnet.
Ein Hinweis zur Sorgfaltspflicht: Sobald Sie fremde Seiten auslesen, verarbeiten Sie in aller Regel auch IP-Adressen, die nach DSGVO als personenbezogene Daten gelten. Prüfen Sie Rechtsgrundlage und Zulässigkeit Ihres Datenflusses, bevor Sie einen Scraper in Produktion nehmen – die technische Lösbarkeit eines CAPTCHAs sagt nichts über die rechtliche Zulässigkeit des Zugriffs aus.
Fehlerbehebung
| Fehler | Ursache | Behebung |
|---|---|---|
ERROR_WRONG_FILE_EXTENSION |
Ungültiges Bildformat | PNG oder JPEG verwenden; prüfen, ob das Base64 gültig ist |
ERROR_CAPTCHA_UNSOLVABLE |
Bild zu klein oder unscharf | In voller Auflösung erfassen |
| Falsche Zellen ausgewählt | Lösungsformat nicht erkannt | Prüfen, ob die Lösung aus Indizes oder Koordinaten besteht |
ERROR_TOO_BIG_CAPTCHA_FILESIZE |
Bild überschreitet die Größengrenze | Auf unter 600 KB verkleinern |
Zwei Fehler treten am häufigsten auf. ERROR_CAPTCHA_UNSOLVABLE heißt fast immer, dass der Screenshot zu klein oder komprimiert war – erfassen Sie den Container in nativer Auflösung, nicht als verkleinertes Thumbnail. Und falsch angeklickte Zellen deuten selten auf einen Analysefehler hin, sondern darauf, dass Ihr Code Indizes erwartet, obwohl Koordinaten zurückkamen (oder umgekehrt).
Vollständig lauffähiges Beispiel
Sie möchten ein komplettes, direkt lauffähiges Projekt mit Umgebungseinrichtung, Polling, Wiederholungslogik und Fehlerbehandlung?
Das vollständige ausführbare Beispiel finden Sie auf GitHub →
Häufige Fragen
Wann nehme ich die Raster-Methode statt der reCAPTCHA-Token-Methode?
Die Raster-Methode (method=post mit recaptcha=1) ist für eigenständige, statische Bildraster gedacht. Für echtes Google-reCAPTCHA – erkennbar am Nachladen der Kacheln – nehmen Sie die Token-Methode (method=userrecaptcha); sie ist stabiler und liefert direkt ein verwertbares Token.
Wie schnell ist die Raster-Lösung und kann ich mehrere parallel abfragen?
Der eigentliche Solve dauert typischerweise unter einer Sekunde; in der Praxis bestimmt Ihr Polling-Intervall die Wartezeit. Parallelität ergibt sich aus Ihren Threads: Jeder Thread verarbeitet eine Abfrage gleichzeitig, BASIC etwa fünf. Solves pro Thread sind unbegrenzt.
Welches Bildformat und welche Dateigröße sollte ich verwenden?
PNG oder JPEG, unter 600 KB und in voller Auflösung. Verkleinerte oder stark komprimierte Bilder führen zu ERROR_CAPTCHA_UNSOLVABLE. Am zuverlässigsten ist ein Screenshot des gesamten Raster-Containers direkt aus dem Browser.
Muss ich beim Erfassen von CAPTCHA-Bildern etwas rechtlich beachten?
Das Bild selbst ist unkritisch, der umgebende Zugriff aber nicht. Sobald Sie fremde Seiten automatisiert auslesen, verarbeiten Sie oft personenbezogene Daten wie IP-Adressen. Klären Sie Rechtsgrundlage und Nutzungsbedingungen vorab – am besten testen Sie zunächst gegen eigene oder freigegebene Umgebungen.