Решить reCAPTCHA 2 в Selenium (на Python)

Как решить любую капчу при помощи Selenium с использованием плагина AntiCaptcha. Установка Selenium, настройка, примеры API запросов к плагину. Код представлен на Питоне.

На этой странице представлена краткая информация о том, как при помощи Selenium и плагина AntiCaptcha решить любую капчу (в том числе reCAPTCHA v2, reCAPTCHA v3, Funcaptcha, Geetest и hCaptcha) в автоматическом режиме.
Мы пошагово установим Selenium на устройство и научимся подключать к нему наш плагин. Так же мы в автоматическом режиме решим Рекапчу на тестовом окружении.
Для тех, кто не знает, Selenium — инструмент автоматического запуска браузера и серфигнга в нем.

Тем же, кто уже знаком с Selenium предлагаем сразу посмотреть код примера по решению капчи.

Внимание! Для работы плагина необходим Anti-Captcha.com ключ учетной записи (Anti Captcha Api Key). Т.е. этот способ решения Рекапчи является платным. Но совсем не дорогим и очень удобным!

Больше информации о нашем расширении с примерами решения капч смотрите на главной странице AntiCaptcha плагина.

Тестовый код представлен на языке Python, так как он является самым популярным при использовании с Selenium.
Требуемый уровень компьютерной грамотности — средний.
В данной статье будут примеры исходного кода на языке Python, для понимания необходимо знание любого языка программирования и минимальный опыт работы с консолью.

Установка Python

Мы будем использовать Питон версии 3.
В интернете много информации по установке Питона, как текстовой, так и видео. Повторяться не будем, далее идут ссылки на самые удачные, на мой взгляд, инструкции по установке Питона:
Видео инструкция по установке Питона
Текстовая инструкция по установке Питона

В общем случае необходимо установить интерпретатор Питона (python) и прописать его в PATH, чтобы иметь возможность запускать его из консоли командой "python".

Установка Python - пояснения для Windows

На Windows 10 и более современных версиях есть возможность установить Python из Microsoft Store нажатием одной кнопки.

Если устанавливаете вручную, то рекомендуется поставить галочку "Add python.exe to Path" при установке. Тогда не придется каждый раз прописывать полный путь до python.exe и pip3.exe для их запуска. PIP - это Python Package Installer, т.е. менеджер пакетов для библиотек Python, который понадобится нам для установки Selenium.

Установка Python - пояснения для Linux

После установки на Linux системах у вас появится выполняемый файл python3, для Windows это будет просто python.exe (без тройки на конце).

У вас может автоматически не установиться менеджер пакетов PIP, если это так, то просто установите его из менеджера пакетов вашего дистрибутива. Пример для Ubuntu: sudo apt install python3-pip

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

Тут все немного сложнее. Помимо установки самого Selenium требуется инсталляция Веб Драйвера для браузера.
Это промежуточная прослойка между Selenium и браузером. Для каждого браузера ставится свой Веб Драйвер, но мы приводим пример для Хрома.
В интернетах много руководств по установке, они во многом схожи, но часто слишком избыточны и запутаны.
Поэтому привожу свою упрощенную версию, в надежде, что она будет полезна начинающим хацкерам.

Установка Selenium под Python

После установки Питона у Вас появится специальный питоновский пакетный менеджер (онлайн установщик библиотек из всей коллекции Питона) pip3.
Он и позволяет быстро поставить последнюю версию Селениума простой командой из консоли (Terminal или Cmd.exe). pip3 install selenium
Для Windows она будет выглядеть так: pip3.exe install selenium

В принципе это все.
Установку можно проверить запустив python3 или python.exe из командной консоли. И введя в терминале from selenium import webdriver
Если после выполнения этой команды не появилось никакой ошибки, значит Селениум установился правильно. Можно выходить из интерпретатора Питона, CTRL+D для Линукс и CTRL+Z —> Enter для Windows.

На Windows может возникнуть ошибка вида "pip3.exe не найден". Значит Питон при установке не прописался в переменную PATH.
Вернитесь к шагу установки Python и отметьте галочку "Add python.exe to Path". Гуглите, если не поможет.

Установка Web Driver

Еще раз, Web Driver — это дополнительная прослойка для общения с браузером.
Наглядно:

  • Python использует Selenium как библиотеку, вызывает ее объекты и методы.
  • Selenium подключается к Веб Драйверу какого-то конкретного указанного браузера (Хром, Фаерфокс, и т.д.)
  • Веб Драйвер открывает обычный браузер Chrome или Firefox, которыми мы пользуемся в повседневной жизни, и транслирует команды от Селениума в него. Соответственно сам браузер должен быть установлен Вами заранее (скорее всего это уже сделано, т.к. Вы читаете эту страницу через браузер).

Веб Драйвер фактически представляет из себя файл, например chromedriver для Хрома, или geckodriver для Фаерфокса. Который будет скормлен библиотеке Селениума при инициализации.
Так что по факту его установка сводится к скачиванию файла и складыванию его в нужное место.
Не забудьте выбрать версию Веб Драйвера аналогичную версии баузера, для которого Вы его устанавливаете (просто откройте свой браузер Chrome или Firefox - в завиимости от того каким браузером будете пользоваться - и проверьте там версию).
Например для Хрома версии 68 требуется драйвер именно 68-й версии.

Приведем ссылки с более подробной информацией по его установке:

Установка драйвера chromedriver для Chrome Selenium

  • Узнайте Вашу версию chrome, скопировав в адресную строку: chrome://settings/help
  • Запомните Вашу версию Chrome, в данном примере у нас 118-ая версия:

  • По следующей ссылке открывайте страницу загрузок веб-драйвера Chrome и скачивайте веб-драйвер для Вашей версии Chrome и для Вашей операционной системы: Chrome for Testing availability

  • Распакуйте архив и положите файл chromedriver в папку с Вашим скриптом.

Остальные ссылки

Установка драйвера geckodriver для Firefox Selenium
SELENIUM ДЛЯ PYTHON
Install Web Drivers

Корректность установки проверяется в интерпретаторе Питона. Запустите python3 или python.exe из консоли и наберите в нем:
Для Windows: from selenium import webdriver from selenium.webdriver.chrome.service import Service browser = webdriver.Chrome(service=Service('C:\\mesto\\kuda\\skachali\\chromedriver.exe'))
Для Linux from selenium import webdriver from selenium.webdriver.chrome.service import Service browser = webdriver.Chrome(service=Service('/home/mesto/gde/lezit/chromedriver'))
Если не появляется никакого сообщения об ошибке и открывается окно браузера — значит установка прошла успешно.

Во многих туториалах рекомендуется прописать путь до скачанного Web Driver в переменную PATH. Или просто положить скачанный драйвер в один из путей PATH.
Тоже рекомендуем это сделать, это позволит не прописывать каждый раз путь до файла драйвера как в командах выше.
Ищите способы как это сделать для разных операционных систем в Интернете.

Решаем первую капчу в Selenium

Предварительно можете ознакомиться с примерами запуска браузера под Selenium по ссылкам ниже.
Мы же сосредоточимся на конкретном примере. Больше информации Вы сможете почерпнуть по тем же ссылкам или в Гугле.
Современная Веб-Автоматизация при Помощи Python и Selenium: Пробный запуск браузера
Python Selenium Getting Started

Предварительная установка и настройка плагина

Остановимся на одном моменте. Для работы плагина необходим Anti-Captcha.com ключ учетной записи (Anti Captcha Api Key).
Обычно он вручную выставляется в опциях плагина каждым нашим пользователем. При работе через Selenium такой возможности нет.

Для установки плагина и прописывания туда ключа существует два альтернативных способа. Мы рассмотрим оба варианта.

Скачивание плагина вручную и передача туда ключа с помощью API-сообщения

В первую очередь нам необходимо зайти на страницу скачки плагина для решения капчи, выбрать браузер, на котором мы будем решать капчу (Хром, Фаерфокс) и скачать соответствующие файлы с кодом плагина.
Для Chrome это будут CRX или ZIP. Для Firefox — XPI формат, может подойти и ZIP, но лучше все-таки XPI.
Скачанный файл требуется положить в какую-нибудь директорию проекта, далее в нашем скрипте мы будем прописывать до него полный путь.

Для установки ключа используется отправка API сообщений в плагин, а именно метод setOptions.
Метод acp_api_send_request в коде ниже как раз отправляет подобное сообщение.

Представленный ниже код снабжен комментариями на русском языке. Обратите внимание на вызов функции get_browser_with_plugin_ready: поменяйте там пути до файлов плагина и chromedriver'а, а также пропишите свой ключ учётной записи Anti-Captcha.

# Импортируем необходимые модули from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait import time import json # Метод отправки API запроса прямо в плагин # Например для инициализации API ключа сервиса anti-captcha.com, необходимый для работы плагина # Работает только на действующей HTML страничке, # в нашем случае на https://antcpt.com/blank.html # на страницах вроде about:blank запрос не пройдет def acp_api_send_request(driver, message_type, data={}): message = { # всегда указывается именно этот получатель API сообщения 'receiver': 'antiCaptchaPlugin', # тип запроса, например setOptions 'type': message_type, # мерджим с дополнительными данными **data } # выполняем JS код на странице # а именно отправляем сообщение стандартным методом window.postMessage return driver.execute_script(""" return window.postMessage({}); """.format(json.dumps(message))) def set_anti_captcha_api_key(browser, api_key: str): # Переходим на пустую страницу для выполнения API запроса к плагину browser.get('https://antcpt.com/blank.html') # Устанавливаем API ключ anti-captcha.com # замените YOUR-ANTI-CAPTCHA-API-KEY на Ваш шестнадцатиричный ключ, который можно взять тут: # https://anti-captcha.com/clients/settings/apisetup acp_api_send_request( browser, 'setOptions', {'options': {'antiCaptchaApiKey': api_key}} ) # Три секунды паузы чтобы плагин проверил ключ на стороне anti-captcha.com time.sleep(3) def get_browser_with_plugin_ready(plugin_path: str, driver_path: str, api_key: str): # Инциируем объект опций для Хрома, чтобы иметь возможность подключить расширение options = webdriver.ChromeOptions() # Ссылка на CRX или ZIP файл плагина, который мы скачали ранее options.add_extension(plugin_path) # Создаём Браузер (Веб Драйвер Хрома) с указанием места куда скачался файл драйвера browser = webdriver.Chrome( service=Service(driver_path), options=options ) set_anti_captcha_api_key( browser=browser, api_key=api_key ) return browser browser = get_browser_with_plugin_ready( plugin_path='./plugin.zip', driver_path='./chromedriver', # внимание: на Windows должно заканчиваться на ".exe"! api_key='ЗАМЕНИТЕ_НА_ВАШ_КЛЮЧ_ANTI-CAPTCHA_API' )

Полные файлы примеров смотрите на нашем GitHub!

Автоматическое скачивание плагина и прописывание ключа в конфиг-файле плагина

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

Представленный ниже код снабжен комментариями на русском языке. Обратите внимание на вызов функции get_browser_with_plugin_ready: поменяйте там путь до chromedriver'а, а также пропишите свой ключ учётной записи Anti-Captcha.

# Импортируем необходимые модули from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait import os import pathlib import urllib.request import zipfile def prepare_plugin(anti_captcha_api_key: str): current_script_dir = str(pathlib.Path(__file__).parent.resolve()) modified_plugin_path = current_script_dir + '/plugin_hardcoded_api_key.zip' plugin_extract_path = current_script_dir + '/extracted_plugin' # скачиваем плагин url = 'https://antcpt.com/anticaptcha-plugin.zip' filehandle, _ = urllib.request.urlretrieve(url) # распаковываем его with zipfile.ZipFile(filehandle, "r") as f: f.extractall(path=plugin_extract_path) # установить ключ API в файле конфигурации file = pathlib.Path(plugin_extract_path + '/js/config_ac_api_key.js') file.write_text(file.read_text().replace( "antiCapthaPredefinedApiKey = ''", "antiCapthaPredefinedApiKey = '{}'".format(anti_captcha_api_key) )) # запакуйте директорию плагина обратно zip_file = zipfile.ZipFile(modified_plugin_path, 'w', zipfile.ZIP_DEFLATED) for root, dirs, files in os.walk(plugin_extract_path): for file in files: path = os.path.join(root, file) zip_file.write( path, arcname=path.replace(plugin_extract_path, '')) zip_file.close() return modified_plugin_path def get_browser_with_plugin_ready(driver_path: str, api_key: str): # Инциируем объект опций для Хрома, чтобы иметь возможность подключить расширение options = webdriver.ChromeOptions() # Для того что бы Selenium вернул контроль в наш код сразу после начала загрузки # страницы, иначе если на странице долго грузятся какие-то ресурсы, то контроль # не будет возвращён десятки секунд до полной загрузки страницы options.page_load_strategy = 'none' # плагин скачается автоматически и в него будет зашит Ваш ключ Анти-Капчи plugin_path = prepare_plugin(api_key) options.add_extension(plugin_path) # Создаём Браузер (Веб Драйвер Хрома) с указанием места куда скачался файл драйвера return webdriver.Chrome( service=Service(driver_path), options=options ) browser = get_browser_with_plugin_ready( driver_path='./chromedriver', # внимание: на Windows должно заканчиваться на ".exe"! api_key='ЗАМЕНИТЕ_НА_ВАШ_КЛЮЧ_ANTI-CAPTCHA_API' )

Полные файлы примеров смотрите на нашем GitHub!

Открытие страницы с формой авторизации и капчей: решаем капчу и отправляем форму

На данном этапе у Вас уже есть объект browser, полученный одним из способов выше, с включенным туда плагином и прописанным ключём Anti-Captcha API. Теперь открываем тестовую форму авторизации, заполняем её и отправляем форму.

browser.get('https://anti-captcha.com/demo/?page=recaptcha_v2_textarea') # ждём пока форма прогрузится и появится поле для ввода логина WebDriverWait(browser, 5).until(EC.visibility_of_element_located(( By.CSS_SELECTOR, 'input[name=login]' ))) # заполняем форму login_input = browser.find_element(By.CSS_SELECTOR, 'input[name=login]') login_input.send_keys('Test login') password_input = browser.find_element(By.CSS_SELECTOR, 'input[name=pass]') password_input.send_keys('Test password') # ждём пока рекапча автоматически решится плагином и на странице появится элемент .antigate_solver.solved WebDriverWait(browser, 120).until(EC.visibility_of_element_located(( By.CSS_SELECTOR, '.antigate_solver.solved' ))) # отправляем форму browser.find_element(By.CSS_SELECTOR, 'button').click() # чтобы браузер не закрылся сразу и Вы успели посмотреть результат input()

Полные файлы примеров смотрите на нашем GitHub!

Создайте файл с расширением .py, например test.py и скопируйте туда код из подраздела Автоматическое скачивание плагина и прописывание ключа в конфиг-файле плагина или из подраздела Скачивание плагина вручную и передача туда ключа с помощью API-сообщения, дополните его кодом из блока выше и запустите с помощью python3 (или python3.exe на Windows), Вы должны наглядно увидеть процесс заполнения формы и решения рекапчи:

python3 ./test.py

Использование ProxyOn тасков

Если вы хотите пометить все свои задания на решение капчи как ProxyOn, как это описано в документации RecaptchaV2Task на anti-captcha.com . То вам необходимо добавить несколько новых строчек в блок установки опций setOptions. Необходимо установить натройки прокси тасков solveProxyOnTasks, userProxyProtocol, userProxyServer, userProxyPort и так далее... Больше информации по ним в секции setOptions API нашего плагина.
Теперь наш метод acp_api_send_request будет выглядеть следующим образом:

acp_api_send_request( browser, 'setOptions', { 'options': { 'antiCaptchaApiKey' : 'YOUR-ANTI-CAPTCHA-API-KEY', 'solveProxyOnTasks' : True, # Включить/выключить решение ProxyOn тасков 'userProxyProtocol' : 'http', # Тип прокси (http, https, socks4, socks5) 'userProxyServer' : '111.111.111.111', # Адрес сервера прокси, только маска *.*.*.* разрешена 'userProxyPort' : 1111, # Порт прокси 'userProxyLogin' : 'user', # Прокси логин 'userProxyPassword' : 'password' # Прокси пароль } } )

Полные файлы примеров смотрите на нашем GitHub!

После выполнения этого запроса все следующие таски будут типа ProxyOn. Пожалуйста выставляйте только валидные настройки прокси, иначе вы получите ошибку прокси.

Запуск Selenium в headless-режиме (только для Linux)

Selenium Chrome можно запустить в headless-режиме из коробки, но к сожалению плагины в таком режиме не работают, так как Chrome не поддерживает автоматизацию с плагинами. Используйте утилиту Xvfb, которая предоставляет виртуальный дисплей для вашего приложения.

# устанавливаем пакет apt install -y xvfb # устанавливаем переменную дисплея export DISPLAY=:2 # запускаем сервер Xvfb в фоновом режиме (один раз) /usr/bin/Xvfb :2 -screen 2 1024x768x24 & # подождите немного чтобы дать ему запуститься (один раз) sleep 5 # добавьте префикс "xvfb-run" к python-скрипту xvfb-run python3 test.py

Способ явного прописывания ключа сервиса Антикапчи

По запросам наших пользователей мы реализовали альтернативный способ указания API ключа — через прописывание его в конфигурационном файле.
Для этого необходимо скачать код плагина в ZIP формате и распаковать этот архив. Внутри, в директории js вы найдете файл config_ac_api_key.js.
Откройте его в любом редакторе и в значение переменной antiCapthaPredefinedApiKey впишите ваш anti-captcha.com API ключ.
Например:
var antiCapthaPredefinedApiKey = '12345678901234567890123456789012';

Обратите внимание, что помимо ключа в этом файле присутствует еще переменная defaultConfig, в которой перечислены значения всех опций плагина по умолчанию. Не стесняйтесь менять их по своему усмотрению, описание значения каждой конкретной опции можете подглядеть в статье по работе с API нашего плагина, в методе setOptions.
Разве что в статье имена опций представлены в camelCase, а в файле настроек через_подчеркивания (useRecaptchaPrecaching ~ use_recaptcha_precaching).

Последнее, что надо сделать — запаковать обратно весь код плагина в ZIP архив и указать путь именно до него в методе add_extension (смотрите выше наш файл captcha_solve.py).

Важно, в архив нужно помещать именно файлы расширения, а не директорию, в которых они лежат. Это обезопасит вас от ошибки "cannot process extension #1 from unknown error: cannot read manifest".

Ну и, конечно, строки browser.get('https://antcpt.com/blank.html'), acp_api_send_request(...) и time.sleep(3) нам в этом случае не нужны.

Надеюсь данное руководство было вам полезно. Если возникли какие-то проблемы, то не стесняйтесь обращаться в нашу службу поддержки, мы вам ответим!