Эта статья была полезной?
Как обойти капчу с помощью Ruby
Технический специалист
Введение
При автоматизации тестирования, парсинге данных или разработке ботов на Ruby разработчики часто сталкиваются с необходимостью обхода капчи. Написание собственных HTTP-запросов, реализация циклов опроса и обработка таймаутов усложняют код и отвлекают от основной бизнес-логики.
В этом руководстве мы рассмотрим, как использовать официальную библиотеку ruby-2captcha для интеграции с API 2Captcha. Мы разберем процесс установки, инициализации клиента, решения популярных типов капч и корректной обработки ошибок.
Установка и подключение
Библиотека совместима с Ruby версии 2.5 и выше, не имеет тяжелых внешних зависимостей и легко интегрируется в любые проекты, от простых скриптов до крупных приложений на Ruby on Rails.
Установить пакет можно через Bundler, добавив строку в ваш Gemfile:
ruby
gem 'ruby-2captcha'
Затем выполните команду в терминале:
bash
bundle install
Или установите библиотеку напрямую через RubyGems:
bash
gem install ruby-2captcha
После установки подключите её в вашем коде:
ruby
require 'api_2captcha'
Инициализация клиента
Для начала работы необходимо создать экземпляр клиента, передав ему ваш API-ключ. В целях безопасности рекомендуется хранить ключ в переменных окружения, а не в исходном коде.
ruby
api_key = ENV.fetch('CAPTCHA_API_KEY')
client = Api2Captcha.new(api_key)
Решение различных типов капч
Интерфейс библиотеки спроектирован так, что для каждого типа капчи предусмотрен отдельный метод. Метод автоматически отправляет задачу на сервер, ожидает её решения и возвращает готовый результат (текст или токен).
1. Текстовая или графическая капча (Normal)
Для решения обычных капч с изображениями используется метод normal. Изображение можно передать в виде пути к файлу или массива байтов.
ruby
result = client.normal({
image: File.read('/path/to/captcha.png')
})
puts "Распознанный текст: #{result}"
2. reCAPTCHA v2 и Invisible
Для обхода reCAPTCHA необходимо передать sitekey (параметр googlekey) и URL страницы (pageurl). Если используется невидимая версия капчи, добавьте параметр invisible: true.
ruby
token = client.recaptcha_v2({
googlekey: '6LeTxvsqAAAAAK...',
pageurl: 'https://example.com/login',
invisible: true
})
puts "g-recaptcha-response: #{token}"
3. Cloudflare Turnstile
Современная защита от Cloudflare требует передачи sitekey, URL страницы и, для повышения шансов на успешное прохождение, актуального User-Agent.
ruby
token = client.turnstile({
sitekey: '0x4AAAAAA...',
pageurl: 'https://example.com/protected',
useragent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36'
})
puts "cf-turnstile-response: #{token}"
4. Аудио-капча
Если на сайте используется аудио-капча, библиотека позволяет отправить аудиофайл (обычно в формате MP3) и получить распознанный текст.
ruby
decoded_text = client.audio({
audio: File.read('/path/to/challenge.mp3'),
lang: 'ru' # Указываем язык, если он отличается от английского
})
puts "Ответ: #{decoded_text}"
Дополнительные настройки
Работа через прокси
Если целевой сайт строго проверяет IP-адреса и привязывает капчу к конкретному прокси, вы можете передать параметры прокси непосредственно в метод решения.
ruby
token = client.recaptcha_v2({
googlekey: '6LeTxvsqAAAAAK...',
pageurl: 'https://example.com/login',
proxytype: 'http',
proxy: 'login:password@198.51.100.10:8080'
})
Настройка таймаутов
По умолчанию библиотека ожидает решения капчи 120 секунд. Для сложных заданий или при работе в медленных сетях эти параметры можно переопределить.
ruby
client.default_timeout = 300 # Максимальное время ожидания (в секундах)
client.polling_interval = 15 # Интервал между запросами статуса (в секундах)
Асинхронный режим (Callback)
Если ваше приложение не должно блокироваться в ожидании ответа, можно настроить вебхук. Метод мгновенно вернет task_id, а результат решения будет отправлен POST-запросом на указанный вами URL.
ruby
client.callback = 'https://your-app.com/captcha/webhook'
task_id = client.normal({ image: '/path/to/captcha.png' })
puts "Задача отправлена, ID: #{task_id}"
Обработка ошибок
Библиотека предоставляет специализированные классы исключений, что позволяет четко разделять ошибки валидации, сетевые сбои и ответы от API.
ruby
begin
result = client.recaptcha_v2({
googlekey: '6LeTxvsqAAAAAK...',
pageurl: 'https://example.com/login'
})
puts "Капча успешно решена: #{result}"
rescue Api2Captcha::ValidationException => e
puts "Некорректные параметры запроса: #{e.message}"
rescue Api2Captcha::NetworkException => e
puts "Ошибка соединения с API: #{e.message}"
rescue Api2Captcha::TimeoutException => e
puts "Превышено время ожидания решения"
rescue Api2Captcha::ApiException => e
puts "Ошибка со стороны сервиса: #{e.message}"
end
Частые коды ошибок
При возникновении исключений библиотека транслирует коды ошибок API в понятные сообщения. Основные из них представлены в таблице:
| Код ошибки | Описание | Рекомендация |
|---|---|---|
| ERROR_WRONG_USER_KEY | Неверный формат или значение API-ключа | Проверьте правильность ключа в переменных окружения |
| ERROR_ZERO_BALANCE | Недостаточно средств на балансе | Пополните счет в личном кабинете 2Captcha |
| ERROR_NO_SLOT_AVAILABLE | Нет свободных воркеров | Повторите попытку через 10–15 секунд |
| ERROR_BAD_PARAMETERS | Не переданы обязательные параметры | Проверьте соответствие параметров документации |
| ERROR_PROXY_CONNECT_REFUSED | Не удалось подключиться к прокси | Проверьте доступность и формат строки прокси |
| ERROR_CAPTCHA_UNSOLVABLE | Капча не была решена | Средства возвращаются, попробуйте обновить капчу |
Отчеты о правильности решения
Для поддержания высокого качества распознавания и возврата средств за неверные решения, используйте методы отправки отчетов.
ruby
# Если сайт принял токен и форма успешно отправилась
client.report_correct(task_id)
# Если сайт отклонил токен с ошибкой валидации
client.report_incorrect(task_id)
Заключение
Библиотека ruby-2captcha берет на себя всю рутинную работу по взаимодействию с API 2Captcha: она скрывает циклы опроса, валидирует входные параметры и возвращает готовые токены или распознанный текст. Благодаря чистому и идиоматичному синтаксису, она легко встраивается как в консольные утилиты, так и в веб-приложения на Ruby on Rails.
Для начала работы достаточно установить пакет, инициализировать клиент с вашим API-ключом и вызвать нужный метод. При необходимости вы можете легко добавить поддержку прокси, настроить таймауты или реализовать асинхронную обработку через callback-адреса.
Полезные ссылки
- Исходный код и документация библиотеки: https://github.com/2captcha/2captcha-ruby
- Примеры использования: https://github.com/2captcha/2captcha-ruby/tree/main/examples
- Полная документация API 2Captcha: https://ru
- captcha.com/api-docs
- Центр поддержки: https://rucaptcha.com/support/tickets/new