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.