Делаю робкие попытки в автоматизации и столкнулся с часто возникющей проблемой, распознавание Рекапчи (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, смотрим что получилось:
Таким образом мы видим, что код рабочий. Пользуйтесь, но сперва не забудьте поблагодарить лайком автора.
Комментарии (15)
Tempest23
10.11.2023 11:56Проблема, на мой взгляд, не до конца описана. Зачем, собственно, решать капчу в автотесте? Бывает надо проверить реальную интеграцию, но как будто бы не очень часто это происходит и не много усилий требует. В остальных тестах DUT конфигурируется так, чтобы она не мешала.
Что касается решения, то судя по коду, капчу решает сторонний сервис. Это рабочее решение, но не шибко интересное.
kentavr009 Автор
10.11.2023 11:56Ну как сказать - я же поставил уровень сложности простой, а значит для новичков данное решение вполне себе вариант. И кстати, продукты ведь тоже можно самостоятельно купить в магазине, но кто-то заказывает доставку.
yugo_fx
10.11.2023 11:56+1Как правило, рекапча-солверы используют скраперы данных.
Иногда для скрейпа данных совсем не обязательно использовать веб. Некоторые серверы например используют токен решения капчи для апи запросов. Поэтому зная sitekey можно заранее решить капчу через какой-либо провайдер типа 2Captcha, capsolver или capmonster и отправить «защищенный капчей» запрос без селениумов.
yugo_fx
10.11.2023 11:56Другой вопрос, что это статья ради статьи) Ни практического смысла, ни инсайтов, ни идей.
Автор, в чем мысль?
S0mbre
10.11.2023 11:56Блин... просто скрипт для решения капчи через платный сервис. И все?.. А я думал, ИИ, вся мощь нейросетей, хитрая математика...
kentavr009 Автор
10.11.2023 11:56+1Ну блин, не настолько я еще прокачан)) Но кому то и это будет полезно, согласитесь?
olegtsss
Не хватает теории и практики применения: что за reCAPTCHA, где и кем она применяется. Зачем ее нужно решать - из академического интереса или для практических задач (тогда каких)?
Kolonist
Серьезно, на Хабре это надо описывать?
olegtsss
Согласен, можно почитать на wiki. Но можно и написать, короткая вводная часть не будет лишней. Но вот практика - наше все. На хабре полно тех специалистов, но у каждого свой фундамент, ландшафт, технологический стек и т.д.
Re3DaY
Тот, кто не знает, что такое рекапча, вряд ли зайдет на эту статью
olegtsss
Не согласен. Зайдет, например, чтобы узнать новое. При условии, что он, конечно, человек и заинтересовался не знакомым термином.
kentavr009 Автор
Есть серьезные сомнения, что зайдет. Вот вам бы было интересно почитать про синхрофазотрон и как его применять на гидроэлектростанции? Термины знакомые, но желания узнать про это побольше нет асбсолютно.
olegtsss
Мне да, хотя я не знаю, что такое синхрофазотрон, но знаком с гидроэлектростанцией. Из-за этого «первого» - плюс нелепость сочетания указанных обозначений. Статью посмотрели 2300 человек, что дает не нулевую вероятность в защиту моей стороны.