Делаю робкие попытки в автоматизации и столкнулся с часто возникющей проблемой, распознавание Рекапчи (reCaptcha).
Естественно, я понимаю что по даннй теме написано много гайдов, мануалов и статей, но согласитесь - интересно описать собственный опыт.
Итак, за основу я взял англоязычный мануал, который попался мне на глаза буквально пару дней назад и я решил его потестить (а так как написан он сервисом по распознаванию капчи, который я и использую, то почему нет - кстати, ребята из 2капча - принимаю благодарность в виде зеленых бумажек, если интересно))))
Итак, не будем долго и нудно расписывать, зачем и почему нужен Селениум, как это важно для автоматизации и кога он возник и кто его придумал, переходим к самой сути:
Для решения возьмем демо страницу, любезно предоставленную самой Рекапчей - https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php:
Подготовка
На первом этапе необходимо все подготовить
Для демонстрации работы я скачал следующие компоненты в специальную папку на своем компьютере (предварительно установил, конечно же Питон - но как я это сделал рассказывать не буду, надеюсь разберетесь).
Итак, нам понадобится - собственно сама библиотека для автоматизации браузера Селениум, берем тут - https://pypi.org/project/selenium/
Официальный Python SDK для интеграции с API 2Captcha, берем тут https://pypi.org/project/2captcha-python/
SeleniumИ библиотека, которая упрощает загрузку и использование драйверов для Selenium, называется webdriver-manager, берем тут - https://pypi.org/project/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) и скопируйте значение параметра.Сохраните значение, чтобы использовать его при отправке запроса для решения капчи на странице
Решение капчи
Естественно, для решения капчи нужно написать код - можете написать его самостоятельно, либо просто взять из уже готового мануала. Типа как из этого. Задача данного кода - попасть на целевую страницу и решить капчу через 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, смотрим что получилось:
Таким образом мы видим, что код рабочий. Пользуйтесь, но сперва не забудьте поблагодарить лайком автора.