Как обойти капчу на Java
Автоматизация обхода капч — сложная, но решаемая задача. При использовании сервисов распознавания процесс можно значительно упростить и провести автоматизацию .
В статье разобраны методы обхода и приведеы примеры кода, готовые решения для языка программирования Java.
Причины для обхода капч
Цель использования технологий по распознаванию — не взлом систем защиты, а оптимизация автоматизированных процессов и обеспечение доступности.
- Доступность: Капчи создают барьеры для пользователей с ограниченными возможностями, затрудняя доступ к информации.
- Автоматизация: Парсинг и автоматическое тестирование требуют минимального взаимодействия с интерфейсом, а капчи блокируют ботов.
Современные капчи используют машинное обучение, поведенческий анализ и динамические проверки, что делает их сложными для обхода без дополнительных инструментов.
Как обойти капчи на Java
В статье разобраны примеры кода, как обойти капчи с использованием Java и библиотек сторонних сервисов по распозначанию.
Решение обеспечивает API по распознаванию капч для решения reCAPTCHA, Arkose, Cloudflare и других типов, и использование пакета Java.
Можно использовать более дешевый сервис - SolveCaptcha (API для решения капч), решение универсально и дает возможность использовать любой сервис.
Установка
Пакет 2Captcha можно установить через менеджер пакетов или вручную.
Библиотека 2captcha-java доступна в Maven Central для удобной интеграции.
Дополнительную информацию можно найти в репозитории на GitHub, где представлены библиотеки и модули для упрощения работы с API решения капч.
Настройка
После установки пакета 2Captcha можно настроить его параметры для оптимизации работы в соответствии с вашими требованиями. Ниже приведено подробное описание всех доступных параметров конфигурации.
Инициализация экземпляра
Для начала работы создайте экземпляр класса TwoCaptcha
, указав API-ключ:
TwoCaptcha solver = new TwoCaptcha("ВАШ_API_КЛЮЧ");
Вы также можете настроить дополнительные параметры для управления поведением solver'а:
solver.setSoftId(123); // ID программного обеспечения в каталоге 2Captcha
solver.setCallback("https://your.site/result-receiver"); // URL для получения результата
solver.setDefaultTimeout(120); // Таймаут ожидания (кроме reCAPTCHA)
solver.setRecaptchaTimeout(600); // Таймаут ожидания для reCAPTCHA
solver.setPollingInterval(10); // Не рекомендуется устанавливать значение ниже 5 секунд, так как это может привести к блокировке API из-за слишком частых запросов. // Интервал запросов к API
Параметры конфигурации
Параметр | Значение по умолчанию | Описание |
---|---|---|
softId |
- |
ID программного обеспечения после публикации в каталоге 2Captcha. |
callback |
- |
URL для получения результата. Должен быть зарегистрирован в настройках pingback вашей учетной записи. |
defaultTimeout |
120 |
Таймаут ожидания в секундах для всех капч, кроме reCAPTCHA. Определяет, как долго solver будет запрашивать ответ с res.php API. |
recaptchaTimeout |
600 |
Таймаут ожидания (в секундах) для reCAPTCHA. |
pollingInterval |
10 |
Интервал между запросами к API res.php . Не рекомендуется ставить значение меньше 5 секунд. |
Важные замечания
- Если указан callback URL, то
TwoCaptcha
не будет запрашивать результат решения. Вместо этого возвращается ID капчи, а результат отправляется на callback URL. - Для ручного получения ответа используйте метод
getResult()
после отправки капчи.
Решение капчи
При отправке изображений капчи можно передавать дополнительные параметры, чтобы помочь работникам 2Captcha решить ее быстрее.
Доступные параметры
Параметр | Значение по умолчанию | Описание |
---|---|---|
numeric |
0 |
Определяет, содержит ли капча только цифры (см. документацию API). |
minLength |
0 |
Минимальная длина ответа. |
maxLength |
0 |
Максимальная длина ответа. |
phrase |
0 |
Определяет, состоит ли ответ из нескольких слов. |
caseSensitive |
0 |
Определяет, чувствителен ли ответ к регистру. |
calc |
0 |
Указывает, требуется ли вычисление. |
lang |
- |
Определяет язык капчи. |
hintImg |
- |
Изображение с подсказкой для работников. |
hintText |
- |
Текстовая подсказка или задание для работников. |
Пример решения обычной капчи
Normal captcha = new Normal();
captcha.setFile("path/to/captcha.jpg");
captcha.setMinLen(4);
captcha.setMaxLen(20);
captcha.setCaseSensitive(true);
captcha.setLang("en");
try {
solver.solve(captcha);
System.out.println("Капча решена: " + captcha.getCode());
} catch (Exception e) {
System.out.println("Ошибка: " + e.getMessage());
}
Решение reCAPTCHA v2
ReCaptcha captcha = new ReCaptcha();
captcha.setSiteKey("6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-");
captcha.setUrl("https://mysite.com/page/with/recaptcha");
captcha.setInvisible(true);
captcha.setAction("verify");
captcha.setProxy("HTTPS", "login:password@IP_address:PORT");
Решение FunCaptcha (Arkose Labs)
FunCaptcha captcha = new FunCaptcha();
captcha.setSiteKey("69A21A01-CC7B-B9C6-0F9A-E7FA06677FFC");
captcha.setUrl("https://mysite.com/page/with/funcaptcha");
captcha.setSUrl("https://client-api.arkoselabs.com");
captcha.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36");
captcha.setProxy("HTTPS", "login:password@IP_address:PORT");
Решение GeeTest
GeeTest captcha = new GeeTest();
captcha.setGt("f2ae6cadcf7886856696502e1d55e00c");
captcha.setChallenge("12345678abc90123d45678ef90123a456b");
captcha.setUrl("https://mysite.com/captcha.html");
captcha.setProxy("HTTPS", "login:password@IP_address:PORT");
Решение KeyCaptcha
KeyCaptcha captcha = new KeyCaptcha();
captcha.setUserId(10);
captcha.setSessionId("493e52c37c10c2bcdf4a00cbc9ccd1e8");
captcha.setWebServerSign("9006dc725760858e4c0715b835472f22");
captcha.setWebServerSign2("2ca3abe86d90c6142d5571db98af6714");
captcha.setUrl("https://www.keycaptcha.ru/demo-magnetic/");
captcha.setProxy("HTTPS", "login:password@IP_address:PORT");
Решение Capy
Capy captcha = new Capy();
captcha.setSiteKey("PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v");
captcha.setUrl("https://www.mysite.com/captcha/");
captcha.setProxy("HTTPS", "login:password@IP_address:PORT");
ReCaptcha captcha = new ReCaptcha();
captcha.setSiteKey("6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-");
captcha.setUrl("https://mysite.com/page/with/recaptcha");
captcha.setInvisible(true);
captcha.setAction("verify");
captcha.setProxy("HTTPS", "login:password@IP_address:PORT");
Решение reCAPTCHA v3
ReCaptcha captcha = new ReCaptcha();
captcha.setSiteKey("6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-");
captcha.setUrl("https://mysite.com/page/with/recaptcha");
captcha.setVersion("v3");
captcha.setAction("verify");
captcha.setScore(0.3);
captcha.setProxy("HTTPS", "login:password@IP_address:PORT");
Другое
Проверка баланса аккаунта
Для проверки баланса учетной записи 2Captcha используйте метод balance()
:
// Получить текущий баланс
double balance = solver.balance();
Отправка и получение результата вручную
Методы send
и getResult
позволяют вручную отправлять капчу на решение и получать результат:
// Отправка капчи
String captchaId = solver.send(captcha);
// Ожидание перед запросом результата
Thread.sleep(20 * 1000); // Время ожидания может зависеть от сложности капчи. В некоторых случаях может понадобиться больше времени.
// Получение результата
String code = solver.getResult(captchaId);
Сообщение о правильности решения
Если капча была решена неверно, можно отправить жалобу через API:
// Отправить подтверждение, что капча решена правильно
solver.report(captcha.getId(), true);
// Отправить жалобу на неправильное решение
solver.report(captcha.getId(), false); // Если капча была решена неправильно, отправляется жалоба. Если жалоба подтверждена, средства за её решение возвращаются на баланс.
Обработка ошибок
Чтобы корректно обрабатывать ошибки, используйте try/catch
.
Пример
try {
solver.solve(captcha);
} catch (ValidationException e) {
System.out.println("Ошибка валидации: " + e.getMessage());
} catch (NetworkException e) {
System.out.println("Ошибка сети: " + e.getMessage());
} catch (ApiException e) {
System.out.println("Ошибка API: " + e.getMessage());
} catch (TimeoutException e) {
// Таймаут решения капчи. Попробуйте повторно отправить запрос или использовать альтернативный сервис решения капч.
// Также можно увеличить значение timeout для сложных капч. {
System.out.println("Таймаут решения капчи: " + e.getMessage());
} catch (Exception e) {
System.out.println("Произошла непредвиденная ошибка: " + e.getMessage());
}