Используйте сервис решения CAPTCHA с Selenium

Автор: solvethree3 мин на чтение

Используйте solvethree для получения токена reCAPTCHA Enterprise, затем с помощью Selenium поместите solution.token в форму вашего приложения и отправьте её. SDK решает задачу; он не заполняет за вас форму в браузере.

В примере используется HTTPS-форма с полем токена и кнопкой отправки. Адаптируйте эти селекторы к тестируемому приложению.

На этой странице

Подготовьте форму и окружение Python

  1. 1.

    Установите зависимости

    Используйте Python 3.10 или новее с Chrome. Установите пакет selenium через pip, затем установите официальный Python SDK solvethree из скачиваемого wheel-файла. Следуйте инструкциям по установке по прямой ссылке в руководстве по интеграции с Python; не заменяйте их установкой из предполагаемого реестра пакетов.

  2. 2.

    Настройте целевой профиль

    Настройте имя хоста формы под вашим управлением в консоли solvethree и убедитесь, что его профиль активен для вашего рабочего пространства. Передача имени хоста в задаче не создаёт этот профиль. Пример запрашивает действие login; измените его, если ваше приложение использует другое действие.

  3. 3.

    Задайте переменные окружения

    Задайте для TARGET_URL полный URL вашей HTTPS-формы, для SOLVETHREE_PROXY — URL вашего HTTP- или HTTPS-прокси, а для SOLVETHREE_API_KEY — API-ключ рабочего пространства. Храните ключ в процессе Python, а не в JavaScript страницы.

Сначала решите задачу, затем запустите Chrome с полученными параметрами идентификации

Для этого примера Chrome требуется прокси с доступом по списку разрешённых IP-адресов, без имени пользователя и пароля. Он отклоняет URL прокси, содержащие учётные данные, и не реализует настройку прокси с аутентификацией.

Задача использует имя хоста, извлечённое из TARGET_URL, действие login и один прокси. После того как solve возвращает готовый результат, Chrome запускается с тем же прокси и полученным userAgent. Перед переходом на страницу пример также задаёт полученный заголовок secChUa.

Selenium + Python · Chrome с прокси, использующим список разрешённых IP-адресов
# Install selenium and the official solvethree Python SDK first.
import os
from urllib.parse import urlsplit
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from solvethree import Solvethree

target = os.environ["TARGET_URL"]  # Your configured HTTPS form page.
proxy_url = os.environ["SOLVETHREE_PROXY"]
proxy = urlsplit(proxy_url)
if proxy.username or proxy.password:
    raise ValueError("This Chrome example requires an IP-allowlisted proxy without URL credentials")
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
result = client.solve({"site": urlsplit(target).hostname, "action": "login", "proxy": proxy_url})
solution = result["solution"]
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=" + proxy_url)
options.add_argument("--user-agent=" + solution["userAgent"])
driver = webdriver.Chrome(options=options)
try:
    driver.execute_cdp_cmd("Network.enable", {})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
        "headers": {"sec-ch-ua": solution["secChUa"]}
    })
    driver.get(target)
    # Adapt the field and button to your application's form contract.
    field = WebDriverWait(driver, 20).until(
        lambda browser: browser.find_element(By.NAME, "g-recaptcha-response")
    )
    driver.execute_script("""
        arguments[0].value = arguments[1];
        arguments[0].dispatchEvent(new Event('input', {bubbles:true}));
    """, field, solution["token"])
    driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
    # Check your application's success response here.
finally:
    driver.quit()

Solvethree.solve создаёт задачу один раз и опрашивает её состояние до готовности либо выбрасывает исключение. Только после этого браузер переходит к форме. Скрипт ожидает поле токена, присваивает solution.token, отправляет событие ввода и нажимает кнопку отправки. Chrome закрывается в блоке finally.

Адаптируйте допущения примера о форме

  • TARGET_URL — страница формы вашего приложения. Поле site задачи — её имя хоста, а не полный URL; запросы reCAPTCHA не используют поля url или type.
  • login — действие в примере. Замените его действием, которое используется приложением и его настроенным профилем.
  • By.NAME с g-recaptcha-response находит textarea демонстрационного примера. Используйте поле или параметр отправки, который ваше приложение действительно читает. Присваивание значения и отправка события ввода — способ передачи данных в примере, а не универсальный обратный вызов reCAPTCHA.
  • button[type="submit"] определяет кнопку отправки демонстрационного примера. Замените его однозначным селектором вашей формы и сохраните требуемую приложением работу с сессией, CSRF и обратными вызовами.

Явное ожидание в 20 секунд в примере проверяет только наличие textarea. После нажатия кнопки отправки добавьте ожидание по условию для фактического результата приложения, например состояния успеха или ошибки валидации. Задайте общий предельный срок для браузерного сценария отдельно от тайм-аута сервиса решения; не заменяйте проверки состояния фиксированными паузами и не смешивайте неявные и явные ожидания без необходимости.

Проверьте этап сбоя, прежде чем оплачивать ещё одно решение

Задача сервиса решения завершается с ошибкой до запуска Chrome.

Проверьте errorCode и error задачи в конечном состоянии. Отличайте сбой задачи от ошибки HTTP-запроса.

Попробуйте: Перед повторной попыткой исправьте указанную проблему с входными данными, профилем или подключением. Прекратите опрашивать неудачную задачу; ещё один запрос не исправит неизменённые некорректные входные данные.

Selenium не находит textarea до истечения тайм-аута.

Убедитесь, что Chrome открыл нужную форму и что страница действительно содержит поле с именем из демонстрационного примера.

Попробуйте: Замените демонстрационный локатор механизмом передачи токена вашего приложения и дождитесь состояния, в котором он становится доступен. Увеличение тайм-аута не исправит неверный селектор.

Токен готов, но приложение отклоняет отправку.

Сначала изучите исходящий запрос приложения. Проверьте, что он содержит solution.token, а не ID задачи или старое значение, и что действие, прокси, параметры идентификации браузера и сессия соответствуют нужному сценарию.

Попробуйте: Исправьте переданный параметр или требования приложения, прежде чем запрашивать новый токен. Готовая задача предоставляет решение; ответ приложения определяет, была ли отправка принята.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Используйте сервис решения CAPTCHA с Selenium · solvethree