Wenn eine GeeTest-v3-Integration sporadisch fehlschlägt, obwohl der Code seit Wochen unverändert läuft, liegt die Ursache fast immer bei einem einzigen Parameter: einem veralteten challenge. GeeTest v3 erzeugt bei jedem Seitenaufruf einen neuen challenge-Wert – wer ihn zwischenspeichert und wiederverwendet, erntet Ablehnungen, die aussehen wie API-Fehler, aber keine sind.
Die GeeTest-v3-Dokumentation von CaptchaAI ist an dieser Stelle unmissverständlich: Für jede Lösungsanfrage brauchen Sie einen frischen challenge. Sobald das CAPTCHA auf der Seite geladen ist, wird der alte Wert ungültig.
Alle übrigen Fehler verteilen sich auf drei Phasen: beim Senden an in.php, beim Abfragen des Ergebnisses über res.php und bei der Validierung auf der Zielseite (die API liefert gültige Werte, die Seite lehnt sie trotzdem ab). Dieser Leitfaden geht jede Fehlerklasse durch – jeweils mit der schnellsten Korrektur.
Schnelldiagnose: zuerst die Fehlerphase bestimmen
Bevor Sie einzelne Fehlercodes durchgehen, grenzen Sie die Phase ein – die antwortende URL zeigt sofort, wo es klemmt:
- Sendephase (
in.php) – Antworten wieERROR_WRONG_USER_KEY,ERROR_BAD_PARAMETERSoderERROR_PAGEURLbetreffen die Übermittlung. Ursache ist fast immer ein fehlender oder fehlerhafter Parameter. - Abfragephase (
res.php) – Meldungen wieCAPCHA_NOT_READYoderERROR_CAPTCHA_UNSOLVABLEbetreffen das Abholen des Ergebnisses. Hier ist ein veralteterchallengedie häufigste Ursache. - Validierungsphase (Zielseite) – Die API liefert gültige Werte, die Seite lehnt sie dennoch ab. Meist stimmt die Feldzuordnung oder der Seitenkontext nicht.
Loggen Sie die Roh-Antworten von in.php und res.php getrennt, dann ist die Zuordnung eindeutig. Die folgenden Abschnitte gehen jede Phase im Detail durch.
Fehler Nr. 1: der veraltete challenge-Wert
Wenn Sie nur eine Sache zuerst prüfen können, dann die Frische des challenge.
GeeTest v3 arbeitet mit zwei zentralen Parametern:
gt– der öffentliche Website-Schlüssel (statisch, ändert sich nicht)challenge– der dynamische Challenge-Schlüssel (ändert sich bei jedem Seitenaufruf)
Warum es bricht
Der challenge-Wert entsteht in dem Moment, in dem das GeeTest-Widget auf der Seite initialisiert wird. Erfassen Sie ihn einmal und verwenden ihn über mehrere Lösungsanfragen hinweg, wird jede Anfrage nach der ersten entweder
- schon beim Senden von der API abgelehnt oder
- ein Ergebnis erzeugen, das die Zielseite verwirft, weil der
challengeabgelaufen ist.
So beheben Sie es
Vor jeder Lösungsanfrage untersuchen Sie den Netzwerkverkehr der Seite und suchen den API-Aufruf, der einen frischen challenge zurückgibt. Wiederholen Sie genau diese Anfrage, um einen neuen Wert zu erhalten, und übermitteln Sie ihn sofort an CaptchaAI.
# Pseudocode: fetch a fresh challenge before each solve
import requests
def get_fresh_challenge(target_url):
"""Hit the GeeTest init endpoint to get a new challenge."""
resp = requests.get(f"{target_url}/geetest/register", timeout=10)
data = resp.json()
return data["challenge"], data["gt"]
challenge, gt = get_fresh_challenge("https://example.com")
# Now submit to CaptchaAI immediately — do not delay
Faustregel: Liegen zwischen dem Abruf des
challengeund dem Absenden der Lösungsanfrage mehr als ein paar Sekunden, aktualisieren Sie den Wert.
Beispiel aus der Praxis: Ein auf einem Hetzner-Server laufender Scraping-Worker fragt ein login-geschütztes Portal ab, dessen Anmeldeseite ein GeeTest-v3-Slider absichert. Solange der Worker den challenge unmittelbar vor jeder Anfrage neu abruft, läuft alles stabil. Wird der Wert dagegen einmal beim Start geladen und über Stunden wiederverwendet, häufen sich ERROR_CAPTCHA_UNSOLVABLE-Antworten – nicht wegen eines API-Problems, sondern weil jeder challenge längst abgelaufen ist.
Fehler beim Senden an in.php
Diese Fehler treten auf, wenn Sie die Aufgabe an https://ocr.captchaai.com/in.php übermitteln. Vier davon lassen sich direkt aus der Antwort ablesen:
| Meldung | Ursache | Fix |
|---|---|---|
ERROR_WRONG_USER_KEY |
API-Schlüsselformat falsch (muss 32 Zeichen lang sein) | Schlüssel unter captchaai.com/api.php prüfen; keine Zusatzzeichen, keine Leerzeichen |
ERROR_KEY_DOES_NOT_EXIST |
Korrekt formatiert, gehört aber zu keinem aktiven Konto | Im CaptchaAI-Dashboard anmelden und aktiven Schlüssel bestätigen |
ERROR_ZERO_BALANCE |
Im aktuellen Tarif keine freien Threads | Warten, Parallelität reduzieren oder in einen größeren Tarif wechseln |
| HTML- oder 500/502-Antwort | Vorübergehender serverseitiger Fehler, kein Parameterproblem | 5–10 Sekunden warten und die Anfrage wiederholen |
Zwei weitere Fehler verlangen einen genaueren Blick auf die Parameter.
ERROR_PAGEURL
Ursache: Der Parameter pageurl fehlt in der Anfrage.
Fix: Ergänzen Sie die vollständige URL der Seite, auf der das GeeTest-Widget geladen wird. Beispiel:
pageurl=https://example.com/login
ERROR_BAD_PARAMETERS
Ursache: Ein oder mehrere Pflichtfelder fehlen oder sind fehlerhaft. Für GeeTest sind folgende Parameter erforderlich:
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
key |
String | Ja | Ihr CaptchaAI-API-Schlüssel |
method |
String | Ja | Muss geetest sein |
gt |
String | Ja | Statischer öffentlicher Website-Schlüssel |
challenge |
String | Ja | Dynamischer Challenge-Schlüssel (muss frisch sein) |
pageurl |
String | Ja | Vollständige Seiten-URL |
Fix: Stellen Sie sicher, dass gt, challenge und pageurl vorhanden und korrekt formatiert sind.
Fehler beim Abfragen über res.php
Diese Fehler treten auf, wenn Sie das Ergebnis unter https://ocr.captchaai.com/res.php abfragen. Wichtig vorab: CAPCHA_NOT_READY ist kein Fehler, sondern bedeutet, dass die Lösung noch läuft – GeeTest-v3-Lösungen dauern bei CaptchaAI in der Regel weniger als 12 Sekunden bei hoher Erfolgsquote. Warten Sie dann 5 Sekunden und fragen Sie erneut ab; werten Sie die Meldung nie als Misserfolg.
| Meldung | Bedeutung | Fix |
|---|---|---|
CAPCHA_NOT_READY |
Kein Fehler – die Lösung läuft noch | 5 Sekunden warten, erneut abfragen |
ERROR_WRONG_ID_FORMAT |
Captcha-ID ist nicht rein numerisch | Exakte ID von in.php unverändert übernehmen |
ERROR_WRONG_CAPTCHA_ID |
ID passt zu keiner übermittelten Aufgabe | Richtige ID aus der Sende-Antwort verwenden; bei mehreren Aufgaben die passende abfragen |
ERROR_CAPTCHA_UNSOLVABLE |
Häufig veralteter challenge oder nicht unterstützte GeeTest-Variante |
challenge aktualisieren und erneut senden |
ERROR_INTERNAL_SERVER_ERROR |
Serverseitiges Problem bei CaptchaAI | 10 Sekunden warten und erneut versuchen |
Fehlt der Parameter action oder ist er leer, antwortet die API mit ERROR_EMPTY_ACTION. Übergeben Sie action=get in jeder Abfrage:
https://ocr.captchaai.com/res.php?key=YOUR_KEY&action=get&id=CAPTCHA_ID
Wenn die Zielseite trotz gültiger Antwort ablehnt
Das sind die am schwersten zu diagnostizierenden Fälle: Die CaptchaAI-API liefert ein gültiges Ergebnis, die Zielseite verwirft es dennoch.
Bei einer erfolgreichen GeeTest-v3-Lösung gibt die API drei Werte zurück:
{
"challenge": "1a2b3456cd67890e12345fab678901c2de",
"validate": "09fe8d7c6ba54f32e1dcb0a9fedc8765",
"seccode": "12fe3d4c56789ba01f2e345d6789c012|jordan"
}
Diese müssen an die Zielseite übergeben werden als:
| API-Antwortfeld | Feld der Zielseite |
|---|---|
challenge |
geetest_challenge |
validate |
geetest_validate |
seccode |
geetest_seccode |
Vier Fehlermodi decken praktisch alle diese Fälle ab – jeweils mit charakteristischem Symptom und gezielter Korrektur:
| Fehlermodus | Symptom | Ursache | Fix |
|---|---|---|---|
| Falsche Feldzuordnung | API liefert Werte, Zielseite lehnt sie sofort ab | Werte landen in den falschen Feldern oder auf dem falschen Anfragepfad | Netzwerkverkehr einer manuellen Lösung beobachten, die POST-Anfrage mit dem GeeTest-Ergebnis suchen und deren Feldnamen exakt übernehmen |
Veralteter challenge im Upstream |
Seite meldet den challenge als abgelaufen oder ungültig |
challenge wurde zu früh erfasst oder wiederverwendet |
Unmittelbar vor jeder Lösungsanfrage einen frischen challenge abrufen – nicht zwischenspeichern, nicht wiederverwenden |
| Falscher Seitenkontext | Validierung scheitert auch bei frischen Eingaben | Der gesendete pageurl stimmt nicht mit der tatsächlichen Widget-Seite überein |
Exakte URL inklusive Protokoll und Pfad verwenden; bei AJAX-Nachladen die URL der jeweiligen Route nehmen |
| Abweichende Anfragestruktur | Felder stimmen, das Anfrageformat nicht | Zielseite erwartet einen bestimmten Content-Type (JSON-Body vs. formularcodiert) oder zusätzliche Formularfelder | Sende-Anfrage mit dem Netzwerkverkehr einer manuellen Lösung vergleichen; Content-Type, Feldreihenfolge und Zusatzfelder angleichen |
Für datengetriebene Portale gilt in der DACH-Region zusätzlich: IP-Adressen und abgerufene Nutzerdaten fallen unter die DSGVO. Prüfen Sie vor dem Produktivbetrieb Ihres Scraping- oder Automatisierungs-Workflows die Rechtsgrundlage und dokumentieren Sie Ihre Datenflüsse – unabhängig davon, wie zuverlässig die CAPTCHA-Lösung selbst arbeitet.
Python: vollständige GeeTest-v3-Lösung mit frischem challenge
import time
import requests
API_KEY = "YOUR_CAPTCHAAI_API_KEY"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def get_fresh_challenge(target_url):
"""Fetch a fresh GeeTest challenge from the target page."""
resp = requests.get(f"{target_url}/api/geetest/register", timeout=10)
data = resp.json()
return data["gt"], data["challenge"]
def solve_geetest_v3(api_key, gt, challenge, pageurl):
"""Submit a GeeTest v3 challenge and return the validation package."""
# Submit
submit_resp = requests.post(
SUBMIT_URL,
data={
"key": api_key,
"method": "geetest",
"gt": gt,
"challenge": challenge,
"pageurl": pageurl,
"json": 1,
},
timeout=30,
)
submit_resp.raise_for_status()
submit_data = submit_resp.json()
if submit_data.get("status") != 1:
raise RuntimeError(f"Submit failed: {submit_data}")
captcha_id = submit_data["request"]
print(f"Task created — captcha ID: {captcha_id}")
# Wait before first poll
time.sleep(15)
# Poll for result
for _ in range(60):
result_resp = requests.get(
RESULT_URL,
params={
"key": api_key,
"action": "get",
"id": captcha_id,
"json": 1,
},
timeout=30,
)
result_resp.raise_for_status()
result_data = result_resp.json()
if result_data.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result_data.get("status") == 1:
return result_data["request"]
raise RuntimeError(f"Polling error: {result_data}")
raise TimeoutError("GeeTest v3 solve timed out")
# Usage: always fetch a fresh challenge first
PAGE_URL = "https://example.com/login"
gt, challenge = get_fresh_challenge(PAGE_URL)
result = solve_geetest_v3(API_KEY, gt, challenge, PAGE_URL)
print(f"Result: {result}")
# The result contains: challenge, validate, seccode
# Map them to: geetest_challenge, geetest_validate, geetest_seccode
Node.js: vollständige GeeTest-v3-Lösung mit frischem challenge
const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function getFreshChallenge(targetUrl) {
const resp = await fetch(`${targetUrl}/api/geetest/register`);
const data = await resp.json();
return { gt: data.gt, challenge: data.challenge };
}
async function solveGeetestV3(apiKey, gt, challenge, pageurl) {
// Submit
const submitResp = await fetch(SUBMIT_URL, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: apiKey,
method: "geetest",
gt: gt,
challenge: challenge,
pageurl: pageurl,
json: "1",
}),
});
const submitData = await submitResp.json();
if (submitData.status !== 1) {
throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
}
const captchaId = submitData.request;
console.log(`Task created — captcha ID: ${captchaId}`);
await sleep(15_000);
// Poll for result
for (let i = 0; i < 60; i++) {
const resultResp = await fetch(
`${RESULT_URL}?${new URLSearchParams({
key: apiKey,
action: "get",
id: captchaId,
json: "1",
})}`
);
const resultData = await resultResp.json();
if (resultData.request === "CAPCHA_NOT_READY") {
await sleep(5_000);
continue;
}
if (resultData.status === 1) {
return resultData.request;
}
throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
}
throw new Error("GeeTest v3 solve timed out");
}
// Usage
const PAGE_URL = "https://example.com/login";
(async () => {
const { gt, challenge } = await getFreshChallenge(PAGE_URL);
const result = await solveGeetestV3(API_KEY, gt, challenge, PAGE_URL);
console.log("Result:", result);
// Map result fields to: geetest_challenge, geetest_validate, geetest_seccode
})();
FAQ
Wie oft muss ich einen neuen challenge abrufen?
Vor jeder einzelnen Lösungsanfrage. Ein challenge ist an einen konkreten Seitenaufruf gebunden und verfällt innerhalb weniger Sekunden. Rufen Sie den Wert direkt vor dem Aufruf von in.php ab und übermitteln Sie ihn ohne Verzögerung; zwischengespeicherte oder über mehrere Anfragen wiederverwendete Werte sind die häufigste Fehlerquelle.
Wie erkenne ich, ob der Fehler beim Senden oder beim Abfragen liegt?
An der antwortenden URL. Fehler, die in.php zurückgibt (ERROR_WRONG_USER_KEY, ERROR_BAD_PARAMETERS, ERROR_PAGEURL), betreffen die Übermittlung. Meldungen von res.php (CAPCHA_NOT_READY, ERROR_CAPTCHA_UNSOLVABLE) betreffen die Ergebnisphase. Loggen Sie beide Roh-Antworten getrennt, dann ist die Zuordnung eindeutig.
Kostet ein fehlgeschlagener GeeTest-Versuch einen Thread?
CaptchaAI rechnet pro gleichzeitigem Thread ab, nicht pro Lösung – ein Thread ist so lange belegt, wie eine Anfrage in Bearbeitung ist. Ein sofort abgelehnter Sende-Fehler gibt den Thread umgehend wieder frei; hängende Wiederholungen mit veraltetem challenge binden dagegen unnötig Threads. Die Tarife reichen von BASIC (15 $/Monat, 5 Threads) bis VIP-3 (7.500 $/Monat, 5.000 Threads).
Worin unterscheidet sich GeeTest v3 von reCAPTCHA v2?
GeeTest v3 ist eine Slider-/Puzzle-Abfrage, kein Kontrollkästchen. Es verlangt einen dynamischen challenge, der pro Lösung neu sein muss, und liefert drei Validierungsfelder (challenge, validate, seccode) statt eines einzelnen Tokens. Wie reCAPTCHA v2 dagegen funktioniert, zeigt reCAPTCHA v2 per API lösen.
Ist GeeTest v4 bei CaptchaAI verfügbar?
Dieser Leitfaden behandelt ausschließlich GeeTest v3, das generell verfügbar ist. GeeTest v4 ist bei CaptchaAI noch nicht verfügbar (Status: bald verfügbar); den aktuellen Stand der unterstützten Typen finden Sie in den CaptchaAI API-Dokumenten.
GeeTest-Workflow reparieren – Checkliste
Wenn Ihre GeeTest-Integration streikt, arbeiten Sie diese vier Punkte der Reihe nach ab:
challengeprüfen – Ist der Wert frisch? Holen Sie ihn unmittelbar vor jeder Lösung neu.- Parameter prüfen –
gt,challengeundpageurlmüssen vollständig und korrekt sein. - Feldzuordnung prüfen –
challenge,validateundseccodegehören exakt in die Feldergeetest_challenge,geetest_validateundgeetest_seccode. - Mit manueller Lösung vergleichen – Erfassen Sie über die Browser-DevTools die exakte Anfragestruktur einer erfolgreichen manuellen GeeTest-Lösung.
Starten Sie mit dem CaptchaAI GeeTest-v3-Löser, gleichen Sie Ihre Parameter mit den API-Dokumenten ab und lesen Sie So funktioniert GeeTest v3, wenn Sie den Challenge-Ablauf im Detail verstehen möchten.
Iterationsprotokoll
| Iteration | Fokus | Änderungen |
|---|---|---|
| Entwurf 1 | Struktur und Inhalt | Erster Entwurf zur Fehlerbehebung – 3 Fehlerphasen, Fehler-Fix-Tabelle, FAQ |
| Entwurf 2 | Technische Genauigkeit | Alle Fehlercodes und GeeTest-Parameter gegen captchaai.com/api-docs geprüft. API-Parametertabelle ergänzt. Feldzuordnung challenge/validate/seccode bestätigt. |
| Entwurf 3 | Codebeispiele | Vollständige Python- und Node.js-Beispiele mit Abruf eines frischen challenge ergänzt. Pseudocode für das Aktualisierungsmuster ergänzt. |
| Entwurf 4 | Tiefe der Validierungsfehler | Abschnitt zur Zielseitenvalidierung um vier Fehlermodi erweitert. Feldzuordnungstabelle ergänzt. Diagnose abweichender Anfragestrukturen ergänzt. |
| Entwurf 5 | Finaler QA-Feinschliff | Abgleich aller Fehlercodes mit der offiziellen Dokumentation. Kurzreferenztabelle ergänzt. Intro verschärft. Querverweise auf Cluster-Artikel ergänzt. FAQ-Antworten schemabereit bestätigt. |
Visuelles Asset-Briefing
Heldenbild
- Alt-Text: Entwickler bei der Fehlerbehebung von GeeTest-v3-Fehlern – Diagnose von Sende-, Abfrage- und Validierungsfehlern
- Muss zeigen: Debugging-Kontext mit Fehlerphasen und Fehlerpunkten
- Dateiname: geetest-v3-errors-troubleshooting-hero.png
Bild im Artikel 1
- Platzierung: Nach „Fehler beim Abfragen über res.php“
- Typ: Entscheidungsbaum
- Alt-Text: Entscheidungsbaum für GeeTest-v3-Fehler – Sende- vs. Abfrage- vs. Validierungsfehler
- Dateiname: geetest-v3-error-decision-tree.png
Bild im Artikel 2
- Platzierung: Nach „Wenn die Zielseite trotz gültiger Antwort ablehnt“
- Typ: Ursachen-und-Lösungen-Diagramm
- Alt-Text: Diagramm mit häufigen Ursachen für die Ablehnung durch die Zielseite bei GeeTest v3 und deren Lösungen
- Dateiname: geetest-v3-validation-causes-fixes.png
Verwandte Artikel
- GeeTest v3 per API lösen
- GeeTest-Slide-CAPTCHA: Parameter und API-Leitfaden
- Häufige Grid-Image-CAPTCHA-Fehler und Korrekturen