undetected-chromedriver — это библиотека Python, которая исправляет ChromeDriver Selenium для уменьшения сигналов обнаружения ботов. Он обрабатывает сопоставление версий Chrome, удаляет флаги сигнал WebDriver и изменяет другие сигналы браузера браузера, которые проверяют сайты. Если сайт по-прежнему отображает CAPTCHA, несмотря на меры предсказуемая конфигурация браузера, CaptchaAI решает ее и возвращает токен, который вы вводите на страницу.
В этом руководстве показано, как объединить оба инструмента — используйте undetected-chromedriver для скрытого просмотра и CaptchaAI для любых CAPTCHA, которые все еще появляются.
Что вам нужно
| Требование | Подробности |
|---|---|
| CaptchaAI API-ключ | captchaai.com |
| Питон 3.8+ | |
| Браузер Chrome | Установлен в вашей системе |
Установите зависимости:
pip install undetected-chromedriver requests
Базовая настройка
import undetected_chromedriver as uc
import requests
import time
def create_stealth_browser():
"""Create an undetected Chrome browser instance."""
options = uc.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
driver = uc.Chrome(options=options)
return driver
Решение reCAPTCHA v2 в скрытом сеансе
Шаг 1. Найдите и извлеките ключ сайта.
API_KEY = "YOUR_API_KEY"
def extract_recaptcha_sitekey(driver):
"""Extract reCAPTCHA v2 sitekey from the page."""
try:
element = driver.find_element("css selector", "[data-sitekey]")
return element.get_attribute("data-sitekey")
except Exception:
# Try finding in iframe src
iframes = driver.find_elements("css selector", "iframe[src*='recaptcha']")
for iframe in iframes:
src = iframe.get_attribute("src")
if "k=" in src:
return src.split("k=")[1].split("&")[0]
return None
Шаг 2. Решите с помощью CaptchaAI.
def solve_recaptcha_v2(sitekey, pageurl):
"""Submit reCAPTCHA v2 to CaptchaAI and return the token."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(20)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
Шаг 3. Вставьте токен и отправьте его.
def inject_recaptcha_token(driver, token):
"""Inject the solved token into the page and submit."""
driver.execute_script(f'''
document.getElementById("g-recaptcha-response").innerHTML = "{token}";
document.getElementById("g-recaptcha-response").style.display = "block";
''')
# If there's a callback function, trigger it
driver.execute_script(f'''
if (typeof ___grecaptcha_cfg !== 'undefined') {{
var clients = ___grecaptcha_cfg.clients;
for (var key in clients) {{
var client = clients[key];
if (client && client.callback) {{
client.callback("{token}");
}}
}}
}}
''')
Полный рабочий процесс: вход с помощью reCAPTCHA
import undetected_chromedriver as uc
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_recaptcha(sitekey, pageurl):
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": pageurl, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(20)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
def main():
driver = uc.Chrome()
try:
# Navigate to target page
driver.get("https://https://staging.example.com/qa-login")
time.sleep(3)
# Fill in form fields
driver.find_element("id", "username").send_keys("user")
driver.find_element("id", "password").send_keys("pass")
# Extract sitekey
element = driver.find_element("css selector", "[data-sitekey]")
sitekey = element.get_attribute("data-sitekey")
pageurl = driver.current_url
print(f"Sitekey: {sitekey}")
# Solve CAPTCHA
token = solve_recaptcha(sitekey, pageurl)
print(f"Token: {token[:50]}...")
# Inject token
driver.execute_script(
f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)
# Submit form
driver.find_element("id", "submit-btn").click()
time.sleep(3)
print(f"Current URL: {driver.current_url}")
finally:
driver.quit()
if __name__ == "__main__":
main()
Решение Cloudflare Turnstile
Для сайтов с виджетами Cloudflare Turnstile извлеките ключ сайта и решите с помощью метода Cloudflare Turnstile:
def solve_turnstile(sitekey, pageurl):
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "turnstile",
"sitekey": sitekey, "pageurl": pageurl, "json": 1
}).json()
if submit.get("status") != 1:
raise RuntimeError(f"Submit error: {submit.get('request')}")
task_id = submit["request"]
time.sleep(10)
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {result['request']}")
time.sleep(5)
raise TimeoutError("Solve timed out")
# Inject Turnstile token
def inject_turnstile_token(driver, token):
driver.execute_script(f'''
var input = document.querySelector('[name="cf-turnstile-response"]');
if (input) input.value = "{token}";
''')
Поиск неисправностей
| Проблема | Причина | Исправить |
|---|---|---|
| Несоответствие версии Chrome | UC не может найти подходящий драйвер | Обновите Chrome или укажите version_main в uc.Chrome(). |
| CAPTCHA все еще появляется | На сайте используется расширенная технология снятия сигналы браузера | Это ожидаемо — решите с помощью CaptchaAI. |
| передача токена во внутренний QA endpoint не удалось | Неправильный идентификатор элемента или обратный вызов | Проверьте реализацию reCAPTCHA на странице. |
WebDriverException |
Chrome разбился | Добавьте --no-sandbox и --disable-dev-shm-usage. |
Часто задаваемые вопросы
Зачем использовать undetected-chromedriver с CaptchaAI?
Undetected-chromedriver уменьшает сигналы обнаружения ботов, поэтому появляется меньше CAPTCHA. Когда CAPTCHA все еще срабатывает, CaptchaAI решает их. Комбинация дает самый высокий показатель успеха.
Работает ли undetected-chromedriver в headless-режиме?
Да, но headless-режим может вызвать больше CAPTCHA. Используйте options.add_argument("--headless=new") для нового headless режима Chrome.
Могу ли я использовать это с Selenium Grid?
Да, но undetected-chromedriver необходимо исправить двоичный файл локального драйвера. Для распределенных установок предварительно исправьте драйвер на каждом узле.
Что, если сайт обнаружит автоматизацию, несмотря на UC?
Некоторые сайты используют расширенное обнаружение помимо патчей UC. CaptchaAI обрабатывает полученные CAPTCHA независимо от метода обнаружения.
Добавьте CaptchaAI в систему автоматизации вашего браузера
Получите ключ API по адресуcaptchaai.com. Объедините скрытный просмотр с надежным решением CAPTCHA.
Связанные руководства
- Как решить reCAPTCHA v2 с помощью API
- Как решить Cloudflare Turnstile с помощью API
- Puppeteer стандартная конфигурация браузера + CaptchaAI
- headless-режим и headed Chrome для решения CAPTCHA