Решение CAPTCHA имеет четыре компонента задержки: запрос на отправку, ожидание в очереди, выполнение решателя и получение опроса. Вы не можете контролировать время выполнения решателя, но можете оптимизировать все остальное.
Базовая задержка по типу CAPTCHA
| Тип капчи | Типичное время решения | подходящий из достижимых |
|---|---|---|
| Изображение/OCR | 2–5 с. | 1-3 секунды |
| reCAPTCHA v2 | 15-30с | 10–20 секунд |
| reCAPTCHA v3 | 10–20 секунд | 8–15 с. |
| Cloudflare Turnstile | 10–25 сек. | 8–15 с. |
| GeeTest v3 | 15-30с | 10–20 секунд |
Столбец «Наилучшее достижимое» отражает то, что вы получите после применения приведенных ниже оптимизаций.
1. Оптимизируйте интервалы опроса
5-секундный интервал опроса по умолчанию приводит к потере времени, когда решение завершается между опросами. Используйте адаптивный опрос — начните быстро, затем отступите:
Питон
import time
import requests
API_KEY = "YOUR_API_KEY"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def adaptive_poll(task_id, timeout=120):
"""Start polling at 3s, increase to 5s after 4 polls."""
start = time.time()
interval = 3 # start aggressive
polls = 0
while time.time() - start < timeout:
time.sleep(interval)
polls += 1
resp = requests.get(RESULT_URL, params={
"key": API_KEY, "action": "get",
"id": task_id, "json": "1"
}).json()
if resp["status"] == 1:
elapsed = time.time() - start
print(f"Solved in {elapsed:.1f}s ({polls} polls)")
return resp["request"]
if resp["request"] != "CAPCHA_NOT_READY":
raise Exception(resp["request"])
# Back off after initial fast polls
if polls >= 4:
interval = 5
raise TimeoutError(f"Task {task_id} timed out")
JavaScript
async function adaptivePoll(taskId, apiKey, timeout = 120000) {
const start = Date.now();
let interval = 3000;
let polls = 0;
while (Date.now() - start < timeout) {
await new Promise(r => setTimeout(r, interval));
polls++;
const resp = await fetch(
`https://ocr.captchaai.com/res.php?key=${apiKey}&action=get&id=${taskId}&json=1`
);
const data = await resp.json();
if (data.status === 1) {
console.log(`Solved in ${((Date.now() - start) / 1000).toFixed(1)}s (${polls} polls)`);
return data.request;
}
if (data.request !== 'CAPCHA_NOT_READY') {
throw new Error(data.request);
}
if (polls >= 4) interval = 5000;
}
throw new Error(`Task ${taskId} timed out`);
}
Экономия в среднем 1–4 секунды по сравнению с фиксированным 5-секундным интервалом.
2. Пул соединений
Повторно используйте HTTP-соединения вместо открытия новых для каждого опроса:
Питон
session = requests.Session()
# Use session.get() and session.post() instead of requests.get/post
# The session reuses TCP connections automatically
JavaScript (Node.js)
const { Agent } = require('http');
const axios = require('axios');
const client = axios.create({
httpAgent: new Agent({ keepAlive: true, maxSockets: 10 }),
timeout: 10000,
});
// Use client.get() and client.post() for all API calls
Экономия ~50-100 мс на запрос за счет пропуска рукопожатий TCP/TLS.
3. Предварительная выборка CAPTCHA
Отправляйте задачи CAPTCHA до того, как вам потребуются токены. Пока парсер обрабатывает страницу N, отправьте CAPTCHA для страницы N+1:
from concurrent.futures import ThreadPoolExecutor
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
def prefetch_submit(sitekey, page_url):
resp = session.post(SUBMIT_URL, data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": "1",
})
data = resp.json()
if data["status"] == 1:
return data["request"]
raise Exception(data["request"])
# Submit next page's CAPTCHA while processing current page
with ThreadPoolExecutor(max_workers=2) as pool:
# Submit CAPTCHA for page 2 while processing page 1
future_task = pool.submit(prefetch_submit, "6Le-SITEKEY", "https://example.com/page/2")
# Process page 1...
process_page(current_data)
# Now get the pre-submitted task ID and poll
task_id = future_task.result()
token = adaptive_poll(task_id)
Устраняет полное время ожидания за счет перекрытия решения с обработкой.
4. Используйте правильный метод CAPTCHA
CaptchaAI иногда поддерживает более быстрые методы для определенных сценариев:
| Сценарий | Медленный метод | Более быстрая альтернатива |
|---|---|---|
| reCAPTCHA v2 с известным обратным вызовом | userrecaptcha + опрос |
userrecaptcha с pingback (URL обратного вызова) |
| Текст изображения CAPTCHA | base64 с высоким разрешением |
base64 с numeric=1, если только цифры |
5. Пропускайте прокси, когда он не нужен
Маршрутизация прокси-сервера увеличивает задержку. Отправляйте параметры прокси только тогда, когда целевой сайт требует запросов от определенных IP-адресов:
# Without proxy — faster for most use cases
data = {
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": "1",
}
# With proxy — only when required
data["proxy"] = "user:pass@1.2.3.4:8080"
data["proxytype"] = "HTTP"
6. Используйте URL-адреса обратного вызова вместо опроса
Полностью исключите опрос с помощью параметра pingback:
resp = session.post(SUBMIT_URL, data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": "1",
"pingback": "https://your-server.com/captcha-callback",
})
CaptchaAI отправляет результат на ваш URL-адрес после завершения решения. Никакого цикла опроса не требуется. Это быстрый по нашей внутренней выборке метод поиска.
7. Оцените свою оптимизацию
import statistics
def benchmark(solve_func, iterations=20):
times = []
for i in range(iterations):
start = time.time()
try:
solve_func()
times.append(time.time() - start)
except Exception:
pass
if times:
print(f"Samples: {len(times)}/{iterations}")
print(f"Mean: {statistics.mean(times):.1f}s")
print(f"Median: {statistics.median(times):.1f}s")
print(f"P95: {sorted(times)[int(len(times)*0.95)]:.1f}s")
print(f"Min: {min(times):.1f}s")
print(f"Max: {max(times):.1f}s")
Поиск неисправностей
| Проблема | Причина | Исправить |
|---|---|---|
| Задержка опроса не изменилась | Все еще использую requests.get() без сеанса |
Переключиться на session.get() |
| Срок действия токенов предварительной выборки истекает до их использования. | Обработка занимает слишком много времени | Уменьшите окно предварительной загрузки или отправьте сообщение ближе к использованию. |
| URL обратного вызова никогда не получает данные | Сервер недоступен с CaptchaAI | Обеспечьте общедоступный URL-адрес и исправьте правила брандмауэра. |
| Более быстрый опрос приводит к ограничению скорости | Опрос слишком агрессивный (< 2 с) | Сохраняйте минимальный интервал в 3 секунды. |
Часто задаваемые вопросы
Какая самая большая оптимизация?
Предварительная выборка. Он перекрывает время решения и время обработки, эффективно сокращая воспринимаемую задержку почти до нуля для последовательных рабочих процессов.
Помогает ли адаптивный опрос для CAPTCHA изображений?
В меньшей степени. Изображения CAPTCHA решаются за 2-5 секунд, поэтому первый опрос в 3 секунды часто их ловит. Улучшение более заметно для reCAPTCHA (15-30 секунд).
Получите быстрый по внутренней выборке решение CAPTCHA с CaptchaAI
Получите ключ API по адресуcaptchaai.com.
Связанные руководства
- Оптимизация скорости и затрат
- Параллельное решение CAPTCHA
- Пользовательские настройки тайм-аута для разных типов CAPTCHA