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

Как решить GeeTest v3 с помощью API

GeeTest v3 представляет интерактивные задачи — головоломки со слайдами, выбор значков или сопоставление слов. В отличие от reCAPTCHA, GeeTest использует собственный процесс проверки с тремя параметрами (gt, challenge, api_server), которые вы должны извлечь со страницы перед решением.

В этом руководстве описан полный процесс извлечения параметров GeeTest и решения проблемы с помощью API CaptchaAI.


Требования

Элемент Ценить
CaptchaAI API-ключ Отcaptchaai.com
Значение GeeTest gt Статический идентификатор сайта
GeeTest challenge Динамическая ценность за сеанс
URL-адрес страницы URL-адрес, по которому отображается GeeTest
Язык Python 3.7+ или Node.js 14+

Шаг 1. Извлеките параметры GeeTest

GeeTest требует три параметра. gt является статическим (одинаковым для каждого запроса), а challenge изменяется для каждого сеанса.

Способ 1: вкладка «Сеть»

  1. Откройте вкладку DevTools → Сеть.
  2. Фильтровать по register-slide, gettype.php или get.php.
  3. Запустите капчу и найдите запрос на инициализацию.
  4. Ответ содержит gt, challenge и иногда api_server.
{
  "success": 1,
  "gt": "019924a82c70bb123aae90d483087f94",
  "challenge": "12345678abc90def12345678abc90def",
  "new_captcha": true
}

Способ 2: исходный код страницы

// Search page source for initGeetest or gt value
document.querySelectorAll('script').forEach(s => {
  if (s.textContent.includes('initGeetest')) {
    console.log(s.textContent);
  }
});

Способ 3: конечная точка API

Многие сайты получают параметры GeeTest из собственного API:

# The site's registration endpoint
params_response = requests.get("https://example.com/api/captcha/register")
data = params_response.json()
gt = data["gt"]
challenge = data["challenge"]

Шаг 2. Отправьте задачу CaptchaAI.

Питон

import requests
import time

API_KEY = "YOUR_API_KEY"

response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "geetest",
    "gt": "019924a82c70bb123aae90d483087f94",
    "challenge": "12345678abc90def12345678abc90def",
    "api_server": "api.geetest.com",  # Optional, use if site specifies
    "pageurl": "https://https://staging.example.com/qa-login",
    "json": 1
})

data = response.json()
if data.get("status") != 1:
    raise Exception(f"Submit error: {data.get('request')}")

task_id = data["request"]
print(f"Task submitted: {task_id}")

Node.js

const axios = require('axios');

const API_KEY = 'YOUR_API_KEY';

async function submitGeeTest(gt, challenge, pageurl) {
  const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
    params: {
      key: API_KEY,
      method: 'geetest',
      gt,
      challenge,
      api_server: 'api.geetest.com',
      pageurl,
      json: 1
    }
  });

  if (data.status !== 1) throw new Error(`Submit error: ${data.request}`);
  return data.request;
}

Шаг 3. Опрос для поиска решения

Решение GeeTest возвращает три значения: challenge, validate и seccode.

Питон

def get_geetest_solution(task_id):
    for attempt in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1
        }).json()

        if result.get("status") == 1:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {result.get('request')}")

    raise Exception("Timeout")

solution = get_geetest_solution(task_id)
# solution = {
#   "geetest_challenge": "12345678abc90def12345678abc90def1a",
#   "geetest_validate": "abcdef1234567890abcdef1234567890",
#   "geetest_seccode": "abcdef1234567890abcdef1234567890|jordan"
# }

Node.js

async function getGeeTestSolution(taskId) {
  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const { data } = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
    });
    if (data.status === 1) return data.request;
    if (data.request !== 'CAPCHA_NOT_READY') throw new Error(data.request);
  }
  throw new Error('Timeout');
}

Шаг 4. Отправьте решение на целевой сайт.

Отправьте все три значения в конечную точку проверки сайта:

# Submit the GeeTest solution with the form data
verify_response = requests.post("https://example.com/api/login", data={
    "username": "user@example.com",
    "password": "password123",
    "geetest_challenge": solution["geetest_challenge"],
    "geetest_validate": solution["geetest_validate"],
    "geetest_seccode": solution["geetest_seccode"]
})

print(f"Login status: {verify_response.status_code}")

Полный пример Python

import requests
import time

API_KEY = "YOUR_API_KEY"
SITE_URL = "https://https://staging.example.com/qa-login"

# 1. Get GeeTest parameters from the site
params = requests.get("https://example.com/api/captcha/register").json()

# 2. Submit to CaptchaAI
submit = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "geetest",
    "gt": params["gt"],
    "challenge": params["challenge"],
    "pageurl": SITE_URL,
    "json": 1
}).json()
task_id = submit["request"]

# 3. Poll for solution
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        solution = result["request"]
        break

# 4. Submit to site
login = requests.post(SITE_URL, data={
    "username": "user@example.com",
    "password": "pass",
    "geetest_challenge": solution["geetest_challenge"],
    "geetest_validate": solution["geetest_validate"],
    "geetest_seccode": solution["geetest_seccode"]
})
print(f"Result: {login.status_code}")

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

Ошибка Причина Исправить
ERROR_BAD_PARAMETERS Отсутствует GT или вызов Оба обязательны — выдержка со страницы
ERROR_CAPTCHA_UNSOLVABLE Срок действия конкурса истек или недействителен Загрузите новое задание с сайта повторно.
Решение отклонено сайтом Устаревшая ценность вызова Задача одноразовая; получай новый за каждую попытку
geetest_validate пуст. Не удалось решить проблему самостоятельно Повторите попытку с новым испытанием.

Полный работоспособный пример

Нужен полноценный рабочий проект с настройкой среды, опросом, повторными попытками и обработкой ошибок?

Полный работоспособный пример см. на GitHub →.


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

Почему мне нужно каждый раз получать новое задание?

Значение challenge является одноразовым. Как только он будет использован (в результате успешного решения или истечения срока действия), серверная часть сайта отклонит его. Всегда придумывайте новое задание перед каждым решением.

Что такое параметр api_server?

Он указывает, какой сервер GeeTest выполняет проверку. Общие значения — api.geetest.com и api-na.geetest.com. Если сайт использует собственный сервер, включите его в свой запрос.

Сколько времени занимает решение GeeTest?

Обычно 15–30 секунд. На решение слайд-головоломки и задач с иконками уходит примерно столько же времени.

Могу ли я решить GeeTest v4 этим методом?

Нет. GeeTest v4 использует другой протокол. Проверьте, поддерживает ли CaptchaAI конкретную версию GeeTest на сайте.

В чем разница между заданиями по слайдам и щелчкам GeeTest?

GeeTest v3 имеет несколько типов задач (слайд, щелчок по значку, сопоставление слов), но параметры API и порядок действий идентичны. CaptchaAI прозрачно обрабатывает все типы v3.


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

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