Пятница, 29 мая 2020 20:38

RuCaptcha.com API: пишем сценарий на ruby

Оцените материал
(3 голосов)

Попробуем сегодня потестировать ruCaptcha.com API. Сервис позволяет решать капчу (CAPTCHA — Completely Automated Public Turing test to tell Computers and Humans Apart), также конвертировать в текст любые изображения, которые способен распознать человек. API сервиса, предназначенного для решения самых популярных капч, используемых сегодня в вебе, позволяет несложное и удобное автоматизирование выполнения разнообразных задач такого рода.

 

RuCaptcha.com API: пишем сценарий на ruby
RuCaptcha.com API: пишем сценарий на ruby

 

Чтобы убедиться в справедливости данного утверждения, набросаем скрипт на 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, с которым все, вероятно, не столь однозначно. Но чаще всего описываемый сценарий будет работать, что сейчас и проверим.

 

Если лениво заморачиваться с объяснениями, а попробовать все же хочется, то полностью готовый к работе скрипт возможно взять с моего гитхаба; разумеется, операционная система вашего ПК должна содержать установленные интерпретатор и указанные выше ruby-gems. Только не забывайте, пожалуйста, что код представляет из себя всего только концепт, хотя и полностью рабочий: автор не ставил себе задачи учесть всю таблицу возможных ответов ruCaptcha.com API. Например, если возвращается ERROR_CAPTCHA_UNSOLVABLE - прервите работу скрипта по Ctrl + D. Сценарий без проблем масштабируется, буде интерес - не стесняйтесь дописывать и менять его так, как пожелаете.

 

Читаем документацию 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. Но только это уже совсем-совсем другая история... заходите на огонек, продолжим.

Последнее изменениеВоскресенье, 31 мая 2020 13:06

Оставить комментарий

Добавьте ваш комментарий

Poker onRails

How to create a Joomla Contact Form