Fehlerbehebung

Browser-Automatisierungs-CAPTCHA schlägt fehl, aber die API funktioniert: Debug-Anleitung

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


Verwandte Leitfäden

Kommentare sind für diesen Artikel deaktiviert.