DEV Community

Cover image for Лучший сервис для решения и обхода капчи
Nikolay Khivrin
Nikolay Khivrin

Posted on

Лучший сервис для решения и обхода капчи

Лучший сервис для решения и обхода капчи

2Captcha — это сервис автоматического решения и обхода капчи. Лучше всего подходит, если у вас:

  • массовая автоматизация, скрейпинг, аккаунтные сценарии и пайплайны;
  • несколько типов капч в разных проектах и нужна одна интеграция вместо нескольких;
  • продакшн-потоки;
  • проекты, где важна предсказуемая интеграция без постоянных переписываний.

Что такое сервис решения капчи и как он работает

Сервис решения капчи — это сервис, который принимает капчу с сайта (картинки, слайдеры, аудио, токены) и возвращает готовое решение.

Без сервиса решения автоматизация живёт недолго: антибот-системы постоянно обновляются и ломают скрипты, рассчитанные на предсказуемое поведение.

2Captcha закрывает эту проблему:

  • обходит различные типы капч через стабильный API;
  • обновляется под новые типы защит;
  • использует гибридный подход: работники + собственные AI-решения.

Как это работает внутри (логика API)

Последовательность:

  1. createTask — отправляешь sitekey, URL и параметры.
  2. getTaskResult — периодически проверяешь статус.
  3. Вставляешь токен в форму или callback.

Пример кода (Python)

import os
import sys
import time
import json
import requests

CREATE_TASK_URL = "https://api.2captcha.com/createTask"
GET_TASK_RESULT_URL = "https://api.2captcha.com/getTaskResult"
REPORT_CORRECT_URL = "https://api.2captcha.com/reportCorrect"
REPORT_INCORRECT_URL = "https://api.2captcha.com/reportIncorrect"

WEBSITE_URL = os.getenv(
    "CAPTCHA_WEBSITE_URL",
    "https://2captcha.com/demo/recaptcha-v2",
)
WEBSITE_KEY = os.getenv(
    "CAPTCHA_WEBSITE_KEY",
    "6LfD3PIbAAAAAJs_eEHvoOl75_83eXSqpPSRFJ_u",
)

POLL_INTERVAL_SEC = 5
TIMEOUT_SEC = 180


def api_post(url: str, payload: dict, timeout: int = 30) -> dict:
    r = requests.post(url, json=payload, timeout=timeout)
    r.raise_for_status()
    data = r.json()

    if not isinstance(data, dict):
        raise RuntimeError(f"Unexpected JSON response: {data!r}")

    if data.get("errorId") not in (0, None):
        raise RuntimeError(f"2Captcha API error: {data}")

    return data


def create_recaptcha_v2_proxyless_task(client_key: str) -> int:
    payload = {
        "clientKey": client_key,
        "task": {
            "type": "RecaptchaV2TaskProxyless",
            "websiteURL": WEBSITE_URL,
            "websiteKey": WEBSITE_KEY,
            "isInvisible": False,
        },
    }

    data = api_post(CREATE_TASK_URL, payload)
    task_id = data.get("taskId")

    if task_id is None:
        raise RuntimeError(f"Missing taskId in response: {data}")

    return int(task_id)


def wait_for_result(client_key: str, task_id: int) -> tuple[str, dict]:
    deadline = time.time() + TIMEOUT_SEC

    while time.time() < deadline:
        time.sleep(POLL_INTERVAL_SEC)

        data = api_post(
            GET_TASK_RESULT_URL,
            {"clientKey": client_key, "taskId": int(task_id)},
        )

        status = data.get("status")

        if status == "processing":
            continue

        if status == "ready":
            solution = data.get("solution") or {}
            token = solution.get("gRecaptchaResponse") or solution.get("token")

            if not token:
                raise RuntimeError(f"Missing token in solution: {data}")

            return str(token), data

        raise RuntimeError(f"Unexpected getTaskResult response: {data}")

    raise TimeoutError(
        f"Timed out waiting for taskId={task_id} after {TIMEOUT_SEC}s"
    )


def report_feedback(client_key: str, task_id: int, accepted: bool) -> bool:
    url = REPORT_CORRECT_URL if accepted else REPORT_INCORRECT_URL
    data = api_post(url, {"clientKey": client_key, "taskId": int(task_id)})
    return data.get("status") == "success"


def main() -> None:
    client_key = os.getenv("TWOCAPTCHA_API_KEY")

    if not client_key:
        print("ERROR: env var TWOCAPTCHA_API_KEY is not set", file=sys.stderr)
        sys.exit(2)

    task_id = create_recaptcha_v2_proxyless_task(client_key)
    token, raw = wait_for_result(client_key, task_id)

    print("taskId:", task_id)
    print("websiteURL:", WEBSITE_URL)
    print("websiteKey:", WEBSITE_KEY)
    print("token:", token)


if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Чем 2Captcha лучше чистых AI-решателей

Работники

Чистые AI-солверы отвечают слишком одинаково — антиботы это легко видят.
2Captcha добавляет человеческий фактор и естественный разброс таймингов.

Поддержка разных типов капч

Единый API покрывает почти всё — не нужно подключать разные сервисы.

Единый интерфейс

Работа с reCAPTCHA, Turnstile и GeeTest выглядит одинаково.

Предсказуемые расходы

Нет резких скачков цены от нагрузки.

Работает везде

Selenium, Playwright, Puppeteer, мобильные тесты, серверные скрипты.


Сравнение: 2Captcha vs AI-солверы

Сравнение: 2Captcha vs AI-солверы

Параметр 2Captcha ML-солверы
Скорость 0.1–25 сек 0.1–2 сек
Тайминг Разный, естественный Одинаковый
Типы капч 30+ Только популярные
Адаптация к новым Часы Дни/недели
Сложные капчи Да Частично
Успех 90%+ 80–90%
Устойчивость к банам Высокая Средняя
Цена Чуть выше Чуть ниже

Итог:
ML дешевле, но чаще приводит к банам. 2Captcha дороже, но стабильнее.


Частые ошибки

❌ Слишком частые запросы

# Плохо — забанят
while True:
    requests.get(f"https://2captcha.com/res.php?id={task_id}")
Enter fullscreen mode Exit fullscreen mode
# Правильно
time.sleep(5)
Enter fullscreen mode Exit fullscreen mode

❌ Повторное создание задачи при NOT_READY

# Плохо
if "NOT_READY" in result:
    create_new_task()
Enter fullscreen mode Exit fullscreen mode
# Правильно
if "NOT_READY" in result:
    time.sleep(5)
    continue
Enter fullscreen mode Exit fullscreen mode

❌ Использование старого токена

Токен живёт ~2 минуты:

token = get_captcha_solution()
submit_form(token)  # сразу
Enter fullscreen mode Exit fullscreen mode

❌ Не сообщать о плохих решениях

requests.get(
  f"https://2captcha.com/res.php?key={API_KEY}&action=reportbad&id={task_id}"
)
Enter fullscreen mode Exit fullscreen mode

Какие капчи поддерживаются

Популярные

  • reCAPTCHA V2
  • reCAPTCHA V2 Callback
  • reCAPTCHA V2 Invisible
  • reCAPTCHA V3
  • reCAPTCHA Enterprise
  • Cloudflare Turnstile
  • FunCaptcha (Arkose Labs)
  • Normal Captcha
  • Image Captcha
  • Amazon Captcha

Менее известные

  • GeeTest
  • DataDome
  • Tencent Captcha
  • Audio Captcha
  • MTCaptcha
  • Number Captcha
  • Text Captcha
  • Rotate Captcha
  • Friendly Captcha
  • Math Captcha
  • Slider Captcha
  • ALTCHA
  • Temu Captcha
  • Capy Puzzle
  • atbCAPTCHA
  • VK Captcha

[СЛОТ ДЛЯ КАРТИНКИ #3]


Когда стоит использовать 2Captcha

  • На сайте редкая или региональная капча
  • Нужны предсказуемые расходы
  • Не хочется поддерживать много интеграций
  • Антибот банит по таймингам
  • Формат капчи часто меняется

Браузерное расширение

Подходит для:

  • ручных сценариев;
  • QA-тестирования;
  • быстрого старта без кода.

Поддержка: Chrome, Firefox, Edge, Opera, Brave.


Интеграции с Selenium и Puppeteer

Есть готовые примеры:

Selenium

  • поиск капчи в DOM
  • извлечение sitekey
  • вставка токена
  • обработка перезагрузки страницы

Puppeteer

  • детект контейнера капчи
  • отправка параметров в createTask
  • ожидание результата во время навигации

SDK (официальные)

Язык Документация
PHP Обход капчи на PHP
Python Обход капчи на Python
Java Обход капчи на Java
C# Обход капчи на C#
Go Обход капчи на Go
Ruby Обход капчи на Ruby
JavaScript Обход капчи на JS

Итог

2Captcha сочетает:

  • человеческие паттерны поведения,
  • широкую поддержку капч,
  • единый стабильный API.

Если автоматизация регулярно падает из-за капчи — это разумный выбор.

Top comments (0)