Команды уходят с Anti-Captcha по двум причинам: в нём нет метода для BLS CAPTCHA и полных страниц Cloudflare Challenge, а собственный JSON-формат задач требует отдельной обёртки. CaptchaAI закрывает оба пункта, а его API повторяет 2Captcha-формат (in.php / res.php), под который код у большинства команд уже написан.
Совместимость API: главный аргумент за переход
Anti-Captcha принимает задачу JSON-объектом с полем task и опрашивает результат отдельным POST-эндпоинтом. CaptchaAI использует схему сотен готовых библиотек: POST в in.php, затем GET в res.php.
# Anti-Captcha — custom JSON format
import requests
resp = requests.post("https://api.anti-captcha.com/createTask", json={
"clientKey": "ANTICAPTCHA_KEY",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com",
"websiteKey": "SITE_KEY",
}
})
task_id = resp.json()["taskId"]
# Poll with different endpoint and format
result = requests.post("https://api.anti-captcha.com/getTaskResult", json={
"clientKey": "ANTICAPTCHA_KEY",
"taskId": task_id,
})
# CaptchaAI — standard 2Captcha-compatible format
import requests
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
"json": 1,
})
task_id = resp.json()["request"]
# Standard polling
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1,
})
Если в проекте уже есть 2Captcha-совместимая обёртка, смена провайдера — это подмена базового URL и ключа. При ручной интеграции меняется только транспортный слой: логика «отправить → опрашивать → забрать токен» остаётся прежней.
Где Anti-Captcha упирается в потолок
Cloudflare Challenge, а не только Turnstile
Anti-Captcha отдаёт токен Turnstile, но не проходит полные страницы Cloudflare Challenge и JS-проверки. Для парсинга это критично: всё больше целей ставит полностраничную проверку вместо виджета.
| Тип проверки Cloudflare | Anti-Captcha | CaptchaAI |
|---|---|---|
| Cloudflare Turnstile (managed) | ✅ | ✅ |
| Cloudflare Turnstile (invisible) | частично | ✅ |
| Cloudflare Challenge | ❌ | ✅ |
| JS-проверка | ❌ | ✅ |
BLS CAPTCHA
Метода bls у Anti-Captcha нет. Для команд, автоматизирующих визовые и государственные порталы, это блокер: в русскоязычном сегменте заявители из Казахстана и Беларуси проходят именно через BLS-порталы.
# CaptchaAI — BLS with a high success rate
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "bls",
"pageurl": "https://bls-portal.example.com",
"sitekey": "BLS_SITE_KEY",
"json": 1,
})
Правовая сторона на вас: обрабатывайте только те данные, которые вправе обрабатывать (для РФ — 152-ФЗ, для трансграничных проектов — GDPR).
Сравнение покрытия типов
Без приписывания лишнего:
| Тип CAPTCHA | Anti-Captcha | CaptchaAI |
|---|---|---|
| reCAPTCHA v2 | ✅ | ✅ |
| reCAPTCHA v2 Invisible / Enterprise | ✅ | ✅ |
| reCAPTCHA v3 | ✅ | ✅ |
| Cloudflare Turnstile | ✅ | ✅ |
| Cloudflare Challenge | ❌ | ✅ |
| GeeTest v3 | ✅ | ✅ |
| GeeTest v4 — нет | ✅ | ❌ (в разработке) |
| BLS | ❌ | ✅ |
| Изображение / OCR, Grid Image | ✅ | ✅ (27 500+ вариантов) |
| hCaptcha, FunCaptcha — нет | ✅ | ❌ |
| CaptchaFox / Friendly Captcha / Lemin | ❌ | ✅ (beta) |
| Формат API | собственный JSON | 2Captcha-совместимый |
| Прокси, обратный вызов (callback) | ✅ | ✅ |
Если пайплайн завязан на hCaptcha, FunCaptcha или GeeTest v4 — CaptchaAI их пока не решает, и переход тут выигрыша не даст.
Скорость решения
Для CaptchaAI — потолки SLA, для Anti-Captcha — публичные диапазоны сервиса.
| Тип CAPTCHA | Anti-Captcha | CaptchaAI |
|---|---|---|
| reCAPTCHA v2 | 15–45 с | <60 с |
| reCAPTCHA v3 | 10–30 с | <4 с |
| Капча-изображение | 5–15 с | <0,5 с |
| Cloudflare Turnstile | 10–30 с | <10 с |
| Cloudflare Challenge | — | <15 с |
| GeeTest v3 | 15–40 с | <12 с |
Разница заметнее на массовых типах: время решения конвертируется в пропускную способность потока.
Модель оплаты: потоки вместо оплаты за решение
CaptchaAI тарифицируется по числу одновременных потоков, а не по решениям: поток занят, пока задача в работе, и освобождается после ответа.
BASIC — $15/мес, 5 потоков; STANDARD — $30/мес, 15; ADVANCE — $90/мес, 50; PREMIUM — $170/мес, 100; CORPORATE — $240/мес, 150; ENTERPRISE — $300/мес, 200; VIP-1 — $1,500/мес, 1 000; VIP-2 — $4,500/мес, 3 000; VIP-3 — $7,500/мес, 5 000.
Для студии или фрилансера, который выставляет счета в локальной валюте, а за инфраструктуру платит в долларах, фиксированный платёж в USD считается заранее — в отличие от модели «за решение», где счёт зависит от числа проверок на цели.
Как переехать без простоя
На время перехода удобно держать обёртку с обоими провайдерами и переключателем в конструкторе.
import requests
import time
class CaptchaSolver:
"""Unified solver — supports Anti-Captcha and CaptchaAI."""
def __init__(self, provider="captchaai", api_key="YOUR_API_KEY"):
self.provider = provider
self.api_key = api_key
def solve_recaptcha_v2(self, sitekey, pageurl):
if self.provider == "captchaai":
return self._solve_captchaai("userrecaptcha", sitekey, pageurl)
else:
return self._solve_anticaptcha(sitekey, pageurl)
def _solve_captchaai(self, method, sitekey, pageurl):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": method,
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key, "action": "get",
"id": task_id, "json": 1,
})
data = result.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Solve timeout")
def _solve_anticaptcha(self, sitekey, pageurl):
resp = requests.post("https://api.anti-captcha.com/createTask", json={
"clientKey": self.api_key,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": pageurl,
"websiteKey": sitekey,
},
})
task_id = resp.json()["taskId"]
for _ in range(60):
time.sleep(5)
result = requests.post(
"https://api.anti-captcha.com/getTaskResult",
json={"clientKey": self.api_key, "taskId": task_id},
)
data = result.json()
if data["status"] == "ready":
return data["solution"]["gRecaptchaResponse"]
raise TimeoutError("Solve timeout")
Порядок: переключите один некритичный воркер, сутки последите за метриками, затем переводите остальные.
Что чаще всего ломается при переходе
| Симптом | Причина | Что делать |
|---|---|---|
| Ошибка при отправке задачи | тело запроса в JSON Anti-Captcha | форма в in.php: key, method, pageurl |
| Тип задачи не найден | в CaptchaAI нет поля type |
method: userrecaptcha, turnstile, bls |
| Опрос всегда «не готово» | POST на старый эндпоинт | GET в res.php, action=get + id |
| Токен есть, форма не принимает | не то поле ответа | g-recaptcha-response / cf-turnstile-response |
Частые вопросы
Сколько времени займёт переход на CaptchaAI?
С 2Captcha-совместимой обёрткой — минуты: базовый URL и ключ. При ручной интеграции закладывайте 15–30 минут на транспортный слой плюс сутки наблюдения.
Можно ли какое-то время держать оба сервиса одновременно?
Да, это рекомендуемый путь. Обёртка выше переключается параметром provider: Anti-Captcha остаётся запасным, пока CaptchaAI не наберёт статистику.
Что с hCaptcha и FunCaptcha?
Эти типы CaptchaAI не решает, GeeTest v4 — в разработке. Если они у вас в работе, миграция будет частичной.
Сколько потоков брать на старте?
Считайте от пиковой параллельности, а не от числа решений в месяц. Парсеру с 5–10 одновременными запросами хватает BASIC ($15/мес, 5 потоков) или STANDARD ($30/мес, 15 потоков).
Переносятся ли настройки прокси из Anti-Captcha?
Да, CaptchaAI принимает proxy и proxytype в стандартном формате запроса.
Связанные материалы
Заведите API-ключ CaptchaAI и прогоните текущий пайплайн на 2Captcha-совместимом формате — начать бесплатно.