Tutoriels API

Comment résoudre GeeTest v3 à l'aide de l'API

GeeTest v3 présente des défis interactifs : puzzles de diapositives, sélections d'icônes ou correspondance de mots. Contrairement à reCAPTCHA, GeeTest utilise un flux de vérification personnalisé avec trois paramètres (gt, challenge, api_server) que vous devez extraire de la page avant de résoudre.

Ce guide décrit le processus complet d'extraction des paramètres GeeTest et de résolution du défi avec l'API CaptchaAI.


Exigences

Article Valeur
Clé API CaptchaAI Depuiscaptchaai.com
Valeur GeeTest gt Identifiant statique par site
GeeTest challenge Valeur dynamique par session
URL de la page L'URL où apparaît GeeTest
Langue Python 3.7+ ou Node.js 14+

Étape 1 : Extraire les paramètres du GeeTest

GeeTest nécessite trois paramètres. Le gt est statique (identique pour chaque requête), tandis que challenge change par session.

Méthode 1 : onglet Réseau

  1. Ouvrez l'onglet Réseau de DevTools →
  2. Filtrer par register-slide ou gettype.php ou get.php
  3. Déclenchez le captcha et recherchez la demande d'initialisation
  4. La réponse contient gt, challenge et parfois api_server
{
  "success": 1,
  "gt": "019924a82c70bb123aae90d483087f94",
  "challenge": "12345678abc90def12345678abc90def",
  "new_captcha": true
}

Méthode 2 : source de la page

// Search page source for initGeetest or gt value
document.querySelectorAll('script').forEach(s => {
  if (s.textContent.includes('initGeetest')) {
    console.log(s.textContent);
  }
});

Méthode 3 : point de terminaison de l'API

De nombreux sites récupèrent les paramètres GeeTest depuis leur propre API :

# The site's registration endpoint
params_response = requests.get("https://example.com/api/captcha/register")
data = params_response.json()
gt = data["gt"]
challenge = data["challenge"]

Étape 2 : Soumettez la tâche à CaptchaAI

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "geetest",
    "gt": "019924a82c70bb123aae90d483087f94",
    "challenge": "12345678abc90def12345678abc90def",
    "api_server": "api.geetest.com",  # Optional, use if site specifies
    "pageurl": "https://example.com/login",
    "json": 1
})

data = response.json()
if data.get("status") != 1:
    raise Exception(f"Submit error: {data.get('request')}")

task_id = data["request"]
print(f"Task submitted: {task_id}")

Noeud.js

const axios = require('axios');

const API_KEY = 'YOUR_API_KEY';

async function submitGeeTest(gt, challenge, pageurl) {
  const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
    params: {
      key: API_KEY,
      method: 'geetest',
      gt,
      challenge,
      api_server: 'api.geetest.com',
      pageurl,
      json: 1
    }
  });

  if (data.status !== 1) throw new Error(`Submit error: ${data.request}`);
  return data.request;
}

Étape 3 : Sonder la solution

La résolution GeeTest renvoie trois valeurs : challenge, validate et seccode.

Python

def get_geetest_solution(task_id):
    for attempt 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.get("status") == 1:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {result.get('request')}")

    raise Exception("Timeout")

solution = get_geetest_solution(task_id)
# solution = {
#   "geetest_challenge": "12345678abc90def12345678abc90def1a",
#   "geetest_validate": "abcdef1234567890abcdef1234567890",
#   "geetest_seccode": "abcdef1234567890abcdef1234567890|jordan"
# }

Noeud.js

async function getGeeTestSolution(taskId) {
  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const { data } = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
    });
    if (data.status === 1) return data.request;
    if (data.request !== 'CAPCHA_NOT_READY') throw new Error(data.request);
  }
  throw new Error('Timeout');
}

Étape 4 : Soumettre la solution au site cible

Envoyez les trois valeurs au point de terminaison de vérification du site :

# Submit the GeeTest solution with the form data
verify_response = requests.post("https://example.com/api/login", data={
    "username": "user@example.com",
    "password": "password123",
    "geetest_challenge": solution["geetest_challenge"],
    "geetest_validate": solution["geetest_validate"],
    "geetest_seccode": solution["geetest_seccode"]
})

print(f"Login status: {verify_response.status_code}")

Exemple Python complet

import requests
import time

API_KEY = "YOUR_API_KEY"
SITE_URL = "https://example.com/login"

# 1. Get GeeTest parameters from the site
params = requests.get("https://example.com/api/captcha/register").json()

# 2. Submit to CaptchaAI
submit = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "geetest",
    "gt": params["gt"],
    "challenge": params["challenge"],
    "pageurl": SITE_URL,
    "json": 1
}).json()
task_id = submit["request"]

# 3. Poll for solution
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.get("status") == 1:
        solution = result["request"]
        break

# 4. Submit to site
login = requests.post(SITE_URL, data={
    "username": "user@example.com",
    "password": "pass",
    "geetest_challenge": solution["geetest_challenge"],
    "geetest_validate": solution["geetest_validate"],
    "geetest_seccode": solution["geetest_seccode"]
})
print(f"Result: {login.status_code}")

Dépannage

Erreur Parce que Corriger
ERROR_BAD_PARAMETERS GT ou défi manquant Les deux sont obligatoires – extrait de la page
ERROR_CAPTCHA_UNSOLVABLE Défi expiré ou invalide Récupérer un nouveau défi sur le site
Solution rejetée par le site Valeur de défi périmée Le défi est celui de l’usage unique ; obtenez-en un nouveau à chaque tentative
geetest_validate est vide La résolution a échoué en interne Réessayez avec un nouveau défi

Exemple entièrement exécutable

Besoin d'un projet de travail complet avec configuration de l'environnement, interrogation, tentatives et gestion des erreurs ?

Voir l'exemple exécutable complet sur GitHub →


FAQ

Pourquoi dois-je relever un nouveau défi à chaque fois ?

La valeur challenge est à usage unique. Une fois consommé (que ce soit par une résolution réussie ou une expiration), le backend du site le rejettera. Récupérez toujours un nouveau défi avant chaque résolution.

Qu'est-ce que le paramètre api_server ?

Il précise quel serveur GeeTest gère la vérification. Les valeurs communes sont api.geetest.com et api-na.geetest.com. Si le site utilise un serveur personnalisé, incluez-le dans votre demande.

Combien de temps prend la résolution du GeeTest ?

Généralement 15 à 30 secondes. Les puzzles de diapositives et les défis d'icônes prennent des temps similaires.

Puis-je résoudre GeeTest v4 avec cette méthode ?

Non. GeeTest v4 utilise un protocole différent. Vérifiez si CaptchaAI prend en charge la version spécifique de GeeTest sur le site.

Quelle est la différence entre les défis de diapositives et de clics du GeeTest ?

GeeTest v3 propose plusieurs types de défis (diapositive, clic d'icône, correspondance de mots), mais les paramètres et le flux de l'API sont identiques. CaptchaAI gère tous les types v3 de manière transparente.


Guides associés

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