Integrationen

Retool + CaptchaAI: Internes Tool zur Bearbeitung von CAPTCHA-Formularen

Eine Retool-App kann ein CAPTCHA nicht selbst anklicken – aber sie kann es auslagern. Genau das übernimmt CaptchaAI über zwei REST-Abfragen: Die erste übermittelt Sitekey und Page-URL, die zweite holt das fertige Token ab. Danach steht der Wert für g-recaptcha-response bereit wie jedes andere Abfrageergebnis.

Vorab: Bauen Sie ein solches Tool nur für Portale, zu denen Ihr Team rechtmäßigen Zugang hat. Alle Beispiele zeigen reCAPTCHA v2; ebenso lösbar sind reCAPTCHA v3, Cloudflare Turnstile, GeeTest v3 und Bild-CAPTCHAs. hCaptcha und FunCaptcha unterstützt CaptchaAI nicht, GeeTest v4 gilt als „bald verfügbar“.

Wann sich CAPTCHA-Lösung in Retool lohnt

Ein Wiener Operations-Team pflegt ein Retool-Backoffice, das jeden Morgen Sendungsdaten in ein Behördenportal überträgt. Das Formular dort ist mit reCAPTCHA v2 geschützt – die Sachbearbeitung klickt 60-mal täglich Ampeln und Zebrastreifen an. Übernimmt die App das, bleiben vier Schritte:

  1. Sitekey und Seiten-URL entgegennehmen
  2. Aufgabe an CaptchaAI übermitteln
  3. Ergebnis abfragen, bis die Lösung vorliegt
  4. Token für die Formularübermittlung bereitstellen

Schritt 1: CaptchaAI als REST-Ressource anlegen

  • Name: CaptchaAI
  • Basis-URL: https://ocr.captchaai.com
  • Authentifizierung: keine – der API-Schlüssel läuft als Query-Parameter mit

Angelegt wird die Ressource unter ResourcesCreate NewREST API. Alle folgenden Abfragen greifen darauf zu.

Schritt 2: Submit-Abfrage submitCaptcha bauen

  • Abfragename submitCaptcha, Ressource CaptchaAI
  • Action Type GET, URL-Pfad /in.php
Schlüssel Wert
key {{secretsStore.CAPTCHAAI_API_KEY}}
method userrecaptcha
googlekey {{sitekeyInput.value}}
pageurl {{pageurlInput.value}}
json 1

Transformer (optional):

// Parse the response
const data = {{ submitCaptcha.data }};
if (data.status === 1) {
  return { taskId: data.request, status: 'submitted' };
}
return { error: data.request, status: 'failed' };

Den API-Schlüssel legen Sie im Secrets Store ab (Settings → Secrets); hartcodiert sieht ihn jeder, der die App bearbeiten darf.

Schritt 3: Polling-Abfrage pollResult bauen

/in.php liefert nur eine Task-ID zurück, nicht die Lösung. Die holt eine zweite Abfrage namens pollResult – samt Transformer, der drei Fälle unterscheidet:

  • Ressource CaptchaAI, Action Type GET
  • URL-Pfad /res.php
Schlüssel Wert
key {{secretsStore.CAPTCHAAI_API_KEY}}
action get
id {{submitCaptcha.data.request}}
json 1
const data = {{ pollResult.data }};
if (data.status === 1) {
  return { token: data.request, status: 'solved' };
}
if (data.request === 'CAPCHA_NOT_READY') {
  return { status: 'pending' };
}
return { error: data.request, status: 'error' };

CAPCHA_NOT_READY ist kein Fehler, sondern die normale Antwort, solange die Lösung läuft.

Schritt 4: Polling-Schleife als JavaScript-Abfrage

Die Wartelogik kapselt eine JavaScript-Abfrage namens solveCaptcha: übermitteln, 15 Sekunden warten, dann im 5-Sekunden-Takt abfragen.

// solveCaptcha — JavaScript Query
async function solve() {
  // Submit the CAPTCHA task
  await submitCaptcha.trigger();
  const submitResult = submitCaptcha.data;

  if (submitResult.status !== 1) {
    return { error: submitResult.request, status: 'submit_failed' };
  }

  const taskId = submitResult.request;

  // Wait 15 seconds before first poll
  await new Promise(r => setTimeout(r, 15000));

  // Poll up to 20 times (100 seconds max)
  for (let i = 0; i < 20; i++) {
    await pollResult.trigger({
      additionalScope: { taskId: taskId }
    });

    const result = pollResult.data;

    if (result.status === 1) {
      return { token: result.request, status: 'solved' };
    }

    if (result.request !== 'CAPCHA_NOT_READY') {
      return { error: result.request, status: 'error' };
    }

    // Wait 5 seconds before next poll
    await new Promise(r => setTimeout(r, 5000));
  }

  return { error: 'Polling timeout', status: 'timeout' };
}

return solve();

Bleiben Sie bei rund 20 Durchläufen: JavaScript-Abfragen laufen in Retool nach 120 Sekunden ins Timeout. Mehr Durchläufe bringen nichts, Retool bricht vorher ab.

Schritt 5: Oberfläche der Retool-App aufbauen

Komponente Name Aufgabe
Text Input sitekeyInput Beschriftung „reCAPTCHA Sitekey“
Text Input pageurlInput Beschriftung „Seiten-URL“
Button solveButton onClick → solveCaptcha.trigger()
Text zeigt {{ solveCaptcha.isFetching }} als Statuszeile
Text Area tokenOutput Wert {{ solveCaptcha.data?.token }}, schreibgeschützt
Badge Erfolg oder Fehler laut {{ solveCaptcha.data?.status }}

Schritt 6: Token in der Folgeabfrage verwenden

  • Abfrage submitForm gegen Ihre Ziel-API, Action Type POST
  • Body: Formulardaten inklusive g-recaptcha-response: {{solveCaptcha.data.token}}

Ein Token ist nur kurz gültig, deshalb folgt diese Abfrage direkt auf die Lösung. Der Button „Formular absenden“ bleibt inaktiv, bis {{ solveCaptcha.data?.status === 'solved' }} zutrifft.

Typische Fehlerbilder beim CAPTCHA-Lösen in Retool

Symptom Ursache Vorgehen
Antwort kommt als Text statt JSON Parameter json fehlt json: 1 in beiden Abfragen ergänzen
ERROR_WRONG_USER_KEY Schlüssel fehlt im Secrets Store Wert unter Settings → Secrets prüfen
Token entsteht, wird aber abgelehnt Sitekey, Page-URL oder Sitzung passen nicht zusammen Parameter neu auslesen, Token in derselben Sitzung verwenden
Polling endet im Timeout Fehlercodes werden wie „noch nicht fertig“ behandelt Alle 5–10 Sekunden abfragen, bei Fehlercodes abbrechen

Häufige Fragen

Wie viele Threads braucht eine Retool-App?

So viele, wie die App gleichzeitig lösen lässt – CaptchaAI rechnet pro parallelem Thread ab, nicht pro CAPTCHA. Für einen Button, den mehrere Personen nacheinander drücken, genügt BASIC (15 $/Monat, 5 Threads); für Batch-Läufe passt ADVANCE (90 $/Monat, 50 Threads). Preise in US-Dollar.

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

Rund 120 Sekunden. Die absendende Abfrage sollte unmittelbar folgen – legen Sie das Token nicht in einem App-State ab, den jemand Stunden später erneut aufruft.

Funktioniert das auch mit selbst gehostetem Retool?

Ja. Cloud und On-Premise unterstützen beide REST-Ressourcen und JavaScript-Abfragen; die selbst gehostete Instanz braucht lediglich ausgehenden Zugriff auf ocr.captchaai.com.

Was gehört bei so einem Tool in die DSGVO-Dokumentation?

Der Ablauf, nicht die Lösung: Sitekey und Seiten-URL sind keine personenbezogenen Daten, die Formularinhalte Ihres Portals in aller Regel schon. Nehmen Sie den Workflow ins Verarbeitungsverzeichnis auf und klären Sie die Rechtsgrundlage intern ab.


Verwandte Leitfäden

Kommentare sind für diesen Artikel deaktiviert.