Explications Techniques

Flux de travail défi-réponse GeeTest v3 : analyse technique approfondie

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
&gt=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

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.

Les commentaires sont désactivés pour cet article.