Troubleshooting

Падение скорости решения CAPTCHA: диагностика регресса производительности

Доля решений упала с 95% до 60% за одну ночь? Причина обычно находится за 15–20 минут по шести проверкам: код, sitekey, прокси, токен, ошибки, базовый уровень.

Дерево диагностики: откуда начать поиск причины

Solve rate dropped
├── Is the API returning errors? → Check error codes
│   ├── ERROR_WRONG_USER_KEY → API key issue
│   ├── ERROR_ZERO_BALANCE → Balance depleted
│   ├── ERROR_NO_SLOT_AVAILABLE → Rate limiting
│   └── ERROR_CAPTCHA_UNSOLVABLE → CAPTCHA changed
├── Are tokens returned but rejected by the target site?
│   ├── Token expired before submission → Speed up injection
│   ├── Sitekey changed → Re-extract from page
│   └── Domain mismatch → Check pageurl parameter
├── Are proxies failing?
│   ├── Proxy banned by target → Rotate proxies
│   └── Proxy timeout → Check proxy health
└── Did the target site change?
    ├── New CAPTCHA type → Update method parameter
    ├── JavaScript changes → Re-analyze page
    └── Rate limiting by site → Reduce frequency

Если сценарий уже узнаваем — загляните в шпаргалку ниже и сразу переходите к действию. Если нет — пройдите шесть шагов по порядку.

Шпаргалка: сценарий → причина → действие

Сценарий Вероятная причина Первое действие
100% отказов, всегда ERROR_WRONG_USER_KEY Неверный API-ключ Перепроверьте API-ключ
Постепенное снижение день за днём Деградация прокси Ротируйте прокси
Резкий обвал до 0% Изменился sitekey или страница Заново извлеките параметры CAPTCHA
Решается, но токены отклоняются сайтом Токен просрочен или домен не совпадает Проверьте тайминг и параметр pageurl
Работает на тестовом сайте, не работает на целевом Ограничения конкретного сайта Сравните параметры между сайтами

Шаг 1. Прогоните диагностический скрипт CaptchaAI

Начните с автоматической проверки — она сразу разделяет проблемы API, сайта и прокси:

# diagnose_solve_rate.py
import os
import requests
from collections import Counter

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")

def check_balance():
    """Verify API key and balance."""
    resp = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "getbalance", "json": "1",
    })
    result = resp.json()
    print(f"Balance: {result}")
    return result

def test_solve(sitekey, pageurl, runs=5):
    """Run test solves and collect error statistics."""
    errors = Counter()
    successes = 0

    for i in range(runs):
        # Submit
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "pageurl": pageurl,
            "json": "1",
        })
        result = resp.json()

        if result.get("status") != 1:
            errors[result.get("request", "UNKNOWN")] += 1
            print(f"  Run {i+1}: Submit error: {result.get('request')}")
            continue

        task_id = result["request"]
        import time
        time.sleep(15)

        # Poll
        for _ in range(25):
            poll = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get",
                "id": task_id, "json": "1",
            })
            poll_result = poll.json()

            if poll_result.get("status") == 1:
                successes += 1
                print(f"  Run {i+1}: Solved")
                break
            if poll_result.get("request") != "CAPCHA_NOT_READY":
                errors[poll_result.get("request", "UNKNOWN")] += 1
                print(f"  Run {i+1}: Error: {poll_result.get('request')}")
                break
            time.sleep(5)
        else:
            errors["TIMEOUT"] += 1
            print(f"  Run {i+1}: Timeout")

    print(f"\nResults: {successes}/{runs} solved")
    if errors:
        print(f"Errors: {dict(errors)}")

# Run diagnostics
print("=== Balance Check ===")
check_balance()

print("\n=== Test Solves ===")
test_solve("YOUR_SITEKEY", "https://your-staging.example.com", runs=5)

Шаг 2. Сверьте sitekey и тип CAPTCHA на целевой странице

Обычно причина — изменившийся sitekey или структура страницы. Откройте страницу, включите DevTools (F12) и сверьте с кодом:

  • reCAPTCHA: атрибут data-sitekey или вызов grecaptcha.render — один изменившийся символ даёт 100% отказ
  • Cloudflare Turnstile: data-sitekey в виджете Turnstile
  • GeeTest: параметр gt при инициализации
  • Тип провайдера — сайты мигрируют reCAPTCHA v2 → v3 (invisible), reCAPTCHA → Turnstile, изображение → reCAPTCHA Enterprise; при смене обновите method в запросе

Пример из практики: у QA-команды в Алматы доля решений reCAPTCHA v2 упала с 96% до 55% за ночь — сайт перешёл на Turnstile, а в коде остался метод userrecaptcha. Замена метода вернула прежний уровень за час.

Шаг 3. Проверьте здоровье прокси-пула

Качество прокси напрямую влияет на долю решений — особенно для токен-based CAPTCHA, где CaptchaAI работает через ваш прокси. Сначала протестируйте без прокси (если тип CAPTCHA это допускает), чтобы сразу понять, в прокси ли дело:

  • Прокси заблокирован целевым сайтом (токен решён, но отклонён) → переключитесь на другой авторизованный сетевой выход
  • Прокси возвращает ERROR_PROXY_NOT_FOUND → проверьте, что прокси жив и доступен
  • Обнаружен дата-центровый прокси (доля решений ниже обычной) → перейдите на резидентный прокси
  • Гео прокси не совпадает с целью (результаты нестабильны) → подберите страну прокси под целевой сайт

Шаг 4. Не истекает ли токен до отправки формы

У токена CAPTCHA ограниченный срок жизни:

Тип CAPTCHA Срок жизни токена
reCAPTCHA v2 ~120 секунд
reCAPTCHA v3 ~120 секунд
Cloudflare Turnstile ~300 секунд
GeeTest v3 ~60 секунд

Если между получением токена и отправкой формы проходит слишком много времени, сайт отклонит токен. Замерьте время между getTaskResult и отправкой формы; если больше 60 секунд — оптимизируйте конвейер.

Шаг 5. Разберите ошибки по частоте

Отсортируйте ошибки по частоте:

Ошибка Значение Действие
ERROR_CAPTCHA_UNSOLVABLE CAPTCHA слишком сложна или изменилась Сообщите CaptchaAI; проверьте, верен ли sitekey
ERROR_WRONG_CAPTCHA_ID Опрашивается не тот ID задачи Исправьте отслеживание ID задачи в коде
ERROR_ZERO_BALANCE Закончились кредиты Пополните баланс
ERROR_NO_SLOT_AVAILABLE Сработало ограничение частоты Снизьте параллелизм или добавьте задержку
CAPCHA_NOT_READY (таймаут) Решение занимает слишком много времени Увеличьте таймаут опроса; проверьте sitekey

Шаг 6. Сравните текущие метрики с базовым уровнем

Сравните текущие показатели с прежним базовым уровнем, если он у вас есть:

Метрика Базовый уровень Текущий Дельта Стоит беспокоиться?
Доля решений 95% ? Падение > 5% — разбираться
Медианное время решения 15 с ? Рост > 50% — разбираться
Доля ошибок 2% ? > 5% — разбираться
Доля принятых токенов 98% ? Падение > 3% — сайт изменился

Когда писать в поддержку CaptchaAI

Обращайтесь в поддержку, если:

  • Все шаги диагностики пройдены, а доля решений всё равно низкая
  • Доля ERROR_CAPTCHA_UNSOLVABLE превышает 20% на sitekey, которые раньше работали
  • Баланс в порядке, но решения не проходят
  • Проблема держится дольше 2 часов

В заявку включите: тип CAPTCHA и sitekey, URL целевого сайта, распределение ошибок из скрипта, когда началась проблема и какие изменения вы вносили в код.

Частые вопросы

Сколько тестовых прогонов нужно, чтобы доверять диагностике?

Обычно хватает 5 прогонов; при нестабильных результатах увеличьте выборку до 15–20.

Нормально ли, что часть запросов возвращает ERROR_CAPTCHA_UNSOLVABLE?

Да, 2–5% для сложных CAPTCHA — норма. Разбираться стоит, только если доля стабильно выше 15–20%.

ERROR_NO_SLOT_AVAILABLE стала появляться регулярно — нужно ли менять тариф?

Разовая ошибка — всплеск нагрузки сверх лимита потоков. При постоянных повторах сравните нагрузку с тарифом, например BASIC ($15/мес, 5 потоков), и перейдите на план побольше.


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

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