Reference

Сравнительный анализ времени решения CAPTCHA для разных типов с помощью CaptchaAI

reCAPTCHA v3 через API CaptchaAI обычно решается за 1–3 секунды, Cloudflare Turnstile — за 4–8 секунд, а reCAPTCHA v2 может занять 12–18 секунд и больше. На одной задаче разница незаметна, но на тысяче запросов в час она превращается в часы простоя очереди и лишние повторные попытки. Ниже — воспроизводимые замеры по каждому типу CAPTCHA, который поддерживает CaptchaAI, и готовые скрипты, чтобы прогнать те же тесты на своём трафике и прокси.

Сколько времени решает каждый тип CAPTCHA

Ниже — медианное время 100 последовательных решений каждого типа, от отправки запроса в in.php до готового токена из res.php. Колонка «Предел SLA» — контрактный потолок из документации CaptchaAI; если реальное время регулярно к нему приближается или превышает его, это повод открыть тикет в поддержку, а не списывать на «так и должно быть».

Тип CAPTCHA Предел SLA Медиана P90 P99 Успешность
reCAPTCHA v2 <60 с 12–18 с 25 с 40 с высокая
reCAPTCHA v2 Invisible <30 с 10–15 с 20 с 28 с высокая
reCAPTCHA v3 <4 с 1–3 с 3 с 4 с высокая
reCAPTCHA Enterprise <60 с 15–25 с 35 с 50 с высокая
Cloudflare Turnstile <10 с 4–8 с 9 с 10 с высокая
GeeTest v3 <12 с 6–10 с 11 с 12 с высокая
Изображение/OCR <0,5 с 0,2–0,4 с 0,5 с 0,8 с высокая
BLS CAPTCHA <1 с 0,3–0,7 с 0,9 с 1 с высокая

Реальное время зависит от качества прокси, загрузки на стороне сайта и сложности конкретной CAPTCHA — таблица показывает типичный диапазон, а не гарантию.

Как читать результаты: медиана, P90, P99

Медиана — типичный опыт, на неё стоит опираться при планировании мощности. P90 — «плохой, но не худший» случай: 9 запросов из 10 решаются быстрее этого значения, это ориентир для тайм-аута по умолчанию. P99 — крайний случай; максимальный тайм-аут стоит ставить выше него, иначе система будет обрывать задачи, которые решаются медленно, но всё же успешно.

Оптимальные интервалы опроса

На основе замеров выше настройте опрос под каждый тип CAPTCHA:

Тип CAPTCHA Начальная задержка Интервал опроса Максимум попыток
Изображение/OCR 5 с 3 с 15
Cloudflare Turnstile 5 с 3 с 15
BLS CAPTCHA 5 с 3 с 15
reCAPTCHA v2 15 с 5 с 20
reCAPTCHA v3 10 с 5 с 20
GeeTest v3 12 с 5 с 20
reCAPTCHA Enterprise 15 с 5 с 25

От чего зависит скорость решения

На итоговое время решения влияют четыре фактора — от них и зависит, где конкретный запрос окажется в диапазоне между медианой и P99:

  • Задержка сети. Чем дальше вы территориально от конечных точек API CaptchaAI, тем больше времени уходит на каждый round-trip. RTT в 200 мс добавляет к решению около 1 секунды — это отправка запроса плюс 3–4 опроса res.php с интервалом 200 мс. Команды, которые разворачивают воркеры в европейских регионах или в Казахстане, обычно видят более стабильный RTT, чем при работе через мобильную сеть или нестабильный домашний канал — если тайм-ауты в проде «плавают», для начала проверьте именно сеть, а не сам CaptchaAI.
  • Качество прокси. Резидентные прокси в среднем дают более быстрое решение, чем дата-центровые: они реже провоцируют дополнительные проверки на стороне сайта. Ротация прокси на каждый запрос увеличивает разброс времени — для бенчмарка закрепите один прокси на серию из 10 запросов, иначе сравнение типов CAPTCHA получится нечестным.
  • Сложность CAPTCHA. Задачи reCAPTCHA v2 с картинками различаются по сложности: «выберите светофоры» на выцветших фотографиях решается дольше, чем обычный чекбокс. Это одна из причин, почему P90 и P99 у reCAPTCHA v2 растянуты сильнее, чем у Turnstile или GeeTest v3.
  • Стратегия опроса. Частый опрос res.php (каждые 2 секунды) быстрее ловит готовый результат, но увеличивает число запросов к API. Редкий опрос (раз в 10 секунд) снижает нагрузку, но добавляет задержку к каждому решению.

Скрипт для бенчмарка на Python

# benchmark_captchaai.py
import os
import time
import statistics
import requests

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

def benchmark_solve(method, params, runs=10):
    """Benchmark a CAPTCHA type over multiple runs."""
    times = []
    successes = 0

    for i in range(runs):
        start = time.time()

        # Submit
        submit_params = {"key": API_KEY, "json": "1", **params}
        resp = requests.get("https://ocr.captchaai.com/in.php",
                            params=submit_params)
        result = resp.json()

        if result.get("status") != 1:
            print(f"  Run {i+1}: Submit failed - {result.get('request')}")
            continue

        task_id = result["request"]

        # Poll
        time.sleep(10)
        solved = False
        for _ in range(30):
            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:
                elapsed = time.time() - start
                times.append(elapsed)
                successes += 1
                solved = True
                print(f"  Run {i+1}: {elapsed:.1f}s")
                break
            if poll_result.get("request") != "CAPCHA_NOT_READY":
                print(f"  Run {i+1}: Error - {poll_result.get('request')}")
                break

            time.sleep(5)

        if not solved and poll_result.get("request") == "CAPCHA_NOT_READY":
            print(f"  Run {i+1}: Timeout")

    if times:
        return {
            "runs": runs,
            "successes": successes,
            "success_rate": f"{successes/runs*100:.0f}%",
            "median": f"{statistics.median(times):.1f}s",
            "p90": f"{sorted(times)[int(len(times)*0.9)]:.1f}s" if len(times) >= 10 else "N/A",
            "min": f"{min(times):.1f}s",
            "max": f"{max(times):.1f}s",
        }
    return {"error": "No successful solves"}

# Benchmark reCAPTCHA v2
print("=== reCAPTCHA v2 ===")
recaptcha_v2 = benchmark_solve("userrecaptcha", {
    "method": "userrecaptcha",
    "googlekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "pageurl": "https://www.google.com/recaptcha/api2/demo",
})
print(recaptcha_v2)

# Benchmark Image/OCR
print("\n=== Image CAPTCHA ===")
# Submit a base64-encoded test image
import base64
# Use a test image for benchmarking
image_result = benchmark_solve("post", {
    "method": "base64",
    "body": "BASE64_ENCODED_CAPTCHA_IMAGE",
})
print(image_result)

Тот же бенчмарк на JavaScript

// benchmark_captchaai.js
const axios = require('axios');

const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';

async function benchmarkSolve(params, runs = 10) {
  const times = [];
  let successes = 0;

  for (let i = 0; i < runs; i++) {
    const start = Date.now();

    // Submit
    const submit = await axios.get('https://ocr.captchaai.com/in.php', {
      params: { key: API_KEY, json: '1', ...params },
    });

    if (submit.data.status !== 1) {
      console.log(`  Run ${i + 1}: Submit failed - ${submit.data.request}`);
      continue;
    }

    // Poll
    await new Promise(r => setTimeout(r, 10000));
    let solved = false;

    for (let j = 0; j < 30; j++) {
      const poll = await axios.get('https://ocr.captchaai.com/res.php', {
        params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
      });

      if (poll.data.status === 1) {
        const elapsed = (Date.now() - start) / 1000;
        times.push(elapsed);
        successes++;
        solved = true;
        console.log(`  Run ${i + 1}: ${elapsed.toFixed(1)}s`);
        break;
      }
      if (poll.data.request !== 'CAPCHA_NOT_READY') {
        console.log(`  Run ${i + 1}: Error - ${poll.data.request}`);
        break;
      }
      await new Promise(r => setTimeout(r, 5000));
    }

    if (!solved) console.log(`  Run ${i + 1}: Timeout`);
  }

  if (times.length === 0) return { error: 'No successful solves' };

  times.sort((a, b) => a - b);
  return {
    runs, successes,
    successRate: `${((successes / runs) * 100).toFixed(0)}%`,
    median: `${times[Math.floor(times.length / 2)].toFixed(1)}s`,
    min: `${times[0].toFixed(1)}s`,
    max: `${times[times.length - 1].toFixed(1)}s`,
  };
}

(async () => {
  console.log('=== reCAPTCHA v2 ===');
  const v2 = await benchmarkSolve({
    method: 'userrecaptcha',
    googlekey: '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
    pageurl: 'https://www.google.com/recaptcha/api2/demo',
  });
  console.log(v2);

  console.log('\n=== Cloudflare Turnstile ===');
  const turnstile = await benchmarkSolve({
    method: 'turnstile',
    sitekey: 'YOUR_TURNSTILE_SITEKEY',
    pageurl: 'https://example.com',
  });
  console.log(turnstile);
})();

Устранение неполадок

Проблема Причина Решение
Время решения выше значений из таблицы Сетевая задержка или проблемы с прокси Запустите тест из региона ближе к серверам CaptchaAI, проверьте прокси отдельно от остальной цепочки
Результаты сильно разнятся между запусками Разброс сложности CAPTCHA на стороне сайта Увеличьте выборку минимум до 50 запросов
Много тайм-аутов подряд Неверный sitekey или pageurl Проверьте параметры одним ручным запросом перед серией
ERROR_ZERO_BALANCE в середине теста Не хватает баланса на всю серию запросов Пополните баланс перед запуском большого бенчмарка

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

Сколько времени в среднем занимает решение reCAPTCHA v2 через API CaptchaAI?

По нашим замерам медиана — 12–18 секунд, P90 — 25 секунд, P99 — 40 секунд. Контрактный предел SLA — <60 с; если решения регулярно приближаются к этой границе, в первую очередь проверьте сеть и прокси, а не только параметры запроса.

Как использовать P90 и P99 при настройке тайм-аутов в продакшене?

Берите P90 как основной тайм-аут и добавляйте запас 15–20% на сетевые колебания. P99 используйте как максимальный тайм-аут, после которого имеет смысл считать задачу зависшей и повторить запрос заново, а не продолжать ждать.

Сколько потоков тарифа нужно, чтобы уложиться в SLA при большом объёме?

CaptchaAI тарифицирует по количеству одновременных потоков, а не по числу решений: BASIC ($15/мес, 5 потоков) подходит для тестов и небольших пайплайнов, ADVANCE ($90/мес, 50 потоков) — для регулярной автоматизации, а уровни VIP — для сотен тысяч задач в месяц. Число потоков считайте от целевой пропускной способности и медианного времени решения самого медленного из нужных вам типов CAPTCHA, а не от общего количества задач в день.

Есть ли опубликованные бенчмарки для бета-типов CaptchaFox, Friendly Captcha и Lemin?

Нет — эти три типа сейчас в статусе beta, и отдельных цифр по скорости или доле успешных решений для них пока не публикуется. Ориентируйтесь на цифры из таблицы выше только для типов со статусом GA.

Что дальше

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