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
- Ouvrez l'onglet Réseau de DevTools →
- Filtrer par
register-slideougettype.phpouget.php - Déclenchez le captcha et recherchez la demande d'initialisation
- La réponse contient
gt,challengeet parfoisapi_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
- Comment fonctionne le CAPTCHA GeeTest v3
- Erreurs et correctifs courants de GeeTest v3
- GeeTest et reCAPTCHA