Чтобы убедиться в справедливости данного утверждения, набросаем скрипт на ruby, для которого легко найдем уже готовые классы, способные сделать предстоящую работу удобной и комфортной. Собственно, понадобятся всего два, с которых и начнем:
require 'open-uri'
require 'nokogiri'
Сервис ruCaptcha.com решает, как уже сказано, самые разнообразные капчи, от reCaptcha всех видов и версий до keyCaptcha, hCaptcha и FunCaptcha; в качестве основы для эксперимента возьмем самое, вероятно, на данный момент популярное в вебе решение - reCaptcha v.2, причем это официальная демка от Google:
URL_RECAPTCHA = 'https://www.google.com/recaptcha/api2/demo'
К слову, вместо google.com мы могли бы без проблем подставить адрес странички, предположим, моего блога, написанного на основе фреймворка Ruby on Rails, где reCaptcha работает посредством джема ambethia/recaptcha; получится все то же самое. Не скажу, что всегда так: скажем, reCaptcha на страницах блога, который вы сейчас листаете - вызывается скриптами K2, компонента Joomla, с которым все, вероятно, не столь однозначно. Но чаще всего описываемый сценарий будет работать, что сейчас и проверим.
Читаем документацию ruCaptcha.com API: итак, прежде всего нам понадобится значение data-sitekey на страничке капчи. Ок, парсим HTML и быстрехонько находим нужное:
def data_sitekey
# Parsing url and getting a data-sitekey of recaptcha
url = URL_RECAPTCHA
html = open(url)
doc = Nokogiri::HTML(html)
doc.xpath('//@data-sitekey')
end
Поясню для тех, кто только-только делает первые шаги в ООП, объектно-ориентированном программировании: теперь обращение к методу data_sitekey дает нам искомое значение data-sitekey, которое вы можете и самостоятельно найти в исходном коде страницы, содержащей reCaptcha. Совсем ведь несложно, а? - да, это магия Nokogiri.
Теперь, получив data-sitekey reCaptcha, мы с вами вполне уже можем сформировать первый запрос к ruCaptcha.com API, в качестве ответа на который получим идентификатор заданной сервису RuCaptcha.com задачки...
def first_request
target = 'https://rucaptcha.com/in.php'
params = {
key: APIKEY,
method: 'userrecaptcha',
googlekey: data_sitekey,
pageurl: URL_RECAPTCHA
}
request(target, params)
end
...что и реализуем при помощи еще одного метода, названного мной request, которому передаем, вызывая, target и params. Состав params, думаю, теперь вполне прозрачен: ключ доступа, выдаваемый сервисом при регистрации, метод, к которому обращаемся (описан в документации), только что полученное значение data-sitekey и адрес странички капчи.
Вот как-то так:
def request(target, params)
uri = URI.parse(target)
uri.query = URI.encode_www_form(params)
uri.open.read
end
Получив ответ ruCaptcha.com API, содержащий ID и таким образом удостоверяющий, что задание получено и принято в работу, ждем 10 секунд и отправляем второй запрос; если полученный уже на него ответ не включает OK (чаще всего возвращается CAPCHA_NOT_READY, означающий, что нужно подождать еще) - повторяем его с тем же интервалом снова и снова, пока не вернется, наконец, искомый нами токен:
target = 'https://rucaptcha.com/res.php'
params = {
key: APIKEY,
action: 'get',
id: answer.gsub('OK|', '')
}
1.times do
begin
sleep 10
request = request(target, params)
raise unless request.include? 'OK'
rescue StandardError
retry
end
end
Что делать с полученным ответом? - хм, ну это дело вкуса. Как вариант, можно подставить его в скрытое на страничке поле с id g-recaptcha-response, что и подразумевает решение reCaptcha. Но только это уже совсем-совсем другая история... заходите на огонек, продолжим.