ReCaptcha2 - это усовершенствованный вид каптчи. Для пользователя обычно это выглядит как чекбокс "Я не робот". Иногда после клика по чекбоксу появляется окно, в котором среди нескольких картинок нужно выбрать те, которые соответствуют указанному условию. Данный вид каптчи значительно сложнее в плане реализации и автоматизации процесса разгадывания.
Но на данный момент уже существуют как онлайн, так и оффлайн решения. В A-Parser есть встроенный парсер Util::ReCaptcha2, который как раз и позволяет работать с такими решениями.
Непосредственно рекаптча работает примерно следующим образом. В теле страницы содержится некий sitekey, на основе которого генерируется хэш-ответ. При генерации данного хэша учитывается множество различных факторов, например, время реакции пользователя, правильность выбора предложенных картинок и т.д.
Алгоритм работы с рекаптчами в А-Парсере практически такой же, как и для обычных каптч:
В отличие от обычных каптч, на данный момент в А-Парсере еще нет отдельной JS функции для работы с рекаптчами. Но это абсолютно не мешает нам разгадывать рекаптчи в JS парсерах. Для примера будем использовать эту страницу: http://http.myjino.ru/recaptcha/test-get.php
- Открываем страницу, на которой выдается рекаптча
- Парсим sitekey
- Отправляем sitekey, а также необходимые дополнительные параметры на разгадывание (на данный момент достаточно sitekey и ссылки на страницу, где была получена рекаптча)
- Получаем хэш-ответ
- Отправляем полученный хэш обратно на сайт и получаем нужную нам информацию
Как и в случае с обычными каптчами, сначала нужно проанализировать страницу. Используем Инструменты разработчика в Chrome.
Открыв тестовую страницу, мы видим текстовое поле (которое позволяет передать данные, тем самым убедившись, что рекаптча решена правильно), чекбокс рекаптчи и кнопка "Отправить".
Вводим в текстовое поле произвольные данные, отмечаем чекбокс рекаптчи (если нужно, то проходим через выбор картинок) и нажимаем кнопку "Отправить". Смотрим на вкладке Network в Инструментах разработчика Chrome, какой запрос и куда при этом отправляется. Видим, что отправляется GET запрос, в параметрах которого передается введенный текст и хэш-ответ рекаптчи. И если рекаптча разгадана верно, в ответ приходит страница с текстом "Success! You're in.", а также отображается введенный текст.
Теперь, определив логику работы рекаптчи на странице, можно перейти к написанию парсера.
Как и в примере с обычной каптчей, создаем и открываем новый парсер. Загружается небольшой шаблон, в котором мы редактируем "шапку": определяем какие переменные будет выводить парсер и определяем формат результата по-умолчанию. Также, прописываем выбор пресета настроек для Util::ReCaptcha2.
Далее, в функции *parse(set, results) описываем каждый этап.Код:constructor() { this.defaultConf = { version: '0.1.6', results: { flat: [ ['result', 'ReCaptcha result'], ] }, results_format: '$result\\n', parsecodes: { 200: 1, }, max_size: 200 * 1024, Util_ReCaptcha2_preset: 'default' }; this.editableConf = [ ['Util_ReCaptcha2_preset', ['combobox', 'Util::ReCaptcha2 preset']] ]; }
Загружаем страницу, на которой выдается рекаптча, также проверяем на "удачность" запроса:
Парсим sitekey (с проверкой "успешности"):Код:let response = yield this.request('GET', 'http://http.myjino.ru/recaptcha/test-get.php', {}, { decode: 'auto-html', }); if(!response.success) { this.logger.put('Error open page'); results.success = 0; return results; }
Отправляем найденный sitekey и страницу, на которой он был получен на разгадывание (т.к. отдельной функции в отличие от обычной каптчи пока что нет, мы используем обращение к стандартному парсеру yield this.parser.request:Код:let sitekey; try { sitekey = response.data.match(/data-sitekey="([^"]+)/)[1]; } catch(e) { this.logger.put('Sitekey not found'); results.success = 0; return results; }
Отправляем полученный хэш-ответ GET-запросом на сайт:Код:let ReCaptchaResp = yield this.parser.request('Util::ReCaptcha2', this.conf.Util_ReCaptcha2_preset, {}, sitekey + ' ' + 'http://http.myjino.ru/recaptcha/test-get.php') if(ReCaptchaResp.error != 'none') { this.logger.put('ReCaptcha recognize failed'); results.success = 0; return results; }
Проверяем полученную страницу, если на ней есть текст Success! You're in - значит рекаптча была решена верно и в результат можно вывести сообщение об успехе, иначе ошибка разгадывания:Код:response = yield this.request('GET', 'http://http.myjino.ru/recaptcha/test-get.php', { text: set.query, 'g-recaptcha-response': ReCaptchaResp.resp }, { decode: 'auto-html', }); if(!response.success) { this.logger.put('Error checking ReCaptcha'); results.success = 0; return results; }
Возвращаем результат:Код:if(!/Success! You're in/.test(response.data)) { this.logger.put('Bad ReCaptcha answer'); results.success = 0; return results; } else { this.logger.put('Good ReCaptcha answer'); results.result = 'Success'; }
Сохраняем парсер и проверяем его в работе. В данном случае, поданный на вход запрос будет передан на результирующую страницу, но по факту начальный запрос ни на что не влияет.Код:return results;
Как видим, парсер составлен правильно и рекаптча правильно решается.
Данный пример демонстрирует работу с ReCaptcha2 в JS парсерах. При написании более сложных парсеров алгоритм может отличаться, но в целом общий подход именно такой, как описано выше.
P.S. Аналогично примеру для обычных каптч, в данном случае также рекомендую делать вначале проверку на выбор пресета настроек Util::ReCaptcha2. Пример такой проверки:
Полностью готовый парсер можно забрать здесь.Код:if(this.conf.Util_ReCaptcha2_preset == 'default') { this.logger.put('Select ReCaptcha2 preset'); results.success = 0; return results; }
-
Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!Скрыть объявление
Создание JS парсеров. Работа с ReCaptcha2.
Пример разработки JS парсера для работы с рекаптчами