reCAPTCHA v2 ist nach wie vor eine der häufigsten Hürden in Login-, Registrierungs-, Checkout- und Formularflüssen. Trifft Ihre Automatisierung auf eine reCAPTCHA-v2-Checkbox oder ein Bild-Challenge, lässt sich das in vier Schritten per API lösen: sitekey und pageurl aus der Seite extrahieren, an den reCAPTCHA-v2-Solver von CaptchaAI senden, das Ergebnis abwarten und das zurückgegebene Token in den geschützten Flow injizieren.
Dieser Leitfaden richtet sich an Entwickler, die eine funktionierende Integration brauchen — keine Theorieübersicht.
Unsicher, welche reCAPTCHA-Version vorliegt? Lesen Sie zuerst reCAPTCHA-Version erkennen.
Voraussetzungen
| Anforderung | Details |
|---|---|
| CaptchaAI API-Schlüssel | Erhältlich auf captchaai.com/api.php. 32 Zeichen. |
| Vollständige URL | Die genaue URL, auf der das reCAPTCHA-v2-Widget geladen wird. |
| sitekey | Der öffentliche Schlüssel der Widget-Instanz auf der Seite. |
| HTTP-Client | requests, axios, fetch, curl — egal welcher. |
| Aktive Threads | Ihr Konto braucht freie Lösungs-Threads. |
Schritt 1: sitekey und pageurl extrahieren
pageurl ist die vollständige URL der Seite, auf der reCAPTCHA erscheint. Immer mit https:// übergeben.
Drei Wege, den sitekey zu finden:
1. Im HTML — <div class="g-recaptcha" data-sitekey="..."> suchen:
<div class="g-recaptcha" data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"></div>
2. In der iframe-URL — https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&... — der Parameter k= ist der sitekey.
3. Im Netzwerk-Traffic — DevTools → Network nach recaptcha filtern; in jeder Anfrage erscheint der Parameter k.
Schritt 2: Task einreichen
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://example.com/login"
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": SITEKEY,
"pageurl": PAGEURL,
"json": 1,
}).json()
assert submit["status"] == 1, submit
task_id = submit["request"]
print("task id:", task_id)
Node.js-Variante:
const r = await fetch("https://ocr.captchaai.com/in.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: SITEKEY,
pageurl: PAGEURL,
json: "1",
}),
});
const { status, request: taskId } = await r.json();
if (status !== 1) throw new Error(taskId);
Unsichtbares reCAPTCHA?
invisible=1ergänzen. Mehr in Wie unsichtbares reCAPTCHA funktioniert.
Schritt 3: Ergebnis abrufen
reCAPTCHA v2 dauert meist 15–60 Sekunden. 20 s warten, dann alle 5 s abfragen.
import time
time.sleep(20)
while True:
res = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if res.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if res.get("status") == 1:
token = res["request"]
print("token:", token[:60], "…")
break
raise RuntimeError(res)
Das zurückgegebene Token ist eine lange Zeichenkette, die typischerweise mit 03AGdBq25... beginnt.
Schritt 4: Token in die Seite injizieren
Die Methode hängt von der Seite ab. Am häufigsten: das Textarea g-recaptcha-response:
document.querySelector('textarea[name="g-recaptcha-response"]').value = token;
document.querySelector("form").submit();
Selenium:
driver.execute_script(
"document.querySelector('[name=\"g-recaptcha-response\"]').value = arguments[0];",
token,
)
driver.find_element(By.CSS_SELECTOR, "form").submit()
Playwright:
await page.evaluate((t) => {
document.querySelector('[name="g-recaptcha-response"]').value = t;
}, token);
await page.click('button[type="submit"]');
Wenn das Widget einen data-callback hat, diesen ebenfalls aufrufen:
const callback = document.querySelector(".g-recaptcha").dataset.callback;
if (callback && window[callback]) window[callback](token);
Vollständiges Beispiel (Python)
import time
import requests
API_KEY = "YOUR_API_KEY"
SITEKEY = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
PAGEURL = "https://example.com/login"
def solve_recaptcha_v2():
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": SITEKEY, "pageurl": PAGEURL, "json": 1,
}).json()
if submit["status"] != 1:
raise RuntimeError(submit)
task_id = submit["request"]
time.sleep(20)
for _ in range(40):
res = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1,
}).json()
if res.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if res.get("status") == 1:
return res["request"]
raise RuntimeError(res)
raise TimeoutError("solve timed out")
if __name__ == "__main__":
token = solve_recaptcha_v2()
print("token:", token[:80])
Häufige Fehler und Lösungen
| Fehler | Ursache | Maßnahme |
|---|---|---|
ERROR_GOOGLEKEY |
sitekey leer oder ungültig | sitekey von der aktuellen Seite neu extrahieren |
ERROR_PAGEURL |
pageurl fehlt |
Vollständige URL mit Schema senden |
ERROR_ZERO_BALANCE |
Keine Threads | Aufladen oder warten |
ERROR_CAPTCHA_UNSOLVABLE |
Site verschärft das Challenge | Nach einigen Sekunden erneut versuchen; siehe häufige Fehler beim Lösen von reCAPTCHA v2 |
| Site lehnt Token ab | Token abgelaufen | Innerhalb von ~110 s nach Erhalt verwenden |
Wenn nichts klappt
- Token erhalten, Site blockiert weiter — das Formular hat einen eigenen Handler. Den Callback finden und aufrufen, statt nur das Textarea zu füllen.
- Gleicher Fingerprint nötig — gleiche Cookies und
User-Agentmitsenden, die beim Anfordern des Tokens aktiv waren. - Proxy-abhängiges reCAPTCHA —
proxyundproxytypean den Submit anhängen, damit der Solver Ihren IP-Pool nutzt.
Verwandte Leitfäden
- CaptchaAI Schnellstart
- reCAPTCHA v2 in Web-Scraping-Workflows
- Cloudflare Turnstile per API lösen
- Häufige Fehler bei reCAPTCHA v2