GeeTest v3 verwendet ein mehrstufiges Challenge-Response-Protokoll. Im Gegensatz zu reCAPTCHA, bei dem ein einziger Token alles löst, umfasst GeeTest einen Registrierungsschritt, einen Challenge-Token-Austausch und eine abschließende Validierung – wobei jeder Schritt unterschiedliche Parameter erzeugt. Das Verständnis dieses Ablaufs ist für die korrekte Integration mit CaptchaAI unerlässlich.
Das Zwei-Phasen-Protokoll
GeeTest v3 arbeitet in zwei Phasen:
Phase 1: Registrierung (serverseitig)
Das Backend der Website kontaktiert GeeTest, um eine neue Herausforderung zu registrieren:
Site Backend → GeeTest Server: "Give me a challenge for this user"
GeeTest Server → Site Backend: { gt, challenge, new_captcha }
Site Backend → Browser: Passes gt and challenge to the page
Phase 2: Verifizierung (Client-Seite + Server-Seite)
Der Browser rendert die Herausforderung, der Benutzer löst sie und das Ergebnis wird überprüft:
Browser: Renders slider/puzzle using gt + challenge
User: Solves the challenge
Browser → Site Backend: { geetest_challenge, geetest_validate, geetest_seccode }
Site Backend → GeeTest Server: Verifies the three values
GeeTest Server → Site Backend: { result: "success" }
Detaillierter Ablauf
Schritt 1: Registrierungs-API-Aufruf
Das Backend der Site ruft den Registrierungsendpunkt von GeeTest auf:
GET https://api.geetest.com/register.php?gt=GT_ID&json_format=1
Antwort:
{
"success": 1,
"gt": "81dc9bdb52d04dc20036dbd8313ed055",
"challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"new_captcha": true
}
| Parameter | Bedeutung |
|---|---|
gt |
GeeTest-ID – identifiziert das GeeTest-Konto der Site |
challenge |
Einzigartiger Challenge-Token für diese Sitzung |
new_captcha |
Ob das neue CAPTCHA-Format verwendet werden soll |
Wichtig: Der challenge-Wert ist einmalig und zeitlich begrenzt. Jeder Seitenaufruf erzeugt eine neue Herausforderung.
Schritt 2: Challenge-Rendering
Der Browser empfängt gt und challenge und initialisiert das GeeTest-Widget:
initGeetest({
gt: "81dc9bdb52d04dc20036dbd8313ed055",
challenge: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
offline: false,
new_captcha: true,
product: "float"
}, function(captchaObj) {
captchaObj.appendTo('#captcha-container');
captchaObj.onSuccess(function() {
var result = captchaObj.getValidate();
// result contains: geetest_challenge, geetest_validate, geetest_seccode
});
});
Schritt 3: Herausforderungstypen
GeeTest v3 unterstützt mehrere Herausforderungstypen:
| Typ | Benutzeraktion | Beschreibung |
|---|---|---|
| Schieberegler | Puzzleteil ziehen | Verschieben Sie ein Puzzleteil, um das Bild zu vervollständigen |
| Symbolklick | Klicken Sie der Reihe nach auf die Symbole | Klicken Sie in der angezeigten Reihenfolge auf bestimmte Symbole |
| Wortklick | Klicken Sie auf Zeichen | Klicken Sie auf chinesische Zeichen in der richtigen Reihenfolge |
| Leerzeichen | Klicken Sie auf/select | Herausforderung zum räumlichen Denken |
Der Herausforderungstyp wird von GeeTest basierend auf der Konfiguration der Site und dem Benutzerrisikoprofil bestimmt.
Schritt 4: Lösungswerte
Nach der Lösung erzeugt das Widget drei Werte:
{
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
| Wert | Beschreibung |
|---|---|
geetest_challenge |
Modifizierter Challenge-Token (Original + 2 zusätzliche Zeichen) |
geetest_validate |
Validierungs-Hash |
geetest_seccode |
Sicherheitscode (validieren + `\ |
Schritt 5: Serverseitige Überprüfung
Das Site-Backend sendet diese drei Werte zur Überprüfung an GeeTest:
POST https://api.geetest.com/validate.php
seccode=abc123def456_validate|jordan
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy
&sdk=geetest-python-3.0.0
GeeTest antwortet mit:
{
"seccode": "abc123def456_validate",
"validate": "abc123def456_validate"
}
Extrahieren von Parametern für CaptchaAI
Zum Lösen mit CaptchaAI benötigen Sie gt und challenge von der Seite:
Methode 1: Registrierungsantwort abfangen
from playwright.sync_api import sync_playwright
import json
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
geetest_params = {}
def handle_response(response):
if "register" in response.url and "geetest" in response.url:
data = response.json()
geetest_params["gt"] = data.get("gt")
geetest_params["challenge"] = data.get("challenge")
page.on("response", handle_response)
page.goto("https://example.com/login")
# Wait for GeeTest to load
page.wait_for_selector(".geetest_holder")
print(f"gt: {geetest_params.get('gt')}")
print(f"challenge: {geetest_params.get('challenge')}")
Methode 2: Aus Seiten-JavaScript extrahieren
gt = page.evaluate("() => document.querySelector('[data-gt]')?.dataset.gt")
challenge = page.evaluate("() => document.querySelector('[data-challenge]')?.dataset.challenge")
Methode 3: Vom initGeetest-Aufruf
Durchsuchen Sie die Seitenquelle nach dem initGeetest-Aufruf:
import re
source = page.content()
gt_match = re.search(r"gt['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)
challenge_match = re.search(r"challenge['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)
Lösung mit CaptchaAI
Senden Sie die extrahierten Parameter:
POST https://ocr.captchaai.com/in.php
key=YOUR_API_KEY
&method=geetest
>=81dc9bdb52d04dc20036dbd8313ed055
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
&pageurl=https://example.com/login
&json=1
Umfrage zum Ergebnis:
GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1
CaptchaAI gibt Folgendes zurück:
{
"status": 1,
"request": {
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
}
Sie erhalten alle drei Werte, die für den Verifizierungsschritt der Site erforderlich sind.
Offline- vs. Online-Modus
GeeTest v3 verfügt über einen Fallback-Modus, wenn GeeTest-Server nicht erreichbar sind:
| Modus | success-Wert |
Verhalten |
|---|---|---|
| Online | 1 |
Normale Challenge-Response mit GeeTest-Servern |
| Offline | 0 |
Vereinfachte lokale Überprüfung |
Im Offline-Modus wird die Challenge lokal generiert und die Verifizierung ist einfacher. Die meisten Websites verwenden den Online-Modus.
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| ## Fehlerbehebung |
| Problem | Ursache | Lösung |
|---|---|---|
| GeeTest-Challenge läuft ab | Zu lange zwischen Registrierung und Lösung | Challenge sofort nach Registrierung lösen, kein Caching |
| validate-Parameter wird abgelehnt | Challenge wurde mehrfach verwendet | Neue Challenge pro Anfrage registrieren |
| gt/challenge stimmen nicht überein | Aus falscher Netzwerkanfrage extrahiert | Registrierungs-Request des Backends prüfen, nicht Client-Side |
Verwandte Leitfäden
- GeeTest v3 per API lösen
- GeeTest v3 Slider-Parameter extrahieren
- Häufige GeeTest v3 Fehler und Lösungen