API Tutorials

Оптимизация задержки API CaptchaAI: более быстрое решение

Решение 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.


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

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