API-Tutorials

So lösen Sie reCAPTCHA Invisible mithilfe der API

Ein Klick auf „Absenden“, und dann passiert nichts: kein Kontrollkästchen, keine Fehlermeldung, keine Weiterleitung. Dahinter steckt fast immer reCAPTCHA Invisible. Die kurze Antwort für die Integration lautet: Sie übermitteln dieselbe Aufgabe wie bei reCAPTCHA v2, ergänzen in der Anfrage aber invisible=1 und übergeben das gelöste Token an die Callback-Funktion der Seite, statt es nur in das versteckte Formularfeld zu schreiben.

Genau dieser zweite Punkt kostet in der Praxis die meiste Zeit. Das versteckte Feld g-recaptcha-response ist zwar weiterhin vorhanden, doch die meisten Invisible-Implementierungen werten es nicht aus – sie warten auf den Aufruf der Funktion, die in data-callback hinterlegt ist. Wer nur das Feld befüllt, sieht eine Seite, die stehen bleibt, ohne einen Fehler zu melden.

Der Weg dorthin führt über vier Schritte: Erkennung im HTML, Übermittlung an CaptchaAI, Polling und Callback-Aufruf – mit Python- und Node.js-Code zum direkten Übernehmen.

Unsicher, ob es reCAPTCHA Invisible oder klassisches v2 ist? Die Unterscheidungsmerkmale stehen in reCAPTCHA v2 und Invisible im Vergleich.

Der Ablauf in vier Schritten

  1. Widget im HTML erkennen und den Sitekey auslesen.
  2. Aufgabe mit invisible=1 an in.php übermitteln.
  3. Status über res.php abfragen, bis das Token vorliegt.
  4. Token an die Callback-Funktion übergeben und das Formular absenden.

reCAPTCHA Invisible löst CaptchaAI laut den offiziellen Solver-Angaben in unter 30 Sekunden, mit hoher Erfolgsquote auf unterstützten Typen. Kalkulieren Sie Ihr Timeout also großzügiger als bei reCAPTCHA v3 – und keinesfalls knapper als eine halbe Minute.

Was Sie vorher brauchen

Baustein Woher er kommt
CaptchaAI API-Schlüssel captchaai.com/api.php
Sitekey Attribut data-sitekey am Widget-Div oder an der Schaltfläche
Page-URL Vollständige URL der Seite, auf der das CAPTCHA ausgelöst wird
Browser-Steuerung Selenium oder Puppeteer, um den Callback im Seitenkontext auszuführen

Der API-Schlüssel gehört in eine Umgebungsvariable, nicht in den Quelltext; in den Beispielen steht deshalb YOUR_API_KEY.

Schritt 1: reCAPTCHA Invisible im HTML erkennen

<!-- Option 1: div with data-size="invisible" -->
<div class="g-recaptcha" data-sitekey="6LdKlZEU..." data-size="invisible" data-callback="onSubmit"></div>

<!-- Option 2: button with data-sitekey (invisible by default) -->
<button data-sitekey="6LdKlZEU..." data-callback="onSubmit">Submit</button>

<!-- Option 3: programmatic execution -->
<script>
  grecaptcha.execute('6LdKlZEU...', {action: 'submit'});
</script>

Drei Signale genügen für die Einordnung:

  • data-size="invisible" am Widget-Container,
  • eine Schaltfläche, die den Sitekey direkt trägt,
  • ein grecaptcha.execute() im Skript ohne sichtbaren Container.

Lesen Sie den Sitekey aus – und notieren Sie sich im selben Zug den Wert von data-callback. Den brauchen Sie in Schritt 4.

Schritt 2: Aufgabe an CaptchaAI übermitteln

import requests

response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "6LdKlZEUAAAAAPoxm...",
    "pageurl": "https://example.com/signup",
    "invisible": 1,
    "json": 1
})

task_id = response.json()["request"]
const params = new URLSearchParams({
  key: "YOUR_API_KEY", method: "userrecaptcha",
  googlekey: "6LdKlZEUAAAAAPoxm...",
  pageurl: "https://example.com/signup",
  invisible: 1, json: 1,
});
const res = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
const { request: taskId } = await res.json();

Ausschlaggebend ist invisible: 1. Fehlt der Parameter, verarbeitet die API die Aufgabe als klassisches reCAPTCHA v2, und die Zielseite weist das Token anschließend ab. Für die Enterprise-Variante ergänzen Sie zusätzlich enterprise=1; Methode (userrecaptcha) und Endpunkt bleiben in beiden Fällen identisch.

Schritt 3: Ergebnis abfragen

import time

for _ in range(40):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        token = result["request"]
        break
    if result.get("request") != "CAPCHA_NOT_READY":
        raise RuntimeError(f"Error: {result['request']}")

Das Polling fragt den Status im Fünf-Sekunden-Takt ab. Solange CAPCHA_NOT_READY zurückkommt, läuft die Aufgabe noch; jede andere Antwort ist ein Fehlercode und sollte die Schleife sofort beenden. Protokollieren Sie diesen Code zusammen mit Sitekey und Page-URL – das ist die schnellste Diagnosegrundlage.

Schritt 4: Token über den Callback übergeben

An dieser Stelle scheitern die meisten Integrationen. reCAPTCHA Invisible erwartet einen Funktionsaufruf, nicht bloß einen still gesetzten Feldwert:

# Selenium example
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://example.com/signup")

# Find the callback name
callback = driver.execute_script("""
    var el = document.querySelector('[data-callback]');
    if (el) return el.getAttribute('data-callback');
    var btn = document.querySelector('[data-sitekey]');
    if (btn) return btn.getAttribute('data-callback');
    return null;
""")

# Execute the callback with the token
if callback:
    driver.execute_script(f"window['{callback}']('{token}');")
else:
    # Fallback: fill hidden field and submit
    driver.execute_script(f"""
        document.getElementById('g-recaptcha-response').innerHTML = '{token}';
        document.querySelector('form').submit();
    """)
// Puppeteer example
await page.evaluate((token) => {
  const el = document.querySelector('[data-callback]') || document.querySelector('[data-sitekey]');
  const callbackName = el?.getAttribute('data-callback');

  if (callbackName && window[callbackName]) {
    window[callbackName](token);
  } else {
    document.getElementById('g-recaptcha-response').innerHTML = token;
    document.querySelector('form').submit();
  }
}, token);

Das Muster ist bewusst zweistufig: zuerst der Callback-Name aus data-callback, ersatzweise das versteckte Feld g-recaptcha-response plus form.submit(). Entscheidend ist das Timing, denn das Token bleibt nur rund 120 Sekunden gültig. Lösen Sie es deshalb erst, wenn alle Formularfelder gefüllt sind, und übergeben Sie es unmittelbar danach.

Komplette Lösungsfunktion

import requests
import time

def solve_invisible_recaptcha(api_key, sitekey, page_url):
    submit = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": api_key, "method": "userrecaptcha", "googlekey": sitekey,
        "pageurl": page_url, "invisible": 1, "json": 1
    }).json()

    if submit.get("status") != 1:
        raise RuntimeError(f"Submit error: {submit.get('request')}")

    task_id = submit["request"]

    for _ in range(40):
        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.get("status") == 1:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise RuntimeError(f"Solve error: {result.get('request')}")

    raise TimeoutError("Timed out")

token = solve_invisible_recaptcha("YOUR_API_KEY", "6LdKlZEU...", "https://example.com/signup")

Die Funktion kapselt Übermittlung, Polling und Fehlerbehandlung. Das Token, das sie zurückgibt, reichen Sie an den Callback aus Schritt 4 weiter.

Praxisbeispiel: nächtlicher Registrierungstest im DACH-Stack

Ein Team in Hamburg prüft die Registrierungsstrecke seines Shopware-Shops jede Nacht in der eigenen Staging-Umgebung. Der GitLab-CI-Runner läuft auf einem Hetzner-Server, die Suite startet um 3 Uhr, und vor dem Anlegen des Kontos sitzt reCAPTCHA Invisible – ausgelöst vom Klick auf „Konto erstellen“. Vor der Integration brach der Job genau dort ab; morgens lag ein rotes Pipeline-Ergebnis vor, das über die Anwendung selbst nichts aussagte.

Mit dem Muster aus Schritt 4 läuft der Test durch: Das Token wird gelöst, sobald das Formular ausgefüllt ist, der Callback übernimmt es, die Suite prüft weiter. Für vier parallele Browser-Sitzungen reicht BASIC (15 $/Monat, 5 Threads); kommen weitere Shops und Sprachversionen dazu, ist STANDARD (30 $/Monat, 15 Threads) die nächste Stufe. Abgerechnet wird pro Thread – nicht pro Lösung: Ein Nachtlauf mit 200 Formulardurchläufen kostet damit nicht mehr als einer mit 20. Die Preise verstehen sich in US-Dollar.

Zwei Punkte, die in DACH-Projekten regelmäßig aufkommen: Testen Sie auf Umgebungen, die Ihnen gehören oder für die eine schriftliche Freigabe vorliegt, und prüfen Sie bei der Datenextraktion aus fremden Systemen die DSGVO-Grundlage – IP-Adressen zählen zu den personenbezogenen Daten.

Typische Stolperfallen

Symptom Wahrscheinliche Ursache Abhilfe
Zielseite lehnt das Token ab invisible=1 fehlt in der Anfrage Parameter ergänzen und die Aufgabe neu übermitteln
Seite reagiert nach dem Callback nicht falscher Callback-Name oder leere Pflichtfelder Namen aus data-callback prüfen, Formular vorher vollständig füllen
Token wird als abgelaufen zurückgewiesen zu früh gelöst, Ablauf nach rund 120 Sekunden Lösung erst kurz vor dem Absenden anstoßen
Enterprise-Formular bleibt hängen enterprise=1 fehlt neben invisible=1 beide Parameter gemeinsam senden

Vollständig lauffähiges Beispiel

Sie möchten lieber ein fertiges Projekt mit Umgebungsvariablen, Polling, Wiederholungslogik und Fehlerbehandlung übernehmen?

Das vollständige Beispielprojekt auf GitHub ansehen →


FAQ

Wie lange dauert das Lösen von reCAPTCHA Invisible?

Unter 30 Sekunden laut den Solver-Angaben von CaptchaAI, bei hoher Erfolgsquote auf unterstützten Typen. Die 40 Durchläufe à 5 Sekunden im Beispielcode fangen auch Lastspitzen ab.

Wie lange bleibt ein gelöstes Token gültig?

Rund 120 Sekunden. Fordern Sie die Lösung deshalb erst an, wenn alle übrigen Formularfelder gefüllt sind, und rufen Sie den Callback direkt nach Erhalt des Tokens auf. Tokens auf Vorrat zu halten bringt nichts – sie sind abgelaufen, bevor Sie sie brauchen.

Was tun, wenn sich keine Callback-Funktion finden lässt?

Zuerst das versteckte Feld g-recaptcha-response befüllen und das Formular absenden; manche Implementierungen kommen damit aus. Führt das nicht weiter, durchsuchen Sie das Seiten-JavaScript nach Funktionen, die eine reCAPTCHA-Antwort entgegennehmen – häufig steht der Name im grecaptcha.render()-Aufruf.

Wie viele Threads brauche ich für parallele Läufe?

Einen Thread je gleichzeitig laufender CAPTCHA-Abfrage. Vier parallele Browser-Instanzen benötigen also vier Threads. BASIC (15 $/Monat) enthält 5 Threads, ADVANCE (90 $/Monat) bereits 50; die Zahl der Lösungen pro Thread ist nicht begrenzt.

Verwandte Leitfäden

Jetzt mit reCAPTCHA Invisible starten

Holen Sie sich Ihren API-Schlüssel unter captchaai.com/api.php, ergänzen Sie invisible=1 in Ihrem vorhandenen v2-Code und übergeben Sie das Token über den Callback aus Schritt 4. Mehr braucht es für die erste erfolgreiche Lösung nicht.

Kommentare sind für diesen Artikel deaktiviert.