Tutoriels API

Paramètres CAPTCHA de la diapositive GeeTest et guide de l'API

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


Paramètres Master GeeTest -commencer par CaptchaAI.

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