Comparisons

Сравнение времени работы и надежности решателя CAPTCHA

Провайдер CAPTCHA API может хвастаться высоким аптаймом — и всё равно подвести именно тогда, когда нагрузка максимальна: в чёрную пятницу, в праздники или ночью, когда очередь у сервиса на людях растёт быстрее, чем её разбирают. Разница между решателем на AI и решателем на людях — не пара процентов в буклете, а то, доедет ли пайплайн до утра без остановок. Сначала — сухие цифры по доле успешных решений, затем — почему за ними стоит именно архитектура, а не маркетинг, и в конце — готовый код мониторинга и переключения на резерв.


Доля успешных решений по типам CAPTCHA

Если нужно быстро сравнить цифры — вот они. Дальше в статье разберём, почему за строкой «Высокая» у CaptchaAI стоит архитектура, а не маркетинговая формулировка.

Тип CAPTCHA CaptchaAI 2Captcha Anti-Captcha CapSolver
reCAPTCHA v2 Высокая, без сезонных провалов 90–95% (отклонение ±8%) 90–95% (отклонение ±6%) 90–95% (отклонение ±4%)
Cloudflare Turnstile Высокая, без сезонных провалов 80–90% (отклонение ±10%) 85–90% (отклонение ±8%) 85–95% (отклонение ±6%)
GeeTest v3 Высокая, без сезонных провалов 85–92% (отклонение ±6%) 85–90% (отклонение ±8%) 88–95% (отклонение ±5%)

Цифры по конкурентам — ориентировочные диапазоны; для своего пайплайна доверяйте логам (SolverMonitor ниже), а не таблице.


Почему архитектура решает больше, чем реклама

Когда CAPTCHA API подвисает, конвейер не «немного замедляется» — он останавливается целиком:

Your pipeline:
  Scrape page ──▶ Hit CAPTCHA ──▶ Call API ──▶ Get token ──▶ Continue

If CAPTCHA API is down:
  Scrape page ──▶ Hit CAPTCHA ──▶ Call API ──▶ TIMEOUT ──▶ Pipeline stalls

Impact:

  - Data collection halts
  - Scheduled jobs fail
  - Business insights delayed
  - Competitive advantage lost

Архитектура: AI-модели против работников

Поставщик Архитектура Что это значит для аптайма
CaptchaAI AI/ML-модели на отказоустойчивой инфраструктуре Не завязан на людей — ровная скорость в любое время суток
2Captcha Работники + очередь заявок Зависит от того, сколько людей сейчас онлайн
Anti-Captcha Работники + AI-гибрид Частично зависит от штата
CapSolver AI-модели В целом стабильно
CapMonster Cloud AI-модели В целом стабильно

У сервисов на людях есть риски, которые никакой SLA не отменит: нехватка работников в праздники и выходные, рост очереди в пиковые часы и разброс качества между работниками смены.

Выходные и праздники — момент истины

Сценарий CaptchaAI Сервисы с работниками-людьми
Обычный будний день ✅ Стандартная скорость ✅ Стандартная скорость
Выходные ✅ Та же скорость ⚠️ на 20–40% медленнее
Крупный праздник ✅ Та же скорость ❌ на 50–100% медленнее
Черная пятница / всплеск нагрузки ✅ Небольшая очередь ❌ Сильная деградация

Наглядный пример: длинные новогодние каникулы в России и Беларуси (обычно 1–8 января) — время, когда сервисы на людях проседают сильнее всего. Работники недоступны несколько дней подряд, а решения, что в будни занимали 20–30 секунд, растягиваются на минуты. Если парсинг запускается по расписанию (cron, Airflow) именно в эти даты, разница между AI-моделью и человеко-зависимым сервисом — причина, по которой отчёт не соберётся вовремя.

Скорость решения в течение суток

На уровне часов разница видна ещё нагляднее:

AI-based services (CaptchaAI):
  00:00  ████████████████████  12s avg
  06:00  ████████████████████  12s avg
  12:00  ████████████████████  13s avg
  18:00  ████████████████████  13s avg

Human-based services (2Captcha):
  00:00  ██████████████████████████████  45s avg (fewer workers)
  06:00  ████████████████████████  25s avg
  12:00  ████████████████████  18s avg (peak workers)
  18:00  ██████████████████████████  30s avg

У AI-модели график ровный в любой час. У сервиса на людях время решения следует за графиком смен — ночью некому разбирать очередь.


Типичные проблемы и быстрые решения

Проблема Причина Что делать
Таймауты в часы пик Провайдер перегружен AI-сервис, больше poll_timeout
Доля успешных решений резко упала Сменился тип CAPTCHA на сайте Проверьте method
Периодические обрывы соединения Проблемы сети Повтор с экспоненциальной задержкой
Медленные ответы ночью Работники офлайн AI-провайдер (например, CaptchaAI)

Как собрать пайплайн, устойчивый к сбоям

Даже у надёжных провайдеров бывают сбои. Клиент должен переживать их сам — с повтором попыток, таймаутом и учётом статистики:

import requests
import time
import logging

logger = logging.getLogger(__name__)


class ReliableSolver:
    """CAPTCHA solver with retry, timeout, and health tracking."""

    def __init__(self, api_key, max_retries=3, poll_timeout=120):
        self.api_key = api_key
        self.base_url = "https://ocr.captchaai.com"
        self.max_retries = max_retries
        self.poll_timeout = poll_timeout
        self.stats = {"success": 0, "timeout": 0, "error": 0}

    def solve(self, method, **params):
        for attempt in range(self.max_retries):
            try:
                token = self._attempt_solve(method, **params)
                self.stats["success"] += 1
                return token
            except TimeoutError:
                self.stats["timeout"] += 1
                logger.warning(
                    "Solve timeout (attempt %d/%d)",
                    attempt + 1, self.max_retries,
                )
                time.sleep(2 ** attempt)
            except requests.RequestException as e:
                self.stats["error"] += 1
                logger.error("API error: %s", e)
                time.sleep(2 ** attempt)

        raise RuntimeError(f"All {self.max_retries} attempts failed")

    def _attempt_solve(self, method, **params):
        data = {
            "key": self.api_key,
            "method": method,
            "json": 1,
        }
        data.update(params)

        resp = requests.post(
            f"{self.base_url}/in.php", data=data, timeout=30
        )
        resp.raise_for_status()
        result = resp.json()

        if result.get("status") != 1:
            raise RuntimeError(f"Submit error: {result.get('request')}")

        task_id = result["request"]
        return self._poll_result(task_id)

    def _poll_result(self, task_id):
        start = time.time()
        while time.time() - start < self.poll_timeout:
            time.sleep(5)
            resp = requests.get(f"{self.base_url}/res.php", params={
                "key": self.api_key,
                "action": "get",
                "id": task_id,
                "json": 1,
            }, timeout=15)

            data = resp.json()
            if data["request"] == "CAPCHA_NOT_READY":
                continue
            if data.get("status") == 1:
                return data["request"]
            raise RuntimeError(f"Solve error: {data['request']}")

        raise TimeoutError("Poll timeout")

    def get_uptime_stats(self):
        total = sum(self.stats.values())
        if total == 0:
            return {"uptime": "N/A", "total": 0}
        success_rate = self.stats["success"] / total * 100
        return {
            "uptime": f"{success_rate:.1f}%",
            "total": total,
            **self.stats,
        }


# Usage
solver = ReliableSolver("YOUR_API_KEY")

token = solver.solve(
    "userrecaptcha",
    googlekey="SITE_KEY",
    pageurl="https://example.com",
)

print(solver.get_uptime_stats())

Мониторинг работоспособности в проде

Таблица выше — ориентир; реальную картину даёт только свой лог.

Пишите каждую попытку решения в CSV и анализируйте закономерности за неделю-две:

import csv
import datetime


class SolverMonitor:
    """Log solve attempts to CSV for reliability analysis."""

    def __init__(self, solver, log_file="solver_metrics.csv"):
        self.solver = solver
        self.log_file = log_file
        self._init_log()

    def _init_log(self):
        with open(self.log_file, "a", newline="") as f:
            writer = csv.writer(f)
            if f.tell() == 0:
                writer.writerow([
                    "timestamp", "method", "duration_s",
                    "status", "error",
                ])

    def solve(self, method, **params):
        start = time.time()
        status = "success"
        error = ""

        try:
            token = self.solver.solve(method, **params)
            return token
        except Exception as e:
            status = "error"
            error = str(e)
            raise
        finally:
            duration = time.time() - start
            self._log(method, duration, status, error)

    def _log(self, method, duration, status, error):
        with open(self.log_file, "a", newline="") as f:
            writer = csv.writer(f)
            writer.writerow([
                datetime.datetime.utcnow().isoformat(),
                method, f"{duration:.2f}",
                status, error,
            ])

Резервный провайдер: стратегия отказоустойчивости

Для бизнес-критичных конвейеров одного провайдера недостаточно. Держите вторичного поставщика как резерв и переключайтесь на него автоматически:

class FailoverSolver:
    """Try primary solver first, fall back to secondary."""

    def __init__(self, primary_key, secondary_key):
        self.primary = ReliableSolver(primary_key, max_retries=2)
        self.secondary = ReliableSolver(secondary_key, max_retries=2)
        self.secondary.base_url = "https://backup-solver.example.com"

    def solve(self, method, **params):
        try:
            return self.primary.solve(method, **params)
        except RuntimeError:
            logger.warning("Primary failed, trying secondary")
            return self.secondary.solve(method, **params)

У CaptchaAI тарификация по потокам: резервный аккаунт на BASIC ($15/мес, 5 потоков) стоит недорого рядом с ценой простоя.


Часто задаваемые вопросы

Что делать, если провайдер CAPTCHA API лёг посреди пиковой нагрузки?

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

Сколько потоков закладывать, чтобы пайплайн пережил всплеск ошибок?

Отталкивайтесь от пикового трафика: если обычная нагрузка укладывается в BASIC (5 потоков) или STANDARD ($30/мес, 15 потоков), на ретраи заложите запас 30–50%.

Как отличить деградацию провайдера от бага в моём коде?

Смотрите duration_s и status в логе SolverMonitor. Растёт время у всех задач — провайдер; падает один method — изменился сайт.

Нужен ли резервный провайдер, если оплата уже идёт по потокам?

Для некритичных задач — необязательно. Для SLA перед клиентом — да: второй аккаунт дешевле часа простоя.

Как самостоятельно отслеживать надёжность CAPTCHA API без готового дашборда?

Логируйте попытку решения — время, статус, метод — как класс SolverMonitor. Через неделю у вас будет своя статистика, точнее опубликованных диапазонов.


Связанные материалы


Выбирайте надёжность — попробуйте CaptchaAI в будни, выходные и праздники.

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