Hintergründe

reCAPTCHA v2-Callbackmechanismus: Wie Callbacke funktionieren und wie man sie auslöst

Wenn ein Nutzer eine reCAPTCHA v2-Challenge abschließt, ruft Google eine von der Website definierte JavaScript-Callbackfunktion auf. Dieser Callback aktiviert normalerweise eine Senden-Schaltfläche, validiert das Formular oder sendet eine AJAX-Anfrage. Nachdem Sie ein gelöstes Token von CaptchaAI eingefügt haben, müssen Sie denselben Callback auslösen – andernfalls erkennt das Formular nicht, dass das CAPTCHA gelöst wurde.


So funktionieren Callbacke

Die Site definiert einen Callback im reCAPTCHA-Widget:

<div class="g-recaptcha"
     data-sitekey="6Le-SITEKEY"
     data-callback="onCaptchaSuccess"
     data-expired-callback="onCaptchaExpired">
</div>

<script>
function onCaptchaSuccess(token) {
  document.getElementById('submit-btn').disabled = false;
  document.getElementById('captcha-token').value = token;
}
</script>

Wenn der Benutzer das CAPTCHA löst, ruft Googles JavaScript onCaptchaSuccess(token) auf. Als einziges Argument erhält die Funktion den Token-String.


Suche nach der Callback-Funktion

Methode 1: Überprüfen Sie das Datenrückrufattribut

// In browser console
const widget = document.querySelector('.g-recaptcha');
const callbackName = widget?.getAttribute('data-callback');
console.log('Callback:', callbackName);

Methode 2: Überprüfen Sie die Grecaptcha-Interna

Einige Websites verwenden grecaptcha.render() mit einer Callbackoption anstelle des data-callback-Attributs:

// Search page source for grecaptcha.render
document.querySelectorAll('script:not([src])').forEach(s => {
  if (s.textContent.includes('grecaptcha.render')) {
    console.log(s.textContent.match(/callback\s*:\s*(\w+)/)?.[1]);
  }
});

Methode 3: Callbackregistrierung abfangen

Führen Sie dies in DevTools aus, bevor die Seite geladen wird (Quellen →-Snippets):

const origRender = grecaptcha.render;
grecaptcha.render = function(container, params) {
  console.log('Render callback:', params.callback);
  console.log('Expired callback:', params['expired-callback']);
  return origRender.apply(this, arguments);
};

Auslösen des Callbacks nach der Token-Injektion

Python (Selen)

import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

API_KEY = "YOUR_API_KEY"
driver = webdriver.Chrome()
driver.get("https://example.com/login")

# Extract sitekey and callback
sitekey = driver.find_element(
    By.CSS_SELECTOR, ".g-recaptcha"
).get_attribute("data-sitekey")

callback = driver.find_element(
    By.CSS_SELECTOR, ".g-recaptcha"
).get_attribute("data-callback")

# Mit CaptchaAI lösen
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": driver.current_url,
    "json": "1",
}).json()
task_id = resp["request"]

token = None
for _ in range(24):
    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["status"] == 1:
        token = result["request"]
        break

# Inject token into textarea
driver.execute_script("""
    document.querySelector('textarea[name="g-recaptcha-response"]').value = arguments[0];
""", token)

# Trigger the callback
if callback:
    driver.execute_script(f"window['{callback}'](arguments[0]);", token)
    print(f"Triggered callback: {callback}")
else:
    # Fallback: try ___grecaptcha_cfg
    driver.execute_script("""
        try {
            var widgetId = Object.keys(___grecaptcha_cfg.clients)[0];
            var callback = ___grecaptcha_cfg.clients[widgetId].aa.l.callback;
            if (typeof callback === 'function') callback(arguments[0]);
        } catch(e) {}
    """, token)
    print("Triggered callback via ___grecaptcha_cfg")

JavaScript (Puppeteer)

const puppeteer = require('puppeteer');

// After solving and getting the token...
await page.evaluate((token, callbackName) => {
  // Set textarea value
  const textarea = document.querySelector(
    'textarea[name="g-recaptcha-response"]'
  );
  textarea.value = token;
  textarea.style.display = 'block'; // sometimes hidden

  // Trigger callback
  if (callbackName && typeof window[callbackName] === 'function') {
    window[callbackName](token);
    console.log(`Called ${callbackName}()`);
  } else {
    // Fallback: search grecaptcha config
    try {
      const clients = ___grecaptcha_cfg.clients;
      const widgetId = Object.keys(clients)[0];
      const cb = clients[widgetId]?.aa?.l?.callback;
      if (typeof cb === 'function') cb(token);
    } catch (e) {}
  }
}, token, callbackName);

Websites ohne Datenrückruf

Einige Websites verwenden keinen Callback. Stattdessen überprüfen sie grecaptcha.getResponse(), wenn das Formular gesendet wird. Überschreiben Sie für diese Websites die Funktion:

driver.execute_script("""
    const token = arguments[0];
    document.querySelector('textarea[name="g-recaptcha-response"]').value = token;
    // Override getResponse to return the token
    if (typeof grecaptcha !== 'undefined') {
        grecaptcha.getResponse = function() { return token; };
    }
""", token)

# Then submit the form normally
driver.find_element(By.CSS_SELECTOR, "form").submit()

Abgelaufene Callbacke

Einige Websites definieren data-expired-callback, um die Schaltfläche „Senden“ zu deaktivieren, wenn das Token abläuft. Wenn Ihr Token bald abläuft, wird dieser Callback möglicherweise ausgelöst und das Formular erneut gesperrt. Um dies zu vermeiden, lösen Sie die Lösung kurz vor der Abgabezeit.

// Check for expired callback
const expiredCallback = document.querySelector('.g-recaptcha')
  ?.getAttribute('data-expired-callback');
console.log('Expired callback:', expiredCallback);

Fehlerbehebung

Problem Ursache Lösung
Das Formular ist nach der Injektion immer noch deaktiviert Callback nicht ausgelöst Suchen Sie die Callbackfunktion und rufen Sie sie auf
ReferenceError: function not defined In einem Abschluss definierter Callback Verwenden Sie den ___grecaptcha_cfg-Fallback
Token eingefügt, aber AJAX nicht gesendet Der Callback löst AJAX aus, nicht das Absenden des Formulars Überprüfen Sie, was die Callback-Funktion bewirkt
Token akzeptiert, aber auf der Seite wird ein Fehler angezeigt Token ist vor dem Callback abgelaufen Lösen Sie die Lösung kurz vor der Abgabezeit

FAQ

Was ist, wenn überhaupt kein Callback erfolgt?

Einige Websites überprüfen das Token nur auf der Serverseite, wenn das Formular gesendet wird. In diesem Fall reicht es aus, den Textbereichswert g-recaptcha-response festzulegen und das Formular abzusenden.

Kann sich der Name der Callbackfunktion zwischen dem Laden der Seite ändern?

Ja, auf einigen Websites. Extrahieren Sie den Callbacknamen immer dynamisch aus dem DOM, anstatt ihn fest zu codieren.

Verwendet reCAPTCHA v3 denselben Callbackmechanismus?

Nein. reCAPTCHA v3 verwendet grecaptcha.execute(), das ein Versprechen zurückgibt. Es gibt kein sichtbares Widget oder data-callback-Attribut.


Lösen Sie reCAPTCHA v2 mit der richtigen Callbackbehandlung mithilfe von CaptchaAI

Holen Sie sich Ihren API-Schlüssel untercaptchaai.com.


Verwandte Leitfäden

  • reCAPTCHA v2 Unsichtbar: Triggererkennung
  • Extrahieren von reCAPTCHA-Parametern aus der Seitenquelle
  • Umgang mit mehreren CAPTCHAs auf einer einzelnen Seite
Kommentare sind für diesen Artikel deaktiviert.