Капча

Обходим капчу

В процессе парсинга сайтов вы наверняка сталкивались с ограничениями, накладываемыми вебмастерами на автоматизированные методы использования ресурсов сайта. Одним из таких методов является использование капчи. Капча - это автоматизированный тест Тьюринга для различия роботов и людей. Как правило, пользователю показывается изображение с символами и система просит ввести эти символы в поле, или же показывается серия изображений и требуется выбрать только изображения с определенным признаком. Например, только те, на которых изображены автомобили, или дорожные знаки.

Существует множество сервисов и программных продуктов, позволяющих вебмастеру внедрить капчу на сайт. Наиболее распространены сервисы 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:
                        # КАПЧА РЕШЕНА ВЕРНО, СОБИРАЕМ ДАННЫЕ
                        
                    

Далее мы научимся работать с изображениями.