Введение
Приветствую всех.
Ни для кого не секрет, что Recaptcha 2 за последний год стала очень популярной и практически нет никого, кто бы с ней не сталкивался. В нашем нелегкой работе приходится сталкиваться с ней при создании проектов: парсинге, создании регеров, брутеров, чеккеров и множестве других задач. И особой проблемой является написание проекта (кода/сниппета) для решения капчи.
Совсем недавно я занимался парсингом данных с одного небезызвестного ресурса с помощью несложной программы. И все шло отлично, пока сайт, с которого парсит программа не решил ввести защиту от ботов - Recaptcha. Я естественно начал искать подходящие решения для того, чтобы дополнить мой бот, но программистов, знакомых с работой Recaptcha было мало, а те кто знали как решить программу, предлагали медленные решения с Imacros или PhantomJS с использованием прокси или т.д. Но осложнялось всё тем, что моей главной целью было стабильное и быстрое решения Recaptcha, при этом изменение ip адреса и использование прокси запрещалось.
Всё изменилось, когда я открыл для себя Zennoposter. Прочитав основные функции и принцип работы Zennoposter я понял, что смогу добиться того, чтобы Recaptcha принимала написанный мною проект за человека и добиться максимально быстрого решения данной капчи.
Сбор данных для отправки на сервис распознавания Rucaptcha
и эмуляция нажатия кнопок
Первым делом я решил, что для качественной эмуляции человека нужно сэмулировать правильное нажатие кнопок "Я не робот", "Подтвердить" и "Обновить" и поставил эмуляции на уровень "качество".
Далее необходимо было добавиться время задержки после нажатия кнопки "Я не робот". Я долго испытывал тестовую версию Recaptcha (
www.google.com/recaptcha/api2/demo) и убедился, что время может колебаться с 1 до 2 сек (редкий вариант). Поэтому поставил около 1 сек и потом добавил экшен проверки того, загрузились ли изображения или разгадка не требуется и капча разгадана, если оба варианта не сработали, то идет ожидание 300 мс и проверка идет заново.
Поиск задания для решения оказался простым и я извлек его обычными регулярными выражениями.
Аналогично я решил проблему с тем, чтобы определить тип разгадываемой Recaptcha:
1) с довыбором изображений;
2) без изменяющихся картинок.
Большой проблемой было получение изображений для отправки на сервис распознавания. Поначалу я собирался извлекать сами ссылки, сохранять их и отправлять для разгадки. Но если попадается капча, в которой изменяются изображения, то они шли отдельными файлами и склейка изображений оказалась бы проблематичной. Поэтому я выбрал для себя вариант со скриншотом страницы, правильно задал все границы и всё работало отлично, пока не стал применять проект на своей ссылке для парсинга и в итоге оказалось, что экшен скриншота иногда неправильно определяет границы страницы и при всем желании не может сделать скриншот капчи, если она выйдет за изначальные границы страницы. Вследствие этого я использовал модуль CaptchaSaver для определенного элемента страницы и стал получать таким образом изображения для отправки на сервис.
Определение размера капчи (3*3,4*4 или 2*4) не составляет труда и эти параметры нужны будут в дальнейшем для отправки на сервис распознавания Rucaptcha и наложения сетки.
POST и GET
Так как стандартный модуль от Zennoposter неудобен для задания сложных запросов с отправкой файлов, сохраненных в какой-либо папке и точным заданием промежутков времени между запросами на сервис распознавания, то я использовал экшены POST и GET запросов. Также благодаря ним можно делать по несколько POST запросов, чтобы увеличить точность и время распознавания, что я и использовал в одном из своих шаблонов.
Решение капчи с изменяющимися изображениями
Поскольку решение такого вида капчи оканчивается тем, что подходящих изображений не остается, то я искал сервис распознавания, который бы позволил мне реализовать данную функцию в шаблоне и остановился на Rucaptcha. Мне пришлось хорошенько обдумать свой шаблон таким образом, чтобы после каждого разгадывания заново отправлялось изображение и при последующем разгадывании позволялось нажимать только на те изображения, которые изменились. Таким образом процент правильно решенных капч повышался.
Но я решил связаться с командой Rucaptcha и предложил им свой вариант решения, который они вскоре реализовали у себя на сервисе. Суть его такова: вводится дополнительный параметр previousID, который закрывает изображения, на которые предлагал нажать предыдущий работник. Если подходящих изображений нет, то работник отправляет специальный параметр, что изображения закончились и шаблон нажимает на кнопку подтвердить.
Решение капчи без изменяющихся изображениями не составляет труда и её отправка практически аналогична (не отправляются параметры previousID и can_no_answer).
Проверка дополнительных ошибок после нажатия "Подтвердить"
Ошибки решении могут остановить работу шаблона или выдать Bad end, поэтому после нажатия кнопки "Подтвердить" идет проверка наличия текста "Выберите все совпадающие изображения" и "Просмотрите также новые изображения" и в случае их присутствия шаблон обновляет изображения и всё идет по новому кругу.
Результат работы шаблона
Немногие знают, что у Recaptcha 2 есть несколько уровней защиты от ботов и самая высокая представлена на странице Demo версии Recaptcha 2 (
http://www.google.com/recaptcha/api2/demo). Я сотни раз запускал свой шаблон и много раз его изменял. Всё чаще перед каждым запуском шаблона гугл отправлял мне капчу, которая не требовала довыбирать изображения. Пару раз даже гугл пропустил мой проект без какого-либо задания.
Затем я решил, что настало время запустить проект для сайта, с которого я парсил данные. Вдобавок я использовал гугловскую почту, что положительно сказывалось на моем проекте. Результат не заставил себя ждать и при нечастом использовании (раз в пару часов решение Recaptcha 2) гугл зачастую меня пропускал без задания или отправлял мне простые картинки.
Тонкости работы с шаблоном и почему я представляю 2 шаблона
Так как необходимо было самое быстрое решение, то я отправляю сразу 5 POST запросов на Rucaptcha. Из них выбираются первые 2 совпадающие и потом уже производится необходимое действие. Если 2 совпадающих вариантов не находится, то проект выбирает те нажатия на изображения, которые предлагались 2 и более раз. Таким образом решаются следующие задачи:
1) увеличивается точность решения;
2) увеличивается скорость решения;
3) минимизируется вариант, что потребуется обновлять капчу.
Помимо этого я представляю вариант с одним POST запросом для тех, кому описанный выше способ является затратным.
Для запуска шаблона надо ввести свой ключ Rucaptcha в указанный на проекте экшен рядом с заметкой.
Иногда бывают ресурсы, на которых придется изменить параметр проверки решения капчи с
role="checkbox" aria-checked="false" на
role="checkbox" aria-checked="true" и поменять стрелки местами у экшена условия '{-Variable.proverka-}' == '' (возле заметки "Проверка необходимости решения - см. картинку выше). Если стоит "false", то капча не решена, "true" - решена. Я уже сталкивался с обоими вариантами, поэтому тут универсальный не придумаешь.
Если хотите использовать вариант рекапчи без изменяющихся изображений, то после положительного результата надо добавить экшен обновления (до 3 раз рекомендую) и Bad end в случае, когда попытки закончатся (можно использовать экшен условия '0' == '1').
Я выложу 2 варианта шаблонов:
1) с одним POST запросом;
2) с 5 POST запросами для более быстрого и точного решения, который сам использую.
Заключение и выводы
Таким образом, мы в вами разобрали принцип работы шаблона Zennoposter для решения Recaptcha 2 с помощью сервиса распознавания Rucaptcha. Данный шаблон содержит в себе примеры работы с POST и GET, качественной эмуляции кликов, правильным сохранением изображений и, что самое главное, решением Recaptcha 2.
Я думаю, что этот шаблон пригодится многим пользователям программы, так как является готовым решением Recaptcha 2 (необходимо только вставить шаблон и наслаждаться его работой).