GeeTest v3 utilise un protocole défi-réponse en plusieurs étapes. Contrairement à reCAPTCHA où un seul jeton résout tout, GeeTest implique une étape d'enregistrement, un échange de jetons de défi et une validation finale, chacun produisant des paramètres différents. Comprendre ce flux est essentiel pour une intégration correcte avec CaptchaAI.
Le protocole en deux phases
GeeTest v3 fonctionne en deux phases :
Phase 1 : enregistrement (côté serveur)
Le backend du site contacte GeeTest pour enregistrer un nouveau défi :
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 : Vérification (côté client + côté serveur)
Le navigateur affiche le défi, l'utilisateur le résout et le résultat est vérifié :
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" }
Flux détaillé
Étape 1 : Appel d'API d'inscription
Le backend du site appelle le point de terminaison d'inscription de GeeTest :
GET https://api.geetest.com/register.php?gt=GT_ID&json_format=1
Réponse :
{
"success": 1,
"gt": "81dc9bdb52d04dc20036dbd8313ed055",
"challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"new_captcha": true
}
| Paramètre | Signification |
|---|---|
gt |
GeeTest ID — identifie le compte GeeTest du site |
challenge |
Jeton de défi unique pour cette session |
new_captcha |
S'il faut utiliser le nouveau format CAPTCHA |
Important : La valeur challenge est à usage unique et limitée dans le temps. Chaque chargement de page génère un nouveau défi.
Étape 2 : Défier le rendu
Le navigateur reçoit gt et challenge et initialise le widget GeeTest :
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
});
});
Étape 3 : Types de défis
GeeTest v3 prend en charge plusieurs types de défis :
| Tapez | Action de l'utilisateur | Descriptif |
|---|---|---|
| Curseur | Faites glisser une pièce de puzzle | Déplacez une pièce du puzzle pour compléter l'image |
| Cliquez sur l'icône | Cliquez sur les icônes dans l'ordre | Cliquez sur des icônes spécifiques dans la séquence affichée |
| Clic sur mot | Cliquez sur les caractères | Cliquez sur les caractères chinois dans le bon ordre |
| Espace | Cliquez sur/select | Défi du raisonnement spatial |
Le type de défi est déterminé par GeeTest en fonction de la configuration du site et du profil de risque de l'utilisateur.
Étape 4 : Valeurs de la solution
Après résolution, le widget produit trois valeurs :
{
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
| Valeur | Descriptif |
|---|---|
geetest_challenge |
Jeton de défi modifié (original + 2 caractères supplémentaires) |
geetest_validate |
Hachage de validation |
geetest_seccode |
Code de sécurité (valider + `\ |
Étape 5 : Vérification côté serveur
Le backend du site envoie ces trois valeurs à GeeTest pour vérification :
POST https://api.geetest.com/validate.php
seccode=abc123def456_validate|jordan
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy
&sdk=geetest-python-3.0.0
GeeTest répond avec :
{
"seccode": "abc123def456_validate",
"validate": "abc123def456_validate"
}
Extraction des paramètres pour CaptchaAI
Pour résoudre avec CaptchaAI, vous avez besoin de gt et challenge à partir de la page :
Méthode 1 : intercepter la réponse d’enregistrement
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')}")
Méthode 2 : Extraire de la page JavaScript
gt = page.evaluate("() => document.querySelector('[data-gt]')?.dataset.gt")
challenge = page.evaluate("() => document.querySelector('[data-challenge]')?.dataset.challenge")
Méthode 3 : à partir de l’appel initGeetest
Recherchez la source de la page pour l'appel initGeetest :
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)
Résolution avec CaptchaAI
Soumettez les paramètres extraits :
POST https://ocr.captchaai.com/in.php
key=YOUR_API_KEY
&method=geetest
>=81dc9bdb52d04dc20036dbd8313ed055
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
&pageurl=https://example.com/login
&json=1
Sondage pour le résultat :
GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1
CaptchaAI renvoie :
{
"status": 1,
"request": {
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
}
Vous recevez les trois valeurs nécessaires à l'étape de vérification du site.
Mode hors ligne ou en ligne
GeeTest v3 dispose d'un mode de secours lorsque les serveurs GeeTest sont inaccessibles :
| Mode | Valeur success |
Comportement |
|---|---|---|
| En ligne | 1 |
Défi-réponse normal avec les serveurs GeeTest |
| Hors ligne | 0 |
Vérification locale simplifiée |
En mode hors ligne, le challenge est généré localement et la vérification est plus simple. La plupart des sites utilisent le mode en ligne.
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
La valeur challenge est vide |
L'inscription a échoué | Vérifiez si le site charge correctement GeeTest |
| Solution rejetée | Défi expiré | Extrayez le nouveau challenge et résolvez-le immédiatement |
Valeur gt incorrecte |
Plusieurs instances GeeTest sur la page | Extrayez gt du bon widget |
| Trois valeurs renvoyées mais le formulaire n'est pas soumis | Champs de formulaire manquants | Injectez les trois valeurs dans les entrées correctes |
FAQ
Pourquoi GeeTest a-t-il besoin à la fois de gt et de challenge ?
Le gt identifie le compte GeeTest du site (persistant). Le challenge est un jeton spécifique à la session qui empêche les attaques par relecture : chaque défi ne peut être résolu qu'une seule fois.
Puis-je réutiliser un défi GeeTest ?
Non. Chaque valeur challenge est à usage unique. Une fois le problème résolu (ou expiré), vous devez en obtenir un nouveau auprès de l'API d'enregistrement.
Combien de temps dure un défi GeeTest ?
Les défis expirent généralement dans un délai de 1 à 2 minutes. Résolvez et soumettez rapidement après avoir extrait les paramètres.
Articles connexes
- Résoudre Geetest V3 Nodejs
- Résolution de Geetest V3 Nodejs Captchaai
- Analyse approfondie de l'API d'évaluation d'entreprise Recaptcha
Prochaines étapes
Résolvez les défis GeeTest v3 —récupérez votre clé API CaptchaAIet intégrez la réponse à trois valeurs dans votre flux de travail.