Капча
Обходим капчу
В процессе парсинга сайтов вы наверняка сталкивались с ограничениями, накладываемыми вебмастерами на автоматизированные методы использования ресурсов сайта. Одним из таких методов является использование капчи. Капча - это автоматизированный тест Тьюринга для различия роботов и людей. Как правило, пользователю показывается изображение с символами и система просит ввести эти символы в поле, или же показывается серия изображений и требуется выбрать только изображения с определенным признаком. Например, только те, на которых изображены автомобили, или дорожные знаки.
Существует множество сервисов и программных продуктов, позволяющих вебмастеру внедрить капчу на сайт. Наиболее распространены сервисы Google ReCaptcha и Funcaptcha. Если капча сложная и использовать OCR функционал не получается для ее обхода, то на помощь к вам придут специализированные сервисы с ручным решением капчи. С несколькими такими сервисами мы внедрили интеграцию и ваши диггеры могут легко отдавать капчу для решения в эти сервисы и получать в ответ специальные токены или вручную распознанные символы с картинок в автоматическом режиме.
Для использования этого функционала вам нужно будет иметь аккаунт в одном из таких сервисов. Поскольку эти услуги платные, вы оплачиваете их самостоятельно используя ваш собственный аккаунт в этих системах.
Diggernaut - наш собственный сервис для решения графических капч на определенных сайтах. Этот сервис бесплатен для всех наших пользователей и не требует подключения дополнительных услуг. Он доступен для использования только в облаке, и в скомпилированных диггерах не поддерживается. На данный момент реализовано решение капчи на сайтах: Amazon.
RuCaptcha - сервис для решения графических капч и капч типа Google ReCaptcha v2. Для Google ReCaptcha v2 может быть использован режим "без прокси", в обычном режиме вы должны для парсинга использовать свои прокси сервера с доступом по логину и паролю. Этот режим может быть полезен тем, кто не имеет своих прокси-серверов и не желает их использовать, предпочитая использовать нашу прокси сеть. Также этот сервис пока единственный, позволяющий решать Google ReCaptcha v3.
AntiCaptcha - сервис для решения графических капч и капч типа Google ReCaptcha v2. Для Google ReCaptcha v2 может быть использован режим "без прокси", в обычном режиме вы должны для парсинга использовать свои прокси сервера с доступом по логину и паролю. Этот режим может быть полезен тем, кто не имеет своих прокси-серверов и не желает их использовать, предпочитая использовать нашу прокси сеть.
DeathByCaptcha - может практически то же, что и AntiCaptcha, кроме режима "без прокси". Также для этого провайдера у нас интегрирован только сервис для решения Google ReCaptcha v2. Поэтому, если вы хотите использовать режим "без прокси" или решать графические капчи - используйте сервис AntiCaptcha или RuCaptcha.
Команда для решения капчи captcha_resolve может быть использована в контексте блока или страницы. Процесс происходит автоматически, но так как это ручное распознавание, процесс может длиться от 20 сек до 2 минут. По завершению выполнения команды, результат распознавания (или токен для ReCaptcha v2/v3) будет записан в переменную captcha.
Эта переменная в дальнейшем может быть прочитана в регистр и передана с формой валидации капчи, или с запросом на сервер. Ниже мы приведем пример, как правильно описывать логику работы для решения ReCaptcha v2 и обычной графической капчи.
Командой используются следующие параметры:
Параметр | Описание |
---|---|
provider | Обязательный параметр, который указывает какой провайдер для решения капчи будет использован. В данный момент поддерживаются провайдеры: diggernaut, deathbycaptcha.com, anticaptcha и rucaptcha. |
type | Тип распознаваемой капчи. В данный момент поддерживаются опции:
image для распознавания графической капчи (работает только с провайдером AntiCaptcha),
recaptchav2 для распознавания Google ReCaptcha v2,
proxyless_recaptchav2 для распознавания Google ReCaptcha v2 в режиме "без прокси"
(работает только с провайдерами AntiCaptcha и RuCaptcha) и
recaptchav3 для распознавания Google ReCaptcha v3 (работает только с провайдером RuCaptcha). При использования провайдера Diggernaut, в этом поле нужно указать один из поддерживаемых идентификаторов сайта на котором решается капча: amazon. |
image | Если тип капчи image или amazon, в этом параметре передается изображение, закодированное в формате base64. |
username | Если вы используете провайдера Death By Captcha, в этом параметре нужно передавать ваше имя пользователя в системе deathbycaptcha.com. |
password | Если вы используете провайдера Death By Captcha, в этом параметре нужно передавать ваш пароль в системе deathbycaptcha.com. |
apikey | Если вы используете провайдера AntiCaptcha или RuCaptcha, в этом параметре нужно передавать ваш ключ к API в системе AntiCaptcha. |
sitekey | Используется для ReCaptcha v2/v3 и извлекается обычно автоматически со страницы. Однако для некоторых случаев, когда диггер не может извлечь ключ сайта со страницы, можно явно задать его в этом параметре. |
action | Используется для ReCaptcha v3 и извлекается обычно автоматически со страницы. Однако для некоторых случаев, когда диггер не может извлечь значение этого параметра со страницы, можно явно задать его, передав это поле в команду. |
Ниже мы приведем пример, как можно легко решать капчу на любом из сайтов Amazon:
# УСТАНАВЛИВАЕМ ПЕРЕМЕННУЮ ДЛЯ ИСПОЛЬЗОВАНИЯ В КОМАНДЕ WALK
- variable_set:
field: "repeat"
value: "yes"
# ЗАХОДИМ НА СТРАНИЦУ В РЕЖИМЕ REPEAT
- walk:
to: https://www.amazon.com
repeat: <%repeat%>
do:
# ЗАХОДИМ В БЛОК BODY
- find:
path: body
do:
- parse
# ПРОВЕРЯЕМ ЕСТЬ ЛИ НА СТРАНИЦЕ КАПЧА
- if:
match: Type the characters you see in this image
do:
# КАПЧА ЕСТЬ, ВКЛЮЧАЕМ ПЕРЕГРУЗКУ СТРАНИЦЫ
- variable_set:
field: "repeat"
value: "yes"
# СОБИРАЕМ ПАРАМЕТРЫ СО СТРАНИЦЫ, КОТОРЫЕ НУЖНО БУДЕТ ПЕРЕДАТЬ НА СЕРВЕР AMAZON ВМЕСТЕ С РАСПОЗНАННОЙ КАПЧЕЙ
# СОХРАНЯЕМ ИХ В ПЕРЕМЕННЫЕ
- find:
path: input[name="amzn"]
do:
- parse:
attr: value
- normalize:
routine: urlencode
- variable_set: amzn
- find:
path: input[name="amzn-r"]
do:
- parse:
attr: value
- normalize:
routine: urlencode
- variable_set: amznr
# ПЕРЕХОДИМ В БЛОК С ИЗОБРАЖЕНИЕМ КАПЧИ
- find:
path: div.a-row>img
do:
# ПАРСИМ URL НА ИЗОБРАЖЕНИЕ
- parse:
attr: src
# ЗАГРУЖАЕМ ИЗОБРАЖЕНИЕ
- walk:
to: value
do:
# ПЕРЕХОДИМ В БЛОК С ЗАКОДИРОВАННЫМ В BASE64 ИЗОБРАЖЕНИЕМ
- find:
path: imgbase64
do:
# ПАРСИМ СОДЕРЖИМОЕ И СОХРАНЯЕМ В ПЕРЕМЕННУЮ
- parse
- variable_set: capimg
# РЕШАЕМ КАПЧУ
- captcha_resolve:
provider: diggernaut
type: amazon
image: <%capimg%>
# ЧИТАЕМ ПЕРЕМЕННУЮ CAPTCHA В РЕГИСТР ДЛЯ ПРОВЕРКИ
- variable_get: captcha
# ЕСЛИ КАПЧА РАСПОЗНАНА
- if:
match: \S+
do:
# ОТПРАВЛЯЕМ РАСПОЗНАННУЮ КАПЧУ НА СЕРВЕР AMAZON
- walk:
to: https://www.amazon.com/errors/validateCaptcha?amzn=<%amzn%>&amzn-r=<%amznr%>&field-keywords=<%captcha%>
do:
else:
# КАПЧИ НЕТ, ОТКЛЮЧАЕМ ПЕРЕГРУЗКУ СТРАНИЦЫ
- variable_set:
field: "repeat"
value: "no"
# ПАРСИМ СТРАНИЦУ И СОБИРАЕМ ДАННЫЕ
Рассмотрим пример, когда на странице присутствует Google ReCaptcha v2. Мы будем использовать метод "без прокси":
# ЗАХОДИМ НА СТРАНИЦУ С КАПЧЕЙ
- walk:
to: https://www.nebraska.gov/sos/corp/corpsearch.cgi
do:
# РЕШАЕМ КАПЧУ
- captcha_resolve:
provider: anticaptcha
type: proxyless_recaptchav2
apikey: xxxxxxxxxxxxxxxxxxx
- find:
path: body
do:
# ПРОВЕРЯЕМ ЕСТЬ ЛИ ТОКЕН В ПЕРЕМЕННОЙ captcha
- variable_get: captcha
- if:
match: \S
do:
# ТОКЕН НА МЕСТЕ, ОТПРАВЛЯЕМ ФОРМУ
- walk:
to:
post: https://www.nebraska.gov/sos/corp/corpsearch.cgi
data:
search: 1
keyword_type: all
search_type: num_search
corpname:
acct-num: 1000011010101
g-recaptcha-response: <%captcha%>
submit: submit
do:
# ОБРАБАТЫВАЕМ СТРАНИЦУ И СОБИРАЕМ ДАННЫЕ
Приведем еще один пример для графической капчи:
# ЗАХОДИМ НА СТРАНИЦУ С КАПЧЕЙ
- walk:
to: https://eservices.cmcoh.org/eservices/home.page
headers:
Wicket-Focusedelementid: ''
Wicket-Ajax: ''
do:
# ИЩЕМ ЭЛЕМЕНТ С ИЗОБРАЖЕНИЕМ КАПЧИ
- find:
path: img.captchaImg
do:
- parse:
attr: src
# ЗАГРУЖАЕМ КАРТИНКУ В BASE64
- walk:
to: value
do:
- find:
path: imgbase64
do:
- parse
- variable_set: image
# РЕШАЕМ КАПЧУ
- captcha_resolve:
provider: anticaptcha
type: image
apikey: xxxxxxxxxxxxxxxxxxx
image: <%image%>
- find:
path: a.anchorButton
do:
- variable_get: captcha
- if:
match: \w+
do:
# ЕСЛИ КАПЧА РАСПОЗНАНА, ОТПРАВЛЯЕМ ЕЕ НА СЕРВЕР И СОБИРАЕМ ДАННЫЕ
В некоторых случаях капча может быть распознана неверно. В этом случае вы можете отправить отчет о неправильно решенной капче с помощью команды captcha_report. В этом случае неправильно распознанная капча может быть вам компенсирована сервисом распознавания капчи. Будьте предельно внимательны и не отправляйте такой отчет если капча была корректно распознана, в противном случае сервис по распознаванию капч может наложить на вас санкции.
# ЗАХОДИМ НА СТРАНИЦУ С КАПЧЕЙ
- walk:
to: https://www.nebraska.gov/sos/corp/corpsearch.cgi
do:
# РЕШАЕМ КАПЧУ
- captcha_resolve:
provider: anticaptcha
type: proxyless_recaptchav2
apikey: xxxxxxxxxxxxxxxxxxx
- find:
path: body
do:
# ПРОВЕРЯЕМ ЕСТЬ ЛИ ТОКЕН В ПЕРЕМЕННОЙ captcha
- variable_get: captcha
- if:
match: \S
do:
# ТОКЕН НА МЕСТЕ, ОТПРАВЛЯЕМ ФОРМУ
- walk:
to:
post: https://www.nebraska.gov/sos/corp/corpsearch.cgi
data:
search: 1
keyword_type: all
search_type: num_search
corpname:
acct-num: 1000011010101
g-recaptcha-response: <%captcha%>
submit: submit
do:
- variable_clear: recap
- find:
path: body
do:
# ПРОВЕРЯЕМ ПРИНЯТА ЛИ НАША КАПЧА
- find:
path: .g-recaptcha
do:
# ЕСЛИ ЭТОТ БЛОК ЕСТЬ НА СТРАНИЦЕ, ЗНАЧИТ НАШ ТОКЕН НЕКОРРЕКТНЫЙ, КАПЧА БЫЛА РЕШЕНА НЕВЕРНО И НУЖНО СНОВА ВВОДИТЬ КАПЧУ
- parse:
attr: data-sitekey
- variable_set: recap
- variable_get: recap
- if:
match: \S
do:
# КАПЧА РЕШЕНА НЕВЕРНО, ОТПРАВЛЯЕМ ОТЧЕТ О НЕВЕРНО РЕШЕННОЙ КАПЧЕ
- captcha_report
else:
# КАПЧА РЕШЕНА ВЕРНО, СОБИРАЕМ ДАННЫЕ
Далее мы научимся работать с изображениями.