Технические разборы

Рабочий процесс GeeTest v3 «Вызов-ответ»: глубокое техническое погружение

GeeTest v3 использует многоэтапный протокол запроса-ответа. В отличие от reCAPTCHA, где один токен решает все, GeeTest включает в себя этап регистрации, обмен токенами вызова и окончательную проверку — каждый из которых выдает разные параметры. Понимание этого процесса необходимо для правильной интеграции с CaptchaAI.

Двухфазный протокол

GeeTest v3 работает в два этапа:

Этап 1: Регистрация (на стороне сервера)

Серверная часть сайта связывается с GeeTest, чтобы зарегистрировать новое задание:

Site Backend → GeeTest Server: "Give me a challenge for this user"
GeeTest Server → Site Backend: { gt, challenge, new_captcha }
Site Backend → Browser: Passes gt and challenge to the page

Этап 2. Проверка (на стороне клиента + на стороне сервера)

Браузер отображает задачу, пользователь решает ее, и результат проверяется:

Browser: Renders slider/puzzle using gt + challenge
User: Solves the challenge
Browser → Site Backend: { geetest_challenge, geetest_validate, geetest_seccode }
Site Backend → GeeTest Server: Verifies the three values
GeeTest Server → Site Backend: { result: "success" }

Подробный поток

Шаг 1. Вызов API регистрации

Серверная часть сайта вызывает конечную точку регистрации GeeTest:

GET https://api.geetest.com/register.php?gt=GT_ID&json_format=1

Ответ:

{
  "success": 1,
  "gt": "81dc9bdb52d04dc20036dbd8313ed055",
  "challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  "new_captcha": true
}
Параметр Значение
gt GeeTest ID — идентифицирует учетную запись GeeTest сайта.
challenge Уникальный токен вызова для этой сессии
new_captcha Использовать ли новый формат CAPTCHA

Важно! Значение challenge является одноразовым и ограничено по времени. Каждая загрузка страницы создает новую задачу.

Шаг 2. Рендеринг задачи

Браузер получает gt и challenge и инициализирует виджет GeeTest:

initGeetest({
  gt: "81dc9bdb52d04dc20036dbd8313ed055",
  challenge: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  offline: false,
  new_captcha: true,
  product: "float"
}, function(captchaObj) {
  captchaObj.appendTo('#captcha-container');
  captchaObj.onSuccess(function() {
    var result = captchaObj.getValidate();
    // result contains: geetest_challenge, geetest_validate, geetest_seccode
  });
});

Шаг 3: Типы испытаний

GeeTest v3 поддерживает несколько типов задач:

Тип Действие пользователя Описание
Слайдер Перетащите кусок головоломки Переместите часть головоломки, чтобы завершить изображение.
Клик по значку Нажимайте значки по порядку Щелкните определенные значки в показанной последовательности.
Клик по слову Нажмите на символы Нажмите китайские иероглифы в правильном порядке.
Космос Нажмите/select Задача пространственного мышления

Тип задачи определяется GeeTest на основе конфигурации сайта и профиля риска пользователя.

Шаг 4: Значения решения

После решения виджет выдает три значения:

{
  "geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
  "geetest_validate": "abc123def456_validate",
  "geetest_seccode": "abc123def456_validate|jordan"
}
Ценить Описание
geetest_challenge Измененный токен вызова (исходный + 2 дополнительных символа)
geetest_validate Хэш проверки
geetest_seccode Код безопасности (подтвердить + `\

Шаг 5. Проверка на стороне сервера

Серверная часть сайта отправляет эти три значения в GeeTest для проверки:

POST https://api.geetest.com/validate.php

seccode=abc123def456_validate|jordan
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy
&sdk=geetest-python-3.0.0

GeeTest отвечает:

{
  "seccode": "abc123def456_validate",
  "validate": "abc123def456_validate"
}

Извлечение параметров для CaptchaAI

Чтобы решить с помощью CaptchaAI, вам нужны gt и challenge со страницы:

Способ 1: перехватить ответ о регистрации

from playwright.sync_api import sync_playwright
import json

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()

    geetest_params = {}

    def handle_response(response):
        if "register" in response.url and "geetest" in response.url:
            data = response.json()
            geetest_params["gt"] = data.get("gt")
            geetest_params["challenge"] = data.get("challenge")

    page.on("response", handle_response)
    page.goto("https://https://staging.example.com/qa-login")

    # Wait for GeeTest to load
    page.wait_for_selector(".geetest_holder")
    print(f"gt: {geetest_params.get('gt')}")
    print(f"challenge: {geetest_params.get('challenge')}")

Метод 2: Извлечение из JavaScript страницы

gt = page.evaluate("() => document.querySelector('[data-gt]')?.dataset.gt")
challenge = page.evaluate("() => document.querySelector('[data-challenge]')?.dataset.challenge")

Способ 3: из вызова initGeetest

Найдите источник страницы для вызова initGeetest:

import re
source = page.content()
gt_match = re.search(r"gt['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)
challenge_match = re.search(r"challenge['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)

Решение с помощью CaptchaAI

Отправьте извлеченные параметры:

POST https://ocr.captchaai.com/in.php

key=YOUR_API_KEY
&method=geetest
&gt=81dc9bdb52d04dc20036dbd8313ed055
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
&pageurl=https://https://staging.example.com/qa-login
&json=1

Опрос по результату:

GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1

CaptchaAI возвращает:

{
  "status": 1,
  "request": {
    "geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
    "geetest_validate": "abc123def456_validate",
    "geetest_seccode": "abc123def456_validate|jordan"
  }
}

Вы получаете все три значения, необходимые для этапа проверки сайта.

Оффлайн и онлайн-режим

GeeTest v3 имеет резервный режим, когда серверы GeeTest недоступны:

Режим Значение success Поведение
Онлайн 1 Обычный запрос-ответ с серверами GeeTest
Офлайн 0 Упрощенная локальная проверка

В автономном режиме запрос генерируется локально, и проверка упрощается. Большинство сайтов используют онлайн-режим.

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

| Проблема | Причина | Исправить |


Следующие шаги

  • CaptchaAI Quickstart: ваше первое решение CAPTCHA за 5 минут
  • Как решить reCAPTCHA v2 через API: пошаговое руководство
  • Как решить Cloudflare Turnstile через API
  • Как решить GeeTest v3 с помощью API
Комментарии для этой статьи отключены.