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:
- Sitekey und Seiten-URL entgegennehmen
- Aufgabe an CaptchaAI übermitteln
- Ergebnis abfragen, bis die Lösung vorliegt
- 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 Resources → Create New → REST API. Alle folgenden Abfragen greifen darauf zu.
Schritt 2: Submit-Abfrage submitCaptcha bauen
- Abfragename
submitCaptcha, RessourceCaptchaAI - 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 TypeGET - 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
submitFormgegen Ihre Ziel-API, Action TypePOST - 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.