Сценарии использования

Обработка Selenium CAPTCHA с помощью Python и CaptchaAI

Selenium автоматизирует взаимодействие с браузером, но CAPTCHA останавливает это. API CaptchaAI решает CAPTCHA извне, в то время как Selenium обрабатывает браузер — вы извлекаете параметры CAPTCHA, отправляете их в API и вставляете возвращенный токен.

Требования

Требование Подробности
Питон 3.7+ С установленным пипом
Селен pip install selenium
Chrome + ChromeDriver Соответствующие версии
запросы pip install requests
CaptchaAI API-ключ Отcaptchaai.com

Как это работает

  1. Selenium загружает целевую страницу
  2. Ваш скрипт извлекает ключ сайта CAPTCHA из DOM страницы.
  3. CaptchaAI решает CAPTCHA, используя ключ сайта и URL-адрес страницы.
  4. Ваш скрипт вводит токен на страницу и отправляет форму.

CAPTCHA решается на стороне сервера с помощью CaptchaAI — Selenium никогда не взаимодействует с виджетом CAPTCHA напрямую.

Шаг 1. Настройте Selenium

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")

driver = webdriver.Chrome(options=options)

Флаг AutomationControlled помогает избежать обычного обнаружения ботов. Для более сильной скрытной конфигурации добавьте:

options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

Шаг 2. Создайте решатель CAPTCHA

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_recaptcha_v2(site_key, page_url):
    """Solve reCAPTCHA v2 using CaptchaAI API."""
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url
    })
    if not resp.text.startswith("OK|"):
        raise Exception(f"Submit failed: {resp.text}")

    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY":
            continue
        if result.text.startswith("OK|"):
            return result.text.split("|")[1]
        raise Exception(f"Solve failed: {result.text}")

    raise TimeoutError("CAPTCHA solve timed out")

Шаг 3. Извлеките ключ сайта и решите проблему.

# Navigate to the target page
driver.get("https://https://staging.example.com/qa-login")

# Wait for the reCAPTCHA to load
wait = WebDriverWait(driver, 10)
recaptcha = wait.until(
    EC.presence_of_element_located((By.CLASS_NAME, "g-recaptcha"))
)

# Extract the site key
site_key = recaptcha.get_attribute("data-sitekey")
page_url = driver.current_url

print(f"Site key: {site_key}")
print(f"Page URL: {page_url}")

# Solve the CAPTCHA
token = solve_recaptcha_v2(site_key, page_url)
print(f"Token received: {token[:50]}...")

Шаг 4. Введите токен и отправьте его.

# Inject the token into the reCAPTCHA response field
driver.execute_script(f"""
    document.getElementById('g-recaptcha-response').innerHTML = '{token}';
    document.getElementById('g-recaptcha-response').style.display = '';
""")

# If the form uses a callback function, trigger it
driver.execute_script(f"""
    if (typeof ___grecaptcha_cfg !== 'undefined') {{
        Object.keys(___grecaptcha_cfg.clients).forEach(function(key) {{
            var client = ___grecaptcha_cfg.clients[key];
            if (client.callback) client.callback('{token}');
        }});
    }}
""")

# Submit the form
driver.find_element(By.CSS_SELECTOR, "form").submit()

# Wait for navigation
wait.until(EC.url_changes(page_url))
print(f"Success! Now on: {driver.current_url}")

Полный рабочий пример

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_recaptcha_v2(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url
    })
    if not resp.text.startswith("OK|"):
        raise Exception(f"Submit failed: {resp.text}")
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY":
            continue
        if result.text.startswith("OK|"):
            return result.text.split("|")[1]
        raise Exception(f"Solve failed: {result.text}")
    raise TimeoutError("Timed out")

def main():
    options = Options()
    options.add_argument("--disable-blink-features=AutomationControlled")
    driver = webdriver.Chrome(options=options)

    try:
        driver.get("https://https://staging.example.com/qa-login")
        wait = WebDriverWait(driver, 10)

        # Extract site key
        recaptcha = wait.until(
            EC.presence_of_element_located((By.CLASS_NAME, "g-recaptcha"))
        )
        site_key = recaptcha.get_attribute("data-sitekey")

        # Solve
        token = solve_recaptcha_v2(site_key, driver.current_url)

        # Inject and submit
        driver.execute_script(
            f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
        )
        driver.find_element(By.CSS_SELECTOR, "form").submit()

        wait.until(EC.url_changes(driver.current_url))
        print("Login successful!")

    finally:
        driver.quit()

if __name__ == "__main__":
    main()

Обработка различных типов CAPTCHA

reCAPTCHA v3

def solve_recaptcha_v3(site_key, page_url, action="verify"):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url,
        "version": "v3",
        "action": action
    })
    task_id = resp.text.split("|")[1]
    # ... same polling logic

Cloudflare Turnstile

def solve_turnstile(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": site_key,
        "pageurl": page_url
    })
    task_id = resp.text.split("|")[1]
    # ... same polling logic

Поиск неисправностей

Проблема Причина Исправить
Токен отклонен Срок действия токена истек до отправки Внедрите и отправьте в течение 120 секунд.
Ключ сайта не найден CAPTCHA загружается динамически Добавьте WebDriverWait с более длительным тайм-аутом.
NoSuchElementException Неправильный селектор Проверьте страницу, чтобы найти правильный элемент.
Несоответствие версии ChromeDriver Chrome обновлен Загрузите соответствующую версию ChromeDriver
Обнаружение бота, несмотря на правильный токен Антибот за пределами CAPTCHA Добавьте параметры предсказуемая конфигурация браузера, используйте undetected-chromedriver

Часто задаваемые вопросы

Могу ли я запустить Selenium в headless-режиме с помощью CaptchaAI?

Да. CaptchaAI решает CAPTCHA на стороне сервера — браузеру просто нужно загрузить страницу, чтобы извлечь ключ сайта. headless-режим режим работает нормально.

Нужно ли ставить флажок CAPTCHA?

Нет. CaptchaAI возвращает токен, который вы вставляете непосредственно в форму. Никакого визуального взаимодействия с виджетом CAPTCHA не требуется.

А как насчет reCAPTCHA с обратными вызовами?

Некоторые сайты используют обратные вызовы JavaScript вместо отправки формы. Используйте driver.execute_script(), чтобы вызвать обратный вызов с решенным токеном. ВидетьКак решить обратный вызов reCAPTCHA v2.

Связанные руководства

  • Как решать проблемы CAPTCHA в рабочих процессах веб-скрапинга
  • Решение CAPTCHA Puppeteer с помощью Node.js
  • Драматург Обработка CAPTCHA
Комментарии для этой статьи отключены.