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
>=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