Михаил Сисин Со-основатель облачного сервиса по сбору информации и парсингу сайтов Diggernaut. Работает в области сбора и анализа данных, а также разработки систем искусственного интеллекта и машинного обучения  более десяти лет.

Решаем Google ReCaptcha v3: сервис RuCaptcha интегрирован в платформу Diggernaut

Решаем Google ReCaptcha v3: сервис RuCaptcha интегрирован в платформу Diggernaut

В рядах поддерживаемых нами сервисов для решения капчи пополнение. Встречайте сервис RuCaptcha.

Функционал сервиса схож с AntiCaptcha, позволяет решать все основные типы капч, а также поддерживает режим «proxyless», что весьма востребованно нашими пользователями. Цены на услуги у RuCaptcha ниже чем у сравнимого с ним сервиса AntiCaptcha. Но от всех остальных провайдеров, сервис RuCaptcha отличает то, что они предлагают решение для Google ReCaptcha v3. Мы его протестировали и оно действительно работает.

Более детальная информация об использовании сервиса по решению капч в вашем парсере доступна в нашей документации.

А ниже мы расскажем как использовать RuCaptcha для решения Google ReCaptcha v3 на примере сайта ГИБДД. А запрашивать мы будем информацию о регистрациях в ГИБДД по VIN номеру.

Для начала, зайдем на сайт ГИБДД и удостоверимся, что на странице с формой для поиска используется ReCaptcha v3. На первый взгляд, в исходном коде страницы не наблюдается линк на api.js от Google, поэтому автоматическое извлечение ключа сайта и параметра action работать не будет и нам надо найти их вручную. Если мы посмотрим во вкладку Сеть в консоли разработчика вашего браузера (Chrome/Firefox), то мы увидим что api.js все же подгружается, а значит подгрузка осуществляется не напрямую, а используя какой-то javascript. Поэтому нашей задачей будет отсмотреть все подгруженные JS файлы во вкладке Сеть.

Ищем параметры для recaptcha v3

Просматривая код JS файлов, мы увидим что в коде JS файла app.js есть интересный блок в конце:

/* reCaptcha */
var reCaptchaSiteKey = '6Lc66nwUAAAAANZvAnT-OK4f4D_xkdzw5MLtAYFL';
var onloadReCaptcha = function() {
    grecaptcha.execute(reCaptchaSiteKey, {action: 'check_auto'})
    .then(function(token) {
        appVehicleCheck.reCaptchaToken = token;
    });
}

Отсюда мы забираем ключ сайта (6Lc66nwUAAAAANZvAnT-OK4f4D_xkdzw5MLtAYFL) и параметр action (check_auto).

Далее нам надо определить какой запрос делает страница, когда мы нажимаем кнопку поиска. Для этого открываем панель разработчика в браузера, переходим во вкладку Сеть и ставим фильтр, чтобы нам показывались только XHR запросы.

Делаем запрос в ГИБДД

Мы увидим, что загружается следующий ресурс: https://xn--b1afk4ade.xn--90adear.xn--p1ai/proxy/check/auto/history методом POST и туда передается VIN, тип проверки и токен Google ReCaptcha v3.

Получаем ответ из ГИБДД

** Внимание!!! На текущий момент решение от RuCaptcha со score=0.3 не работает с сайтом ГИБДД. Пока мы ждем ответа от провайдера, можно использовать другой сервис Anti-captcha. Он позволяет использовать score = 0.7, который работает (но не в 100% случаев) с сайтом ГИБДД. Для этого в команде captcha_resolve в опции provider нужно указать anticaptcha (вам потребуется свой аккаунт в этом сервисе), также в опции apikey нужно будет указать ваш ключ в сервисе Anti-captcha и в minscore ставим 0.7. Как только мы получим комментарии и рабочее решение от RuCaptcha — мы обновим статью, следите за изменениями**

Таким образом, у нас есть все, чтобы написать парсер. ВНИМАНИЕ — парсер требует наличие русского прокси, доступ до данных для иностранных IP заблокирован:

---
config:
    debug: 2
    agent: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
        proxy: ПОМЕСТИТЕ ВАШ ПРОКСИ СЮДА В ФОРМАТЕ 1.1.1.1:9999 (ИЛИ USER:PASS@1.1.1.1:9999 ПРИ ОРГАНИЗАЦИИ ДОСТУПА К ПРОКСИ ПО ПАРОЛЮ)
do:
# ПРЕДУСТАНАВЛИВАЕМ ПРОВЕРЯЕМЫЙ VIN В ПЕРЕМЕННУЮ
- variable_set:
    field: vin
    value: WVGZZZ7LZ8D050320
# ЗАГРУЖАЕМ СТРАНИЦУ С ФОРМОЙ ПОИСКА
- walk:
    to: https://xn--90adear.xn--p1ai/check/auto/
    do:
    # РЕШАЕМ КАПЧУ
    - captcha_resolve:
        provider: rucaptcha
        type: recaptchav3
        apikey: ЗДЕСЬ ДОЛЖЕН БЫТЬ ВАШ RUCAPTCHA АПИ КЛЮЧ 
        sitekey: 6Lc66nwUAAAAANZvAnT-OK4f4D_xkdzw5MLtAYFL
        minscore: 0.3
        action: check_auto_history
    # ЗАХОДИМ В БЛОК BODY НА СТРАНИЦЕ, ТАК КАК НАМ НУЖНО ПЕРЕЙТИ В БЛОКОВЫЙ КОНТЕКСТ
    - find:
        path: body
        do:
        # ЧИТАЕМ СОДЕРЖИМОЕ ПЕРЕМЕННОЙ captcha В РЕГИСТР (ИМЕЕНО В НЕЙ ДОЛЖЕН БУДЕТ НАХОДИТЬСЯ ТОКЕН)
        - variable_get: captcha
        # ПРОВЕРЯЕМ ЕСТЬ ЛИ У НАС ТОКЕН
        - if:
            match: \S
            do:
            # ДЕЛАЕМ POST ЗАПРОС ДЛЯ ЗАБОРА ГЕРИСТРАЦИОННЫХ ДАННЫХ
            - walk:
                to:
                    post: https://xn--b1afk4ade.xn--90adear.xn--p1ai/proxy/check/auto/history
                    data:
                        vin: <%vin%>
                        captchaWord: ''
                        checkType: history
                        reCaptchaToken: <%captcha%>
                do:
                # ПАРСИМ ДАННЫЕ И СКЛАДЫВАЕМ В ОБЪЕКТ
                - find:
                    path: requestresult
                    do:
                    - object_new: vehicle
                    - find:
                        path: vehicle>enginevolume
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: engine_volume
                    - find:
                        path: vehicle>color
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: color
                    - find:
                        path: vehicle>bodynymber
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: body_number
                    - find:
                        path: vehicle>year
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: year
                    - find:
                        path: vehicle>enginenumber
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: engine_number
                    - find:
                        path: vehicle>vin
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: vin
                    - find:
                        path: vehicle>model
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: model
                    - find:
                        path: vehicle>category
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: category
                    - find:
                        path: vehicle>type
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: type
                    - find:
                        path: vehicle>powerhp
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: power_hp
                    - find:
                        path: vehicle>powerkwt
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: power_kwt
                    - find:
                        path: vehiclepassport>number
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: passport_number
                    - find:
                        path: vehiclepassport>issue
                        do:
                        - parse
                        - object_field_set:
                            object: vehicle
                            field: passport_issued
                    - find:
                        path: ownershipperiod
                        do:
                        - object_new: ownership
                        - find:
                            path: from
                            do:
                            - parse
                            - object_field_set:
                                object: ownership
                                field: from
                        - find:
                            path: to
                            do:
                            - parse
                            - object_field_set:
                                object: ownership
                                field: to
                        - find:
                            path: simplepersontype
                            do:
                            - parse
                            - object_field_set:
                                object: ownership
                                field: owner_type
                        - find:
                            path: lastoperation
                            do:
                            - parse
                            - object_field_set:
                                object: ownership
                                field: operation_type
                        - object_save:
                            name: ownership
                            to: vehicle
                    - object_save:
                        name: vehicle

Если мы запустим его на платформе Diggernaut (естественно, вы должны будете использовать ваш API ключ в сервисе RuCaptcha в коде парсера), то мы получим следующий датасет (приводим пример выгрузки датасета в формате JSON):

[{
    "vehicle": {
        "category": "В",
        "color": "ЧЕРНЫЙ",
        "engine_number": "080571",
        "engine_volume": "2967.0",
        "model": "ФОЛЬКСВАГЕН ТОUАRЕG",
        "ownership": [
            {
                "from": "2008-05-22T00:00:00.000+04:00",
                "operation_type": "11",
                "owner_type": "Natural",
                "to": "2011-12-10T00:00:00.000+04:00"
            },
            {
                "from": "2011-12-10T00:00:00.000+04:00",
                "operation_type": "06",
                "owner_type": "Natural",
                "to": "2017-02-02T00:00:00.000+03:00"
            },
            {
                "from": "2017-02-02T00:00:00.000+03:00",
                "operation_type": "03",
                "owner_type": "Natural"
            }
        ],
        "passport_issued": "ТАМОЖНЯ: 10009191",
        "passport_number": "78ТУ623619",
        "power_hp": "224",
        "power_kwt": "164.8",
        "type": "21",
        "vin": "WVGZZZ7LZ8D050320",
        "year": "2008"
    }
}
]
Михаил Сисин Со-основатель облачного сервиса по сбору информации и парсингу сайтов Diggernaut. Работает в области сбора и анализа данных, а также разработки систем искусственного интеллекта и машинного обучения  более десяти лет.

23 Replies to “Решаем Google ReCaptcha v3: сервис RuCaptcha интегрирован в…”

  1. Добрый день. ГИБДД внесли изменения на свой сайт, данный способ теперь не работает. Что можно с этим сделать? В инкогнито в браузере не срабатывает поиск

      1. Мы отправили запрос в RuCaptcha, пока ответа нет. Сегодня попробуем решение от anti-captcha. О результатах напишем тут.

      2. Антикапча работает, но не в 100% случаев. И надо ставить minscore: 0.7. В статью поместили комментарий о том, какие изменения нужно внести в код, чтобы работать с Anti-captcha.

        1. У RuCaptcha в документации написано, что больше 0,6 они отвечают редко, а 0.9 получить почти невозможно

          1. На текущий момент статистика по RuCaptcha score=0.6 такая:
            5 попыток — все вернули Captcha is not solvable — работоспособность 0%

            Статистика по anticaptcha score=0.7:
            5 попыток — 2 удачные, 3 вернули плохой токен — работоспособность 40%

          2. Попробовал АнтиКапчу. Бесполезно, никаких 40% нет, к сожалению. Круглый 0

    1. У них похоже проблемы, их много сканят и сервер не выдерживает, у них сейчас даже при проверке руками капча через раз выдает «Проверка с помощью Google reCaptcha v3 не пройдена…», переодически вообще перестает работать

      Антикапча при скоре 0.7 тоже не каждый раз дает решение капчи.

      сервис.гибдд.рф — начали банить IP, чего раньше не делали

      1. Получили ответ от РуКапчи, работы ведутся над тем чтобы была возможность получать score 0.9. ETA пока нет.

      2. Да, подтверждаю, начали банить. Раньше все хорошо работало, а на неделе прокси улетел в бан.

  2. Да, подтверждаю, начали банить. Раньше все хорошо работало, а на неделе прокси улетел в бан.

  3. Не могу понять — токен получает, а в ответе — Проверка с помощью Google reCaptcha v3.
    С чем это связано

        1. На неделе протестируем оба сервиса, если обнаружим проблемы, перенаправим запрос в rucaptcha / anticaptcha.

  4. Добрый день. Подскажите, если использовать решения, такие как phantomJS и подобные — все так же — вопрос с капчей не обойти? Для себя решил по другому — просто интересно кто использует — есть ли результат.

    1. Возможно v3 будет работать на headless браузерах, но сами мы это не тестировали. Попробуем на неделе провести ряд тестов.

    1. Думаю лучше вопрос адресовать напрямую в RuCaptcha, в данный момент мы не владеем оперативной информацией по этому вопросу

  5. Михаил, добрый вечер!

    Мне необходимо собирать инфу с РСА ОСАГО, у них на сайте стоит капча v2., не подскажете, куда копать, чтобы обходить её?

  6. Нужен проверка с помощью google recaptcha v3 не была пройдена повторите попытку что это значит

    1. Это означает, что сайт не принял решенную капчу. Такое бывает, особенно часто с v3.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания применять.

Срок проверки reCAPTCHA истек. Перезагрузите страницу.