Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как обойти капчу с помощью C++

Грегори Фишер
Грегори Фишер

Технический специалист

Введение

Язык C++ традиционно используется для создания высоконагруженных приложений, игровых ботов, низкоуровневой автоматизации и парсеров, где критична максимальная производительность и минимальное потребление ресурсов. При разработке такого программного обеспечения разработчики часто сталкиваются с необходимостью обхода капчи. Написание собственных HTTP-запросов с использованием libcurl, ручная реализация циклов опроса и парсинг JSON-ответов значительно усложняют код и отвлекают от решения основных задач.

В этом руководстве мы рассмотрим, как использовать официальную C++ библиотеку для интеграции с API 2Captcha. Мы разберем процесс подключения, инициализацию клиента, решение популярных типов капч и корректную обработку ошибок.

Установка и подключение

Библиотека распространяется в виде исходного кода и может быть интегрирована в ваш проект с помощью CMake или vcpkg. Для работы библиотеки требуются установленные libcurl и любая современная версия компилятора, поддерживающего C++11 и выше.

Если вы используете CMake, вы можете добавить библиотеку как подмодуль или подключить её через FetchContent:

cmake Copy
cmake_minimum_required(VERSION 3.10)
project(CaptchaSolver)

set(CMAKE_CXX_STANDARD 11)

find_package(CURL REQUIRED)

add_executable(CaptchaSolver main.cpp)
target_include_directories(CaptchaSolver PRIVATE path/to/2captcha-cpp/include)
target_link_libraries(CaptchaSolver PRIVATE ${CURL_LIBRARIES} path/to/2captcha-cpp/lib/libtwocaptcha.a)

После сборки и линковки библиотеки подключите основной заголовочный файл в вашем коде:

cpp Copy
#include <iostream>
#include <two_captcha/two_captcha.h>

Инициализация клиента

Для начала работы необходимо создать экземпляр класса TwoCaptcha, передав ему ваш API-ключ. В целях безопасности рекомендуется не хранить ключ напрямую в исходном коде, а получать его из переменных окружения или конфигурационных файлов.

cpp Copy
#include <iostream>
#include <cstdlib>
#include <two_captcha/two_captcha.h>

int main() {
    const char* apiKey = std::getenv("CAPTCHA_API_KEY");
    if (!apiKey) {
        std::cerr << "API key not found in environment variables." << std::endl;
        return 1;
    }

    try {
        TwoCaptcha solver(apiKey);
        std::cout << "Client initialized successfully." << std::endl;
        
        // Дальнейший код решения капч
        
    } catch (const std::exception& e) {
        std::cerr << "Initialization error: " << e.what() << std::endl;
    }

    return 0;
}

Решение различных типов капч

Интерфейс библиотеки спроектирован объектно-ориентированным способом: для каждого типа капчи предусмотрен свой класс. Метод solve автоматически отправляет задачу на сервер, ожидает её решения и возвращает готовый результат.

1. GeeTest v4

GeeTest — популярная поведенческая капча, часто встречающаяся на азиатских сайтах, в онлайн-играх и финтех-сервисах. Четвертая версия требует captchaId и URL страницы.

cpp Copy
try {
    GeeTestV4 captcha("abcdef12-3456-7890-abcd-ef1234567890", "https://example.com/login");
    solver.solve(captcha);
    std::cout << "lot_number: " << captcha.getSolution()["lot_number"] << std::endl;
    std::cout << "captcha_output: " << captcha.getSolution()["captcha_output"] << std::endl;
    std::cout << "pass_token: " << captcha.getSolution()["pass_token"] << std::endl;
    std::cout << "gen_time: " << captcha.getSolution()["gen_time"] << std::endl;
} catch (const std::exception& e) {
    std::cerr << "Ошибка решения: " << e.what() << std::endl;
}

2. FunCaptcha (Arkose Labs)

FunCaptcha — интерактивная капча с заданиями вроде вращения объектов или выбора картинок, часто используется в игровой индустрии. Требует публичный ключ (skey) и URL страницы.

cpp Copy
try {
    FunCaptcha captcha("E8A75615-1CDA-5D62-D310-2378D456F0B3", "https://example.com/signup");
    captcha.setServiceUrl("https://example-api.arkoselabs.com");
    solver.solve(captcha);
    std::cout << "Токен FunCaptcha: " << captcha.code() << std::endl;
} catch (const std::exception& e) {
    std::cerr << "Ошибка решения: " << e.what() << std::endl;
}

3. Capy Puzzle

Capy Puzzle — визуальная капча, где пользователю нужно собрать пазл или переместить элемент в нужную позицию. Требует captchaKey и URL страницы.

cpp Copy
try {
    Capy captcha("PUZLE_abcdef1234567890", "https://example.com/register");
    solver.solve(captcha);
    std::cout << "Answer: " << captcha.getSolution()["answer"] << std::endl;
    std::cout << "Challenge Key: " << captcha.getSolution()["challenge_key"] << std::endl;
} catch (const std::exception& e) {
    std::cerr << "Ошибка решения: " << e.what() << std::endl;
}

Полный список поддерживаемых типов капч

На данный момент сервис 2Captcha поддерживает следующие основные типы капч, для которых в библиотеке реализованы соответствующие классы или которые можно решить через универсальные методы: Normal, reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, GeeTest v3 и v4, FunCaptcha, KeyCaptcha, Capy Puzzle, Lemin, Yidun, Amazon WAF, MTCaptcha, CutCaptcha, Tencent, DataDome, CyberSiARA, Coordinates и Rotate.

Дополнительные настройки

Работа через прокси

Если целевой сайт строго проверяет IP-адреса и привязывает капчу к конкретному прокси, вы можете передать параметры прокси непосредственно в объект капчи перед вызовом метода solve.

cpp Copy
try {
    GeeTestV4 captcha("abcdef12-3456-7890-abcd-ef1234567890", "https://example.com/login");
    captcha.setProxy("HTTP", "login:password@198.51.100.10:8080");
    solver.solve(captcha);
    std::cout << "Токен успешно получен." << std::endl;
} catch (const std::exception& e) {
    std::cerr << "Ошибка решения: " << e.what() << std::endl;
}

Настройка таймаутов

По умолчанию библиотека ожидает решения капчи 120 секунд, а интервал между запросами статуса составляет 10 секунд. Эти параметры можно переопределить через методы объекта solver.

cpp Copy
solver.setDefaultTimeout(300);  // Максимальное время ожидания в секундах
solver.setPollingInterval(15);  // Интервал между запросами статуса в секундах

Обработка ошибок

При возникновении ошибок библиотека выбрасывает стандартные исключения C++ (std::exception или его наследники), сообщение которых содержит код и описание ошибки от API. Это позволяет легко перехватывать и логировать проблемы с помощью блоков try-catch.

cpp Copy
try {
    FunCaptcha captcha("E8A75615-1CDA-5D62-D310-2378D456F0B3", "https://example.com/signup");
    solver.solve(captcha);
    std::cout << "Капча успешно решена: " << captcha.code() << std::endl;
} catch (const std::exception& e) {
    std::string errorMsg = e.what();
    std::cerr << "Ошибка решения капчи: " << errorMsg << std::endl;
    
    if (errorMsg == "ERROR_ZERO_BALANCE") {
        std::cerr << "Недостаточно средств на балансе." << std::endl;
        // Логика обработки нулевого баланса
    }
}

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

При возникновении исключений библиотека транслирует коды ошибок API в понятные строковые сообщения. Основные из них представлены в таблице:

Код ошибки Описание Рекомендация
ERROR_WRONG_USER_KEY Неверный формат или значение API-ключа Проверьте правильность ключа в конфигурации
ERROR_ZERO_BALANCE Недостаточно средств на балансе Пополните счет в личном кабинете 2Captcha
ERROR_NO_SLOT_AVAILABLE Нет свободных воркеров Повторите попытку через 10–15 секунд
ERROR_BAD_PARAMETERS Не переданы обязательные параметры Проверьте соответствие параметров документации
ERROR_CAPTCHA_UNSOLVABLE Капча не была решена Средства возвращаются, попробуйте обновить капчу

Отчеты о правильности решения

Для поддержания высокого качества распознавания и возврата средств за неверные решения используйте методы отправки отчетов. Они вызываются у объекта solver и принимают идентификатор решенной задачи.

cpp Copy
// Если сайт принял токен и форма успешно отправилась
solver.reportCorrect(captcha.getId());

// Если сайт отклонил токен с ошибкой валидации
solver.reportIncorrect(captcha.getId());

Полезные ссылки

Заключение

C++ библиотека для 2Captcha берет на себя всю рутинную работу по взаимодействию с API: она скрывает циклы опроса, валидирует входные параметры и возвращает готовые токены или распознанный текст. Благодаря строгой типизации и объектно-ориентированному подходу, она легко и безопасно встраивается как в консольные утилиты, так и в сложные высоконагруженные системы.

Сервис поддерживает десятки различных типов капч, от простых текстовых до сложных поведенческих систем. Это значит, что какой бы вид защиты вы ни встретили на своем пути, у вас всегда будет надежный и производительный инструмент для её обхода на C++.

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