Провайдер 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 в будни, выходные и праздники.