Tutoriels

Extraction et résolution des paramètres du curseur GeeTest v3

Les CAPTCHA de curseur GeeTest v3 nécessitent deux paramètres pour être résolus : gt (un identifiant de site statique) et challenge (un jeton de session dynamique). Ce guide montre comment extraire les deux de n'importe quelle page et les soumettre à CaptchaAI.


Paramètres GeeTest v3 expliqués

Paramètre Descriptif Statique/Dynamic Exemple
gt Identifiant du site (32 caractères hexadécimaux) Statique par site 019924a82c70bb123aae90d483b6a0ed
challenge Jeton de session (32 caractères hexadécimaux) Chargement dynamique par page a3f5c8d2e1b04a6789012345678abcdf
api_server Sous-domaine API GeeTest (facultatif) Statique par site api-na.geetest.com

La valeur gt reste la même d’une requête à l’autre. La valeur challenge change à chaque chargement du CAPTCHA : vous devez en extraire un nouveau pour chaque tentative de résolution.


Méthode 1 : intercepter l'appel d'API de registre

La plupart des implémentations de GeeTest v3 récupèrent le défi à partir d'un point de terminaison d'enregistrement. La réponse ressemble à :

{
  "success": 1,
  "challenge": "a3f5c8d2e1b04a6789012345678abcdf",
  "gt": "019924a82c70bb123aae90d483b6a0ed",
  "new_captcha": true
}

Python (requêtes)

import requests
import re

session = requests.Session()
html = session.get("https://example.com/login").text

# Find the register endpoint
register_url = re.search(
    r'(https?://[^"\']+(?:register|captcha|geetest)[^"\']*)',
    html
)

if register_url:
    resp = session.get(register_url.group(1)).json()
    gt = resp["gt"]
    challenge = resp["challenge"]
    print(f"gt: {gt}")
    print(f"challenge: {challenge}")

JavaScript (interception du réseau Marionnettiste)

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch();
const page = await browser.newPage();

let geetestParams = {};

page.on('response', async (response) => {
  const url = response.url();
  if (url.includes('register') || url.includes('captcha')) {
    try {
      const json = await response.json();
      if (json.gt && json.challenge) {
        geetestParams = {
          gt: json.gt,
          challenge: json.challenge,
        };
        console.log('Captured GeeTest params:', geetestParams);
      }
    } catch (e) {}
  }
});

await page.goto('https://example.com/login', { waitUntil: 'networkidle2' });
console.log('Final params:', geetestParams);

Méthode 2 : Extraire de la source de la page

Certains sites intègrent les paramètres directement dans des scripts HTML ou en ligne :

import re

# From data attributes
gt_match = re.search(r'data-gt=["\']([a-f0-9]{32})', html)
challenge_match = re.search(r'data-challenge=["\']([a-f0-9]{32})', html)

# From JavaScript variables
if not gt_match:
    gt_match = re.search(r'gt\s*[=:]\s*["\']([a-f0-9]{32})', html)
if not challenge_match:
    challenge_match = re.search(r'challenge\s*[=:]\s*["\']([a-f0-9]{32})', html)

gt = gt_match.group(1) if gt_match else None
challenge = challenge_match.group(1) if challenge_match else None
print(f"gt={gt}, challenge={challenge}")

Méthode 3 : Hook initGeetest

GeeTest v3 s'initialise via initGeetest(). Interceptez-le avant l'exécution des scripts de page :

// Puppeteer: inject before page scripts
await page.evaluateOnNewDocument(() => {
  window.__geetestConfig = null;
  const origInit = window.initGeetest;

  Object.defineProperty(window, 'initGeetest', {
    set(fn) {
      this._initGeetest = function(config, callback) {
        window.__geetestConfig = config;
        console.log('GeeTest config:', JSON.stringify(config));
        return fn(config, callback);
      };
    },
    get() { return this._initGeetest; }
  });
});

await page.goto('https://example.com/login', { waitUntil: 'networkidle2' });

const config = await page.evaluate(() => window.__geetestConfig);
// config = { gt: "019924a...", challenge: "a3f5c8d...", product: "bind", ... }

Résoudre GeeTest v3 avec CaptchaAI

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "geetest",
    "gt": gt,
    "challenge": challenge,
    "pageurl": "https://example.com/login",
    "json": "1",
}).json()

if resp["status"] != 1:
    raise Exception(f"Submit error: {resp['request']}")

task_id = resp["request"]

# Poll
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": "1"
    }).json()

    if result["status"] == 1:
        solution = result["request"]
        print(f"Solution: {solution}")
        break
    if result["request"] != "CAPCHA_NOT_READY":
        raise Exception(f"Error: {result['request']}")

Javascript

const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: {
    key: 'YOUR_API_KEY',
    method: 'geetest',
    gt: geetestParams.gt,
    challenge: geetestParams.challenge,
    pageurl: 'https://example.com/login',
    json: 1,
  }
});
const taskId = submit.data.request;

let solution = null;
for (let i = 0; i < 30; i++) {
  await new Promise(r => setTimeout(r, 5000));
  const poll = await axios.get('https://ocr.captchaai.com/res.php', {
    params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
  });
  if (poll.data.status === 1) {
    solution = poll.data.request;
    break;
  }
}
console.log('Solution:', solution);

Injection de la solution GeeTest

La réponse CaptchaAI pour GeeTest v3 inclut challenge, validate et seccode :

# solution is a pipe-delimited string or JSON object
# Parse and inject into the form
import json

sol = json.loads(solution) if isinstance(solution, str) else solution

driver.execute_script("""
    const form = document.querySelector('form');
    function addHidden(name, value) {
        let input = form.querySelector(`input[name="${name}"]`);
        if (!input) {
            input = document.createElement('input');
            input.type = 'hidden';
            input.name = name;
            form.appendChild(input);
        }
        input.value = value;
    }
    addHidden('geetest_challenge', arguments[0]);
    addHidden('geetest_validate', arguments[1]);
    addHidden('geetest_seccode', arguments[2]);
""", sol["challenge"], sol["validate"], sol["seccode"])

Dépannage

Problème Parce que Corriger
ERROR_BAD_PARAMETERS gt ou challenge manquant Les deux sont requis ; extraire de nouvelles valeurs
Défi périmé Jeton de défi expiré Extrayez un nouveau défi immédiatement avant de le soumettre
Valeur gt incorrecte Copié depuis un autre site gt est spécifique au site ; réextraire de la cible
Solution rejetée par le site Défi expiré lors de la résolution Réduisez le temps entre l’extraction et la soumission

FAQ

Quelle est la durée de validité d'un défi GeeTest ?

Généralement 60 à 120 secondes. Extrayez le défi et soumettez-le immédiatement à CaptchaAI.

Quelle est la différence entre GeeTest v3 et v4 ?

GeeTest v3 utilise les paramètres gt/TOKEN1ZZ et un curseur. GeeTest v4 utilise captcha_id et propose plusieurs types de défis (clic, correspondance, diapositive).


Résolvez les CAPTCHA GeeTest v3 avec CaptchaAI

Obtenez votre clé API surcaptchaai.com.


Guides associés

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