Ihre Automatisierung – ein Scraper, ein End-to-End-Test oder ein Monitoring-Job – läuft zuverlässig, bis eine Seite plötzlich ein CAPTCHA einblendet und der ganze Ablauf stehen bleibt. Genau hier setzen die folgenden Skripte an. Sie sind zum direkten Kopieren gedacht, decken die häufigsten CAPTCHA-Typen ab und sprechen jeweils die API von CaptchaAI an. Jedes Skript übernimmt den vollständigen Ablauf – Aufgabe übermitteln, Status abfragen, Token zurückgeben –, sodass Sie sich auf Ihre eigentliche Logik konzentrieren können statt auf Boilerplate.
Alle Beispiele nutzen dasselbe Grundmuster und lassen sich sowohl als eigenständiges Kommandozeilen-Tool als auch als importierbares Modul in einer bestehenden Codebasis einsetzen. Die folgende Übersicht zeigt, welches Skript welchen Typ abdeckt:
| Skript | CAPTCHA-Typ | method-Parameter |
|---|---|---|
| Skript 1 | reCAPTCHA v2 | userrecaptcha |
| Skript 2 | Cloudflare Turnstile | turnstile |
| Skript 3 | Bild-CAPTCHA | base64 |
| Skript 4 | Batch (reCAPTCHA v2) | userrecaptcha |
| Skript 5 | universell (Node.js) | je nach Typ |
So funktionieren die Skripte
Das Muster ist bei jedem CAPTCHA-Typ identisch und stützt sich auf zwei Endpunkte:
- Übermitteln: An
in.phpsenden Sie die Aufgabe (Sitekey, Page-URL oder das Bild); die API antwortet mit einer Task-ID. - Abfragen: An
res.phpfragen Sie im Sekundentakt den Status ab (Polling). SolangeCAPCHA_NOT_READYzurückkommt, ist die Lösung noch nicht fertig; sobald die Antwort mitOK|beginnt, steht Ihr Token bereit.
Zwei Punkte vor dem ersten Aufruf: Ersetzen Sie YOUR_API_KEY durch Ihren echten Schlüssel aus dem Dashboard, und bauen Sie das zurückgegebene Token zeitnah in Ihr Formular ein – reCAPTCHA- und Turnstile-Token sind nur rund 120 Sekunden gültig. Wie viele dieser Aufgaben gleichzeitig laufen dürfen, hängt an Ihrer Thread-Zahl, nicht an einem Volumenlimit: CaptchaAI rechnet pro parallelem Thread ab, mit unbegrenzten Lösungen pro Thread.
Skript 1: reCAPTCHA v2 lösen
Der häufigste Fall. Das Skript übermittelt Sitekey und Page-URL, fragt das Ergebnis ab und gibt das g-recaptcha-response-Token auf der Konsole aus – ideal als erster Baustein oder zum schnellen Testen der Zugangsdaten.
#!/usr/bin/env python3
"""Solve reCAPTCHA v2 and print the token."""
import requests
import time
import sys
API_KEY = "YOUR_API_KEY"
def solve_recaptcha_v2(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
print(f"Error: {resp.text}", file=sys.stderr)
sys.exit(1)
task_id = resp.text.split("|")[1]
print(f"Task ID: {task_id}")
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY":
print(".", end="", flush=True)
continue
if result.text.startswith("OK|"):
print()
return result.text.split("|")[1]
print(f"\nError: {result.text}", file=sys.stderr)
sys.exit(1)
print("\nTimeout", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} <site_key> <page_url>")
sys.exit(1)
token = solve_recaptcha_v2(sys.argv[1], sys.argv[2])
print(token)
Aufruf über die Kommandozeile:
python solve_recaptcha.py "6Le-wvkS..." "https://example.com/form"
Skript 2: Cloudflare Turnstile lösen
Turnstile funktioniert nach demselben Prinzip, verwendet aber method: turnstile und den Parameter sitekey. Diese Variante ist bewusst kompakt gehalten und wirft bei einem Fehler eine Exception – so lässt sie sich sauber in eine größere Funktion einbetten, die das Ergebnis weiterverarbeitet.
#!/usr/bin/env python3
"""Solve Cloudflare Turnstile and print the token."""
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_turnstile(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "turnstile",
"sitekey": site_key,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
if result.text.startswith("OK|"): return result.text.split("|")[1]
raise Exception(result.text)
raise TimeoutError()
token = solve_turnstile("0x4AAAAA...", "https://example.com")
print(token)
Skript 3: Bild-CAPTCHA lösen
Für klassische verzerrte Text-in-Bild-Abfragen. Das Skript akzeptiert sowohl einen lokalen Dateipfad als auch eine URL, kodiert das Bild als Base64 und übermittelt es mit method: base64. Der Poll-Zyklus ist hier kürzer angesetzt, weil Bild-CAPTCHAs in der Regel schneller zurückkommen als interaktive Typen.
#!/usr/bin/env python3
"""Solve an image CAPTCHA from a file or URL."""
import requests
import base64
import time
import sys
API_KEY = "YOUR_API_KEY"
def solve_image(image_source):
# Load image
if image_source.startswith("http"):
img_data = requests.get(image_source).content
else:
with open(image_source, "rb") as f:
img_data = f.read()
img_b64 = base64.b64encode(img_data).decode()
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "base64",
"body": img_b64
})
task_id = resp.text.split("|")[1]
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
})
if result.text == "CAPCHA_NOT_READY": continue
if result.text.startswith("OK|"): return result.text.split("|")[1]
raise Exception(result.text)
raise TimeoutError()
if __name__ == "__main__":
text = solve_image(sys.argv[1])
print(text)
Aufruf mit Datei oder URL:
python solve_image.py captcha.png
python solve_image.py "https://example.com/captcha.jpg"
Skript 4: Mehrere CAPTCHAs parallel lösen (Batch)
Sobald Sie viele Seiten gleichzeitig abarbeiten, wird sequenzielles Lösen zum Engpass. Dieses Skript nutzt einen ThreadPoolExecutor, um mehrere Aufgaben nebenläufig zu verarbeiten, und liefert pro Aufgabe ein Ergebnisobjekt mit Status. Die Fehlerbehandlung sitzt bereits pro Task, sodass eine fehlgeschlagene Lösung den restlichen Durchlauf nicht abbricht. Wählen Sie max_workers passend zu Ihrer gebuchten Thread-Zahl – mehr Worker als Threads bringen keinen zusätzlichen Durchsatz.
#!/usr/bin/env python3
"""Solve multiple CAPTCHAs concurrently."""
import requests
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
API_KEY = "YOUR_API_KEY"
def solve_one(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": site_key, "pageurl": page_url
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
if result.text.startswith("OK|"): return result.text.split("|")[1]
raise Exception(result.text)
raise TimeoutError()
def solve_batch(tasks, max_workers=5):
"""
tasks: list of (site_key, page_url) tuples
Returns: list of tokens
"""
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = {
executor.submit(solve_one, sk, url): (sk, url)
for sk, url in tasks
}
for future in as_completed(futures):
sk, url = futures[future]
try:
token = future.result()
results.append({"url": url, "token": token, "status": "ok"})
except Exception as e:
results.append({"url": url, "error": str(e), "status": "failed"})
return results
# Example
tasks = [
("6Le-wvkS...", "https://example.com/page1"),
("6Le-wvkS...", "https://example.com/page2"),
("6Le-wvkS...", "https://example.com/page3"),
]
results = solve_batch(tasks)
for r in results:
print(f"{r['url']}: {r['status']}")
Skript 5: Universeller Solver in Node.js
Wenn Ihr Stack auf Node.js läuft, deckt diese eine Funktion alle Typen ab: Sie übergeben einfach das passende params-Objekt (mit method und den jeweiligen Feldern), der Rest bleibt gleich. Die auskommentierten Beispiele am Ende zeigen den Aufruf für reCAPTCHA v2 und Turnstile.
#!/usr/bin/env node
// Solve any CAPTCHA type from the command line
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
async function solve(params) {
params.key = API_KEY;
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params,
});
if (!submit.data.startsWith("OK|")) throw new Error(submit.data);
const taskId = submit.data.split("|")[1];
while (true) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId },
});
if (result.data === "CAPCHA_NOT_READY") continue;
if (result.data.startsWith("OK|")) return result.data.split("|")[1];
throw new Error(result.data);
}
}
// Usage examples:
// Solve reCAPTCHA v2
// solve({ method: "userrecaptcha", googlekey: "SITE_KEY", pageurl: "URL" })
// Solve Turnstile
// solve({ method: "turnstile", sitekey: "SITE_KEY", pageurl: "URL" })
module.exports = { solve };
Kontostand per Skript prüfen
Bevor ein langer Batch-Lauf startet, lohnt ein Blick auf das Guthaben. Der Endpunkt res.php mit action: getbalance gibt Ihren aktuellen Kontostand zurück – praktisch als Health-Check am Anfang eines Jobs oder als Kennzahl für ein Monitoring-Dashboard.
#!/usr/bin/env python3
"""Check CaptchaAI account balance."""
import requests
API_KEY = "YOUR_API_KEY"
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "getbalance"
})
print(f"Balance: ${resp.text}")
Skripte in Produktion und CI betreiben
Für den produktiven Einsatz ergänzen Sie die Beispiele um drei Dinge:
- Logging und Timeouts: strukturierte Log-Ausgaben und konfigurierbare Timeouts statt fester Werte.
- Wiederholungslogik: einen erneuten Versuch mit exponentiellem Backoff bei transienten Netzwerkfehlern.
- Secrets: den API-Schlüssel in einer Umgebungsvariable oder einem CI-Secret, nie im Code.
In der Praxis laufen solche Solver oft als kleiner Worker auf einem VPS – etwa bei Hetzner oder netcup – oder als Schritt in einer GitLab-CI-Pipeline, die nächtliche End-to-End-Tests gegen die eigene Staging-Umgebung fährt.
Ein Hinweis zur Rechtslage: Wenn Sie im Rahmen von Scraping personenbezogene Daten verarbeiten – IP-Adressen zählen nach DSGVO bereits dazu –, prüfen Sie Zweck und Rechtsgrundlage Ihrer Datenflüsse. Setzen Sie diese Skripte ausschließlich auf eigenen oder ausdrücklich autorisierten Systemen ein.
Häufige Fragen
Welche CAPTCHA-Typen decken diese Skripte ab?
reCAPTCHA v2, Cloudflare Turnstile und klassische Bild-CAPTCHAs. Über denselben Aufruf-Mechanismus lassen sich auch reCAPTCHA v3 und GeeTest v3 anbinden – Sie ändern nur method und die übergebenen Parameter.
Warum fragt das Skript den Status im Sekundentakt ab?
Weil das Lösen asynchron ist: Nach dem Übermitteln liefert die API zunächst nur eine Task-ID. Das Polling an res.php alle 5 Sekunden holt das Ergebnis ab, sobald es fertig ist. Interaktive Typen brauchen dabei etwas länger als reine Bild-CAPTCHAs.
Was kostet der Betrieb dieser Skripte?
CaptchaAI rechnet Thread-basiert ab, mit unbegrenzten Lösungen pro Thread – von BASIC (15 $/Monat, 5 Threads) bis ENTERPRISE (300 $/Monat, 200 Threads). Es gibt keine Kosten pro einzelner Lösung. Ihren aktuellen Stand prüfen Sie mit dem Kontostand-Skript weiter oben.
Lassen sich damit auch hCaptcha oder FunCaptcha lösen?
Nein. hCaptcha und FunCaptcha werden von CaptchaAI derzeit nicht unterstützt, und GeeTest v4 ist als „bald verfügbar“ gelistet. Die hier gezeigten Skripte konzentrieren sich auf die unterstützten Typen reCAPTCHA, Cloudflare Turnstile und Bild-CAPTCHAs.