Sie haben das CAPTCHA über CaptchaAI gelöst und ein gültiges Token erhalten, aber das Einfügen in den Browser funktioniert nicht. Dieser Leitfaden behandelt alle Gründe dafür und wie man sie beheben kann.
Häufige Fehlerquellen
| Problem | Symptom | Grundursache |
|---|---|---|
| Token wurde nicht in das richtige Element eingefügt | Formular wird ohne Token gesendet | Falsche Textbereichsauswahl |
| Das Token ist vor der Übermittlung abgelaufen | Die Seite zeigt erneut CAPTCHA an | Zu langsam zwischen Lösen und Senden |
| Rückruf nicht ausgelöst | Die Schaltfläche „Formular“ bleibt deaktiviert | Fehlender Grecaptcha-Rückruf |
| Falsche Seiten-URL an API gesendet | Token für diese Domain ungültig | URL stimmt nicht überein |
| Bot-Erkennung über CAPTCHA hinaus | Gesperrt, nachdem das Token akzeptiert wurde | Browser-Fingerprinting |
Fix 1: Korrekte Token-Injektion für reCAPTCHA v2
Das Token muss in den Textbereich g-recaptcha-response gehen UND der Rückruf muss ausgelöst werden:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def inject_recaptcha_token(driver, token):
"""Properly inject reCAPTCHA v2 token in browser."""
# Step 1: Make the response textarea visible and set the value
driver.execute_script("""
// Find all response textareas (may be multiple on page)
var textareas = document.querySelectorAll('[name="g-recaptcha-response"]');
textareas.forEach(function(ta) {
ta.style.display = 'block';
ta.value = arguments[0];
});
// Also set via ID if present
var byId = document.getElementById('g-recaptcha-response');
if (byId) {
byId.style.display = 'block';
byId.value = arguments[0];
}
""", token)
# Step 2: Trigger the callback
driver.execute_script("""
// Try standard callback
if (typeof ___grecaptcha_cfg !== 'undefined') {
var clients = ___grecaptcha_cfg.clients;
for (var key in clients) {
var client = clients[key];
// Navigate nested structure to find callback
for (var prop in client) {
var val = client[prop];
if (val && typeof val === 'object') {
for (var subprop in val) {
var subval = val[subprop];
if (subval && typeof subval === 'object' && subval.callback) {
subval.callback(arguments[0]);
return;
}
}
}
}
}
}
// Fallback: try common callback names
if (typeof onCaptchaSuccess === 'function') onCaptchaSuccess(arguments[0]);
else if (typeof captchaCallback === 'function') captchaCallback(arguments[0]);
""", token)
# Usage
driver = webdriver.Chrome()
driver.get("https://example.com/form")
# ... solve CAPTCHA via CaptchaAI ...
inject_recaptcha_token(driver, token)
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, "button[type=submit]").click()
Fix 2: Rückrufabhängige Formulare verarbeiten
Einige Formulare bleiben deaktiviert, bis der CAPTCHA-Rückruf ausgelöst wird:
def find_and_trigger_callback(driver, token):
"""Find the reCAPTCHA callback and trigger it."""
# Method 1: Extract callback from data attribute
callback_name = driver.execute_script("""
var widget = document.querySelector('.g-recaptcha');
if (widget) {
return widget.getAttribute('data-callback');
}
return null;
""")
if callback_name:
driver.execute_script(f"window['{callback_name}'](arguments[0]);", token)
return True
# Method 2: Extract from grecaptcha config
triggered = driver.execute_script("""
try {
var widgetId = 0;
var callback = ___grecaptcha_cfg.clients[widgetId].aa.l.callback;
if (typeof callback === 'function') {
callback(arguments[0]);
return true;
}
} catch(e) {}
return false;
""", token)
return triggered
Fix 3: Timing – Sofort lösen und verwenden
import requests
import time
def solve_and_inject_fast(driver, api_key, sitekey, page_url):
"""Solve CAPTCHA and inject token with minimal delay."""
# Submit solve request
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": 1,
}, timeout=30)
task_id = resp.json()["request"]
# Poll for result
time.sleep(15)
for _ in range(24):
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
token = data["request"]
# IMMEDIATELY inject — don't wait
inject_recaptcha_token(driver, token)
# Submit form within 5 seconds
time.sleep(0.5)
return True
if data["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(data["request"])
time.sleep(5)
raise TimeoutError("Solve timeout")
Fix 4: Korrekte PageURL für SPAs und Iframes
def get_correct_pageurl(driver):
"""Get the URL that reCAPTCHA actually sees."""
# Check if CAPTCHA is in an iframe
iframes = driver.find_elements(By.TAG_NAME, "iframe")
for iframe in iframes:
src = iframe.get_attribute("src") or ""
if "recaptcha" in src or "anchor" in src:
# CAPTCHA is in iframe — use parent page URL
return driver.current_url
# For SPAs, use current URL (may differ from initial load)
return driver.current_url
# WRONG — using the URL you navigated to
pageurl = "https://example.com/form" # May have redirected
# CORRECT — using the URL the browser is actually on
pageurl = get_correct_pageurl(driver)
Fix 5: Anti-Bot-Erkennung über CAPTCHA hinaus
Selbst mit einem gültigen Token kann die Website automatisierte Browser blockieren:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
def create_browser_driver():
"""Create a browser that avoids basic bot detection."""
options = Options()
# Remove automation indicators
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
# Set realistic window size
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=options)
return driver
driver = create_browser_driver()
Fix 6: Turnstile-Token-Injection
Cloudflare Turnstile verwendet einen anderen Injektionsansatz:
def inject_turnstile_token(driver, token):
"""Inject Turnstile token into the page."""
driver.execute_script("""
// Find Turnstile response input
var inputs = document.querySelectorAll(
'input[name="cf-turnstile-response"], ' +
'input[name="g-recaptcha-response"]'
);
inputs.forEach(function(input) {
input.value = arguments[0];
});
// Trigger change event
inputs.forEach(function(input) {
input.dispatchEvent(new Event('change', { bubbles: true }));
input.dispatchEvent(new Event('input', { bubbles: true }));
});
// Try Turnstile callback
if (window.turnstile) {
var widgets = document.querySelectorAll('[data-callback]');
widgets.forEach(function(w) {
var cb = w.getAttribute('data-callback');
if (typeof window[cb] === 'function') {
window[cb](arguments[0]);
}
});
}
""", token)
Debug-Checkliste
def debug_captcha_injection(driver, token):
"""Print debug info to diagnose injection failures."""
info = driver.execute_script("""
var result = {};
// Check textarea exists
var ta = document.querySelector('[name="g-recaptcha-response"]');
result.textarea_found = !!ta;
result.textarea_value_set = ta ? ta.value.length > 0 : false;
// Check reCAPTCHA loaded
result.grecaptcha_loaded = typeof grecaptcha !== 'undefined';
// Check for callback
var widget = document.querySelector('.g-recaptcha');
result.has_data_callback = widget ? !!widget.getAttribute('data-callback') : false;
result.callback_name = widget ? widget.getAttribute('data-callback') : null;
// Current URL
result.current_url = window.location.href;
// Check for errors in console (basic)
result.has_submit_button = !!document.querySelector('button[type=submit], input[type=submit]');
return result;
""")
for key, value in info.items():
print(f" {key}: {value}")
return info
Fehlerbehebung
| Symptom | Ursache | Beheben |
|---|---|---|
| Token gesetzt, aber Formular wird abgelehnt | Rückruf nicht ausgelöst | Suchen Sie die Rückruffunktion und rufen Sie sie auf |
| Die Schaltfläche „Senden“ bleibt deaktiviert | Callback ermöglicht es | Rückruf nach Token-Injektion auslösen |
| „Ungültiges CAPTCHA“ nach dem Absenden | Token abgelaufen | Reduzieren Sie die Zeit zwischen Lösung und Übermittlung |
| 403 nach dem Absenden des Formulars | Bot-Erkennung (kein CAPTCHA) | Browser-Flags und Proxy-Konfiguration prüfen |
| Funktioniert in Anfragen, schlägt im Browser fehl | Andere Seiten-URL | Verwenden Sie „driver.current_url“ als Seiten-URL |
FAQ
Warum funktioniert das Token in Anfragen, aber nicht im Browser?
Normalerweise, weil die Rückruffunktion nicht ausgelöst wird. Browserformulare verlassen sich häufig auf den Rückruf, um die Übermittlung zu ermöglichen oder ausgeblendete Felder festzulegen.
Muss ich einen bestimmten Browser verwenden?
Chrome/Chromium ist am kompatibelsten. Firefox funktioniert, erfordert jedoch möglicherweise andere Ansätze für CDP-Befehle. Verwenden Sie „undetected-chromedriver“ für Websites mit starker Bot-Erkennung.
Sollte ich den Headless-Modus verwenden?
Einige Websites erkennen Headless-Browser und lehnen Token ab. Probieren Sie zuerst den Headful-Modus aus und wechseln Sie dann mit den richtigen Flags zum Headless-Modus, wenn es funktioniert.
Verwandte Leitfäden
- Selenium CAPTCHA-Handling in Python
- Cloudflare Turnstile Fehler und Fehlerbehebung
Verwandte Leitfäden
- CaptchaAI Schnellstart
- API-Antwortformate und Fehlercodes
- reCAPTCHA v2 per API lösen