ReCaptcha2 - это усовершенствованный вид каптчи. Для пользователя обычно это выглядит как чекбокс "Я не робот". Иногда после клика по чекбоксу появляется окно, в котором среди нескольких картинок нужно выбрать те, которые соответствуют указанному условию. Данный вид каптчи значительно сложнее в плане реализации и автоматизации процесса разгадывания.
Но на данный момент уже существуют как онлайн, так и оффлайн решения. В A-Parser есть встроенный парсер
Util::ReCaptcha2, который как раз и позволяет работать с такими решениями.
Непосредственно рекаптча работает примерно следующим образом. В теле страницы содержится некий sitekey, на основе которого генерируется хэш-ответ. При генерации данного хэша учитывается множество различных факторов, например, время реакции пользователя, правильность выбора предложенных картинок и т.д.
Алгоритм работы с рекаптчами в А-Парсере практически такой же, как и для обычных каптч:
Как и в случае с обычными каптчами, сначала нужно проанализировать страницу. Используем Инструменты разработчика в Chrome.
Открыв тестовую страницу, мы видим текстовое поле (которое позволяет передать данные, тем самым убедившись, что рекаптча решена правильно), чекбокс рекаптчи и кнопка "Отправить".
Вводим в текстовое поле произвольные данные, отмечаем чекбокс рекаптчи (если нужно, то проходим через выбор картинок) и нажимаем кнопку "Отправить". Смотрим на вкладке Network в Инструментах разработчика Chrome, какой запрос и куда при этом отправляется. Видим, что отправляется GET запрос, в параметрах которого передается введенный текст и хэш-ответ рекаптчи. И если рекаптча разгадана верно, в ответ приходит страница с текстом "Success! You're in.", а также отображается введенный текст.
Теперь, определив логику работы рекаптчи на странице, можно перейти к написанию парсера.
Как и в примере с обычной каптчей, создаем и открываем новый парсер. Загружается небольшой шаблон, в котором мы редактируем "шапку": определяем какие переменные будет выводить парсер и определяем формат результата по-умолчанию. Также, прописываем выбор пресета настроек для
Util::ReCaptcha2.
Далее, в функции *parse(set, results) описываем каждый этап.
Загружаем страницу, на которой выдается рекаптча, также проверяем на "удачность" запроса:
Парсим sitekey (с проверкой "успешности"):
Отправляем найденный sitekey и страницу, на которой он был получен на разгадывание (т.к. отдельной функции в отличие от обычной каптчи пока что нет, мы используем обращение к стандартному парсеру yield this.parser.request:
Отправляем полученный хэш-ответ GET-запросом на сайт:
Проверяем полученную страницу, если на ней есть текст Success! You're in - значит рекаптча была решена верно и в результат можно вывести сообщение об успехе, иначе ошибка разгадывания:
Возвращаем результат:
Сохраняем парсер и проверяем его в работе. В данном случае, поданный на вход запрос будет передан на результирующую страницу, но по факту начальный запрос ни на что не влияет.
Как видим, парсер составлен правильно и рекаптча правильно решается.
Данный пример демонстрирует работу с ReCaptcha2 в JS парсерах. При написании более сложных парсеров алгоритм может отличаться, но в целом общий подход именно такой, как описано выше.
P.S. Аналогично примеру для обычных каптч, в данном случае также рекомендую делать вначале проверку на выбор пресета настроек
Util::ReCaptcha2. Пример такой проверки:
Полностью готовый парсер можно забрать здесь.
Но на данный момент уже существуют как онлайн, так и оффлайн решения. В A-Parser есть встроенный парсер
Util::ReCaptcha2, который как раз и позволяет работать с такими решениями.Непосредственно рекаптча работает примерно следующим образом. В теле страницы содержится некий sitekey, на основе которого генерируется хэш-ответ. При генерации данного хэша учитывается множество различных факторов, например, время реакции пользователя, правильность выбора предложенных картинок и т.д.
Алгоритм работы с рекаптчами в А-Парсере практически такой же, как и для обычных каптч:
- Открываем страницу, на которой выдается рекаптча
- Парсим sitekey
- Отправляем sitekey, а также необходимые дополнительные параметры на разгадывание (на данный момент достаточно sitekey и ссылки на страницу, где была получена рекаптча)
- Получаем хэш-ответ
- Отправляем полученный хэш обратно на сайт и получаем нужную нам информацию
Как и в случае с обычными каптчами, сначала нужно проанализировать страницу. Используем Инструменты разработчика в Chrome.
Открыв тестовую страницу, мы видим текстовое поле (которое позволяет передать данные, тем самым убедившись, что рекаптча решена правильно), чекбокс рекаптчи и кнопка "Отправить".
Вводим в текстовое поле произвольные данные, отмечаем чекбокс рекаптчи (если нужно, то проходим через выбор картинок) и нажимаем кнопку "Отправить". Смотрим на вкладке Network в Инструментах разработчика Chrome, какой запрос и куда при этом отправляется. Видим, что отправляется GET запрос, в параметрах которого передается введенный текст и хэш-ответ рекаптчи. И если рекаптча разгадана верно, в ответ приходит страница с текстом "Success! You're in.", а также отображается введенный текст.
Теперь, определив логику работы рекаптчи на странице, можно перейти к написанию парсера.
Как и в примере с обычной каптчей, создаем и открываем новый парсер. Загружается небольшой шаблон, в котором мы редактируем "шапку": определяем какие переменные будет выводить парсер и определяем формат результата по-умолчанию. Также, прописываем выбор пресета настроек для
Util::ReCaptcha2.
Код:
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']]
];
}
Загружаем страницу, на которой выдается рекаптча, также проверяем на "удачность" запроса:
Код:
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;
}
Код:
let sitekey;
try {
sitekey = response.data.match(/data-sitekey="([^"]+)/)[1];
} catch(e) {
this.logger.put('Sitekey not found');
results.success = 0;
return results;
}
Код:
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;
}
Код:
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;
}
Полностью готовый парсер можно забрать здесь.