Maîtrisez chaque paramètre dans les soumissions GeeTest CAPTCHA. Découvrez comment extraire gt, challenge et d'autres valeurs, et soumettez-les correctement à CaptchaAI.
Paramètres GeeTest v3
| Paramètre | Obligatoire | Descriptif |
|---|---|---|
gt |
Oui | ID de compte GeeTest (32 caractères hexadécimaux). Trouvé dans la source de la page ou dans la réponse de l'API |
challenge |
Oui | Chaîne de défi spécifique à la session. Doit être frais par résolution |
pageurl |
Oui | URL complète de la page affichant le CAPTCHA |
api_server |
Non | Sous-domaine du serveur API GeeTest personnalisé |
Extraire les paramètres d'une page
# extract_geetest_params.py
import requests
import re
import json
def extract_geetest_v3(page_url, session=None):
"""Extract GeeTest v3 gt and challenge from a page."""
if session is None:
session = requests.Session()
session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36"
)
resp = session.get(page_url, timeout=15)
html = resp.text
# Method 1: Extract gt from HTML
gt_match = re.search(r'gt["\']?\s*[:=]\s*["\']([a-f0-9]{32})', html)
gt = gt_match.group(1) if gt_match else None
# Method 2: Find API endpoint that returns challenge
api_match = re.search(r'(https?://[^"\']+register-slide[^"\']*)', html)
challenge = None
if api_match:
api_url = api_match.group(1)
api_resp = session.get(api_url, timeout=10)
try:
data = api_resp.json()
challenge = data.get("challenge")
gt = gt or data.get("gt")
except json.JSONDecodeError:
pass
if not challenge:
# Try embedded challenge
ch_match = re.search(r'challenge["\']?\s*[:=]\s*["\']([a-f0-9]+)', html)
challenge = ch_match.group(1) if ch_match else None
return {"gt": gt, "challenge": challenge, "pageurl": page_url}
# Usage
params = extract_geetest_v3("https://example.com/login")
print(f"gt: {params['gt']}")
print(f"challenge: {params['challenge']}")
Soumettre GeeTest à CaptchaAI
# solve_geetest.py
import requests
import time
import os
def solve_geetest(gt, challenge, pageurl, api_server=None):
"""Solve GeeTest v3 slide CAPTCHA via CaptchaAI."""
api_key = os.environ["CAPTCHAAI_API_KEY"]
payload = {
"key": api_key,
"method": "geetest",
"gt": gt,
"challenge": challenge,
"pageurl": pageurl,
"json": 1,
}
if api_server:
payload["api_server"] = api_server
# Submit
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data=payload,
timeout=30,
)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(f"Submit failed: {result.get('request')}")
task_id = result["request"]
# Poll — GeeTest typically solves in 10-20 seconds
time.sleep(10)
for _ in range(30):
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key,
"action": "get",
"id": task_id,
"json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
return data["request"] # Returns challenge, validate, seccode
if data["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(data["request"])
time.sleep(5)
raise TimeoutError("GeeTest solve timeout")
Utiliser la solution
La solution renvoie trois valeurs qui doivent être soumises au point de terminaison de validation du site cible :
# submit_solution.py
import json
def submit_geetest_solution(session, validation_url, solution, original_challenge):
"""Submit GeeTest solution to the target site."""
# Parse solution if string
if isinstance(solution, str):
solution = json.loads(solution)
payload = {
"geetest_challenge": solution.get("challenge", original_challenge),
"geetest_validate": solution.get("validate", ""),
"geetest_seccode": solution.get("seccode", ""),
}
resp = session.post(validation_url, data=payload, timeout=30)
return resp
# Complete flow
def full_geetest_flow(page_url, validation_url):
import requests
from extract_geetest_params import extract_geetest_v3
session = requests.Session()
session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36"
)
# Step 1: Extract parameters
params = extract_geetest_v3(page_url, session)
print(f"gt: {params['gt']}, challenge: {params['challenge'][:16]}...")
# Step 2: Solve
solution = solve_geetest(
params["gt"], params["challenge"], params["pageurl"],
)
print("Solved!")
# Step 3: Submit
resp = submit_geetest_solution(
session, validation_url, solution, params["challenge"],
)
print(f"Validation response: {resp.status_code}")
return resp
Défi Fraîcheur
Le paramètre challenge est spécifique à la session et expire rapidement :
# fresh_challenge.py
import time
def get_fresh_challenge(session, register_url):
"""Always fetch a fresh challenge before solving."""
resp = session.get(register_url, timeout=10)
data = resp.json()
challenge = data.get("challenge")
if not challenge:
raise ValueError("No challenge returned")
return challenge
def solve_with_fresh_challenge(session, gt, register_url, pageurl):
"""Ensure challenge is fresh before submitting to CaptchaAI."""
challenge = get_fresh_challenge(session, register_url)
# Submit immediately — don't let it expire
solution = solve_geetest(gt, challenge, pageurl)
return solution
Règle clé : Extrayez le défi et soumettez-le à CaptchaAI en quelques secondes. Un défi obsolète échouera toujours.
Serveur API personnalisé
Certains sites utilisent un sous-domaine GeeTest personnalisé :
# The api_server parameter specifies a custom GeeTest backend
# Default: api.geetest.com
# Custom examples: api-na.geetest.com, api.geetest.com/ajax-custom
solution = solve_geetest(
gt="abc123...",
challenge="def456...",
pageurl="https://example.com/login",
api_server="api-na.geetest.com", # North America endpoint
)
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
ERROR_CAPTCHA_UNSOLVABLE |
Défi périmé | Récupérez un nouveau défi immédiatement avant de le soumettre |
validate est vide |
Mauvaise version de l'API | Utilisez version=4 pour les sites GeeTest v4 |
| Solution rejetée par le site | seccode manquant |
Assurez-vous que les trois champs sont soumis |
Paramètre gt introuvable |
Chargé via JavaScript | Utilisez Selenium ou vérifiez les réponses XHR pour le point de terminaison du registre |
FAQ
Quelle est la différence entre gt et challenge ?
gt est l'ID de compte GeeTest du site - il reste le même. challenge est généré par session et doit être extrait à nouveau à chaque fois.
Quelle est la durée de validité d'un défi ?
Généralement 60 à 120 secondes. Extrayez-le et soumettez-le immédiatement à CaptchaAI.
Que fait api_server ?
Il indique à CaptchaAI quel serveur API GeeTest utiliser. Obligatoire uniquement lorsque le site utilise un point de terminaison GeeTest autre que celui par défaut. Vérifiez les requêtes réseau de la page pour api-*.geetest.com.
Guides connexes
- Modifications de GeeTest v4
- Comparaison GeeTest et BLS
Paramètres Master GeeTest -commencer par CaptchaAI.