Решение reCAPTCHA в Selenium на полном автомате (адаптация англоязычной статьи)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Делаю робкие попытки в автоматизации и столкнулся с часто возникющей проблемой, распознавание Рекапчи (reCaptcha).

Естественно, я понимаю что по даннй теме написано много гайдов, мануалов и статей, но согласитесь - интересно описать собственный опыт.

Итак, за основу я взял англоязычный мануал, который попался мне на глаза буквально пару дней назад и я решил его потестить (а так как написан он сервисом по распознаванию капчи, который я и использую, то почему нет - кстати, ребята из 2капча - принимаю благодарность в виде зеленых бумажек, если интересно))))

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

Для решения возьмем демо страницу, любезно предоставленную самой Рекапчей -  https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php:

Подготовка

На первом этапе необходимо все подготовить

Для демонстрации работы я скачал следующие компоненты в специальную папку на своем компьютере (предварительно установил, конечно же Питон - но как я это сделал рассказывать не буду, надеюсь разберетесь).

Итак, нам понадобится - собственно сама библиотека для автоматизации браузера Селениум, берем тут - https://pypi.org/project/selenium/

Установка Selenium
Установка Selenium

Официальный Python SDK для интеграции с API 2Captcha, берем тут https://pypi.org/project/2captcha-python/

Установка Python SDK 2captcha
Установка Python SDK 2captcha

SeleniumИ библиотека, которая упрощает загрузку и использование драйверов для Selenium, называется webdriver-manager, берем тут - https://pypi.org/project/webdriver-manager/

Установка webdriver-manager
Установка webdriver-manager


Устанавливается все очень просто, копируете указанную команду и вставляете в консоли, как показано на видео выше

Можно устанавливать все по отдельности, как это сделал я а можете использовать универсальную команду

python -m pip install 2captcha-python selenium webdriver-manager

Поиск Sitekey

Так как речь идет про Рекапчу, то необходимо понимать, что такое параметр site key. Sitekey - это уникальный идентификатор, который Google присваивает всем своим формам с reCAPTCHA, и с помощью которого мы можем идентифицировать капчу на сайте.

Именно этот идентификатор и нужен нам, чтобы сервис распознавания капчи мог понять, с чем он имеет дело, и именно этот идентификатор мы и будем отправлять в 2капча.

Чтож, давайте искать sitekey на демо странице

  • Переходим на https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php

  • Откройте инструменты разработки - нажать Ctrl/Cmd + Shift + I либо правую кнопку мыши - посмотреть код

  • Найдите data-sitekey (нажмите ctrl + F, введите sitekey и нажмите enter) и скопируйте значение параметра.

  • Сохраните значение, чтобы использовать его при отправке запроса для решения капчи на странице

Поиск SiteKey в код
Поиск SiteKey в код

Решение капчи

Естественно, для решения капчи нужно написать код - можете написать его самостоятельно, либо просто взять из уже готового мануала. Типа как из этого. Задача данного кода - попасть на целевую страницу и решить капчу через API. Именно то, чего мы и хотим достичь.

Сразу оговорюсь, в коде есть несколько параметров, которые необходимо изменить на свои, вот они сверху вниз:

2CAPTCHA_API_KEY- ваш АПИ, берете его в личном кабинете 2капча.

SITE_KEY- его мы с вами сохраняли на предыдущем шаге

Я очень сильно расчитываю, что найти эти параметры в приведенном коде вы сможете самостоятельно

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

captcha_page_url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
driver.get(captcha_page_url)

# решение капчи

print("solving captcha")
solver = TwoCaptcha("2CAPTCHA_API_KEY")
response = solver.recaptcha(sitekey='SITE_KEY', url=captcha_page_url)
code = response['code']
print(f"Successfully solved the Captcha. The solve code is {code}")

Этот кусок кода инициализирует объект TwoCaptcha с нашим ключом API и должен решать reCAPTCHA посредством вызова метода recaptcha. Для чего передаем значение site key и URL адрес страницы.

Это не полный код, читай дальше!

Отправка решенной капчи

Следующий кусок кода я не понял как вам правильно объяснить, так как сам не понял что происхоит, поэтому просто перевел его и оставляю тут:

Далее находим элемент g-recaptcha-response, вставляем полученное значение для решения капчи и отправляем форму.

recaptcha_response_element = driver.find_element(By.ID, 'g-recaptcha-response')
driver.execute_script(f'arguments[0].value = "{code}";', recaptcha_response_element)

submit_btn = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
submit_btn.click()

input("Press enter to continue")
driver.close()

Полный код для автоматического решения reCaptcha

Собственно вот что мы получаем в результате.

from selenium.webdriver.common.by import By
from twocaptcha import TwoCaptcha
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver

# Instantiate the WebDriver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

# Load the target page
captcha_page_url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
driver.get(captcha_page_url)

# Solve the Captcha
print("Solving Captcha")
solver = TwoCaptcha("2CAPTCHA_API_KEY")
response = solver.recaptcha(sitekey='SITE_KEY', url=captcha_page_url)
code = response['code']
print(f"Successfully solved the Captcha. The solve code is {code}")

# Set the solved Captcha
recaptcha_response_element = driver.find_element(By.ID, 'g-recaptcha-response')
driver.execute_script(f'arguments[0].value = "{code}";', recaptcha_response_element)

# Submit the form
submit_btn = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
submit_btn.click()

# Pause the execution so you can see the screen after submission before closing the driver
input("Press enter to continue")
driver.close()

Для того, чтобы продемонстрировать работоспособность кода, создам текстовый файл, назову его script.py и запущу в консоли. Результат вы можете увидеть ниже

Для чистоты эксперимента решим этим же способом рекапчу с демо страницы, расположенной на сайте 2капча.

Нам понадобится поменять урл в коде и sitekey, смотрим что получилось:

Таким образом мы видим, что код рабочий. Пользуйтесь, но сперва не забудьте поблагодарить лайком автора.

Источник: https://habr.com/ru/articles/773088/


Интересные статьи

Интересные статьи

Для качественного технического обслуживания и ремонта необходимо заранее знать о возможных неисправностях, а также об остаточном ресурсе трансформаторного оборудования. Необходимо разработать модель, ...
Привет, Хабр! Меня зовут Рудаков Александр, я занимаюсь информационной безопасностью в компании "ЛАНИТ-Интеграция". Однажды, в рамках работы над проектом, мне понадобилось орган...
В одной из прошлых своих статей я делал обзор микроконтроллеров, а сегодня речь пойдёт о модуле, который поможет им спасти мир. Ну, во всяком случае, от экологических катастроф. Х...
Когда задумывается большой продукт или маленький софт начинает вырастать в левиафана, какой путь развития выбрать? Стоит ли все переписывать с нуля или продолжать «исторически сложившиеся» трад...
Когда 1974 году в Ленинграде был создан научно-исследовательский вычислительный центр (ныне — СПИИРАН: Санкт-Петербургский институт информатики и автоматизации Российской академии наук), в гр...