Selenium автоматизирует взаимодействие с браузером, но CAPTCHA останавливает это. API CaptchaAI решает CAPTCHA извне, в то время как Selenium обрабатывает браузер — вы извлекаете параметры CAPTCHA, отправляете их в API и вставляете возвращенный токен.
Требования
| Требование | Подробности |
|---|---|
| Питон 3.7+ | С установленным пипом |
| Селен | pip install selenium |
| Chrome + ChromeDriver | Соответствующие версии |
| запросы | pip install requests |
| CaptchaAI API-ключ | Отcaptchaai.com |
Как это работает
- Selenium загружает целевую страницу
- Ваш скрипт извлекает ключ сайта CAPTCHA из DOM страницы.
- CaptchaAI решает CAPTCHA, используя ключ сайта и URL-адрес страницы.
- Ваш скрипт вводит токен на страницу и отправляет форму.
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