Туториалы по API

GeeTest Slide Параметры CAPTCHA и руководство по API

Освойте каждый параметр в представленных GeeTest CAPTCHA. Узнайте, как извлечь gt, challenge и другие значения и правильно отправить их в CaptchaAI.


Параметры GeeTest v3

Параметр Необходимый Описание
gt Да Идентификатор учетной записи GeeTest (32-значный шестнадцатеричный код). Найдено в исходном коде страницы или ответе API.
challenge Да Строка запроса, специфичная для сеанса. Должно быть свежим для каждого решения
pageurl Да Полный URL-адрес страницы с CAPTCHA
api_server Нет Пользовательский субдомен сервера GeeTest API

Извлечение параметров со страницы

# 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://https://staging.example.com/qa-login")
print(f"gt: {params['gt']}")
print(f"challenge: {params['challenge']}")

Отправка 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")

Использование решения

Решение возвращает три значения, которые необходимо отправить в конечную точку проверки целевого сайта:

# 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

Вызов свежести

Параметр challenge зависит от сеанса и срок его действия быстро истекает:

# 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

Основное правило: извлеките задание и отправьте его в CaptchaAI в течение нескольких секунд. Устаревший вызов всегда провалится.


Пользовательский API-сервер

Некоторые сайты используют собственный поддомен GeeTest:

# 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://https://staging.example.com/qa-login",
    api_server="api-na.geetest.com",  # North America endpoint
)

Поиск неисправностей

Проблема Причина Исправить
ERROR_CAPTCHA_UNSOLVABLE Устаревший вызов Получите новый вызов непосредственно перед отправкой
validate пуст. Неверная версия API Используйте version=4 для сайтов GeeTest v4.
Решение отклонено сайтом Отсутствует seccode Убедитесь, что все три поля заполнены.
Параметр gt не найден Загружено через JavaScript Используйте Selenium или проверьте ответы XHR для конечной точки регистрации.

Часто задаваемые вопросы

В чем разница между gt и challenge?

gt — это идентификатор учетной записи GeeTest сайта, он остается прежним. challenge генерируется для каждого сеанса и каждый раз должен извлекаться заново.

Как долго действует вызов?

Обычно 60-120 секунд. Извлеките его и немедленно отправьте в CaptchaAI.

Что делает api_server?

Он сообщает CaptchaAI, какой API-сервер GeeTest использовать. Требуется только в том случае, если сайт использует нестандартную конечную точку GeeTest. Проверьте сетевые запросы страницы на api-*.geetest.com.


Связанные руководства


Основные параметры GeeTest —начни с CaptchaAI.

Комментарии для этой статьи отключены.