Troubleshooting

Автоматизация браузера CAPTCHA не работает, но API работает: руководство по отладке

Вы решили CAPTCHA через CaptchaAI и получили действительный токен, но внедрить его в браузер не работает. В этом руководстве описаны все причины и способы устранения каждой из них.


Распространенные точки отказа

Проблема Симптом Первопричина
Токен не введен в правильный элемент Форма отправляется без токена Неправильный выбор текстовой области
Срок действия токена истек до отправки Сайт снова показывает CAPTCHA Слишком медленно между решением и отправкой
Обратный звонок не запущен Кнопка формы остается отключенной Отсутствует обратный вызов grecaptcha
Неправильный адрес страницы отправлен в API Токен недействителен для этого домена Несоответствие URL-адреса
Обнаружение ботов за пределами CAPTCHA Заблокировано после принятия токена дополнительные сигналы браузера

Исправление 1: правильное передача токена во внутренний QA endpoint для reCAPTCHA v2

Токен должен войти в текстовое поле g-recaptcha-response И должен сработать обратный вызов:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time


def inject_recaptcha_token(driver, token):
    """Properly inject reCAPTCHA v2 token in browser."""

    # Step 1: Make the response textarea visible and set the value
    driver.execute_script("""
        // Find all response textareas (may be multiple on page)
        var textareas = document.querySelectorAll('[name="g-recaptcha-response"]');
        textareas.forEach(function(ta) {
            ta.style.display = 'block';
            ta.value = arguments[0];
        });

        // Also set via ID if present
        var byId = document.getElementById('g-recaptcha-response');
        if (byId) {
            byId.style.display = 'block';
            byId.value = arguments[0];
        }
    """, token)

    # Step 2: Trigger the callback
    driver.execute_script("""
        // Try standard callback
        if (typeof ___grecaptcha_cfg !== 'undefined') {
            var clients = ___grecaptcha_cfg.clients;
            for (var key in clients) {
                var client = clients[key];
                // Navigate nested structure to find callback
                for (var prop in client) {
                    var val = client[prop];
                    if (val && typeof val === 'object') {
                        for (var subprop in val) {
                            var subval = val[subprop];
                            if (subval && typeof subval === 'object' && subval.callback) {
                                subval.callback(arguments[0]);
                                return;
                            }
                        }
                    }
                }
            }
        }
        // Fallback: try common callback names
        if (typeof onCaptchaSuccess === 'function') onCaptchaSuccess(arguments[0]);
        else if (typeof captchaCallback === 'function') captchaCallback(arguments[0]);
    """, token)


# Usage
driver = webdriver.Chrome()
driver.get("https://example.com/form")
# ... solve CAPTCHA via CaptchaAI ...
inject_recaptcha_token(driver, token)
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, "button[type=submit]").click()

Исправление 2: обработка форм, зависящих от обратного вызова

Некоторые формы остаются отключенными до тех пор, пока не сработает обратный вызов CAPTCHA:

def find_and_trigger_callback(driver, token):
    """Find the reCAPTCHA callback and trigger it."""

    # Method 1: Extract callback from data attribute
    callback_name = driver.execute_script("""
        var widget = document.querySelector('.g-recaptcha');
        if (widget) {
            return widget.getAttribute('data-callback');
        }
        return null;
    """)

    if callback_name:
        driver.execute_script(f"window['{callback_name}'](arguments[0]);", token)
        return True

    # Method 2: Extract from grecaptcha config
    triggered = driver.execute_script("""
        try {
            var widgetId = 0;
            var callback = ___grecaptcha_cfg.clients[widgetId].aa.l.callback;
            if (typeof callback === 'function') {
                callback(arguments[0]);
                return true;
            }
        } catch(e) {}
        return false;
    """, token)

    return triggered

Исправление 3: Сроки — решите и используйте немедленно

import requests
import time


def solve_and_inject_fast(driver, api_key, sitekey, page_url):
    """Solve CAPTCHA and inject token with minimal delay."""
    # Submit solve request
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": page_url,
        "json": 1,
    }, timeout=30)
    task_id = resp.json()["request"]

    # Poll for result
    time.sleep(15)
    for _ in range(24):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15)
        data = resp.json()

        if data.get("status") == 1:
            token = data["request"]

            # IMMEDIATELY inject — don't wait
            inject_recaptcha_token(driver, token)

            # Submit form within 5 seconds
            time.sleep(0.5)
            return True

        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("Solve timeout")

Исправление 4. Правильный URL-адрес страницы для SPA и Iframe.

def get_correct_pageurl(driver):
    """Get the URL that reCAPTCHA actually sees."""

    # Check if CAPTCHA is in an iframe
    iframes = driver.find_elements(By.TAG_NAME, "iframe")

    for iframe in iframes:
        src = iframe.get_attribute("src") or ""
        if "recaptcha" in src or "anchor" in src:
            # CAPTCHA is in iframe — use parent page URL
            return driver.current_url

    # For SPAs, use current URL (may differ from initial load)
    return driver.current_url


# WRONG — using the URL you navigated to
pageurl = "https://example.com/form"  # May have redirected

# CORRECT — using the URL the browser is actually on
pageurl = get_correct_pageurl(driver)

Исправление 5: Обнаружение анти-ботов за пределами CAPTCHA

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

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service


def create_stealth_driver():
    """Create a browser that avoids basic bot detection."""
    options = Options()

    # Remove automation indicators
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option("useAutomationExtension", False)

    # Set realistic window size
    options.add_argument("--window-size=1920,1080")

    driver = webdriver.Chrome(options=options)

    # Override сигнал WebDriver
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
    })

    return driver


driver = create_stealth_driver()

Исправление 6: Введение токена Cloudflare Turnstile

Cloudflare Turnstile использует другой подход к внедрению:

def inject_turnstile_token(driver, token):
    """Inject Turnstile token into the page."""
    driver.execute_script("""
        // Find Turnstile response input
        var inputs = document.querySelectorAll(
            'input[name="cf-turnstile-response"], ' +
            'input[name="g-recaptcha-response"]'
        );

        inputs.forEach(function(input) {
            input.value = arguments[0];
        });

        // Trigger change event
        inputs.forEach(function(input) {
            input.dispatchEvent(new Event('change', { bubbles: true }));
            input.dispatchEvent(new Event('input', { bubbles: true }));
        });

        // Try Turnstile callback
        if (window.turnstile) {
            var widgets = document.querySelectorAll('[data-callback]');
            widgets.forEach(function(w) {
                var cb = w.getAttribute('data-callback');
                if (typeof window[cb] === 'function') {
                    window[cb](arguments[0]);
                }
            });
        }
    """, token)

Контрольный список отладки

def debug_captcha_injection(driver, token):
    """Print debug info to diagnose injection failures."""
    info = driver.execute_script("""
        var result = {};

        // Check textarea exists
        var ta = document.querySelector('[name="g-recaptcha-response"]');
        result.textarea_found = !!ta;
        result.textarea_value_set = ta ? ta.value.length > 0 : false;

        // Check reCAPTCHA loaded
        result.grecaptcha_loaded = typeof grecaptcha !== 'undefined';

        // Check for callback
        var widget = document.querySelector('.g-recaptcha');
        result.has_data_callback = widget ? !!widget.getAttribute('data-callback') : false;
        result.callback_name = widget ? widget.getAttribute('data-callback') : null;

        // Current URL
        result.current_url = window.location.href;

        // Check for errors in console (basic)
        result.has_submit_button = !!document.querySelector('button[type=submit], input[type=submit]');

        return result;
    """)

    for key, value in info.items():
        print(f"  {key}: {value}")

    return info

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

Симптом Причина Исправить
Токен установлен, но форма отклоняется Обратный звонок не запущен Найдите и вызовите функцию обратного вызова
Кнопка «Отправить» остается неактивной Обратный вызов позволяет это сделать Запуск обратного вызова после передача токена во внутренний QA endpoint
«Неверная капча» после отправки Срок действия токена истек Сократите время между решением и отправкой
403 после отправки формы Обнаружение ботов (не CAPTCHA) Используйте скрытые параметры браузера
Работает в запросах, не работает в браузере Другой адрес страницы Используйте driver.current_url в качестве URL-адреса страницы.

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

Почему токен работает в запросах, но не в браузере?

Обычно потому, что функция обратного вызова не срабатывает. Браузерные формы часто используют обратный вызов для включения отправки или установки скрытых полей.

Нужно ли мне использовать конкретный браузер?

Chrome/Chromium наиболее совместим. Firefox работает, но для команд CDP могут потребоваться другие подходы. Используйте undetected-chromedriver для сайтов с сильным обнаружением ботов.

Стоит ли использовать headless-режим?

Некоторые сайты обнаруживают автономные браузеры и отклоняют токены. Сначала попробуйте режим headful, затем переключитесь на headless с соответствующими флагами, если он работает.


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



Следующие шаги

  • CaptchaAI Quickstart: ваше первое решение CAPTCHA за 5 минут
  • Как решить reCAPTCHA v2 через API: пошаговое руководство
  • Как решить Cloudflare Turnstile через API
  • Как решить GeeTest v3 с помощью API
Комментарии для этой статьи отключены.

Похожие сообщения

Tutorials Кеширование CAPTCHA-токенов в собственном backend в пределах TTL
Корректно кешируйте и переиспользуйте CAPTCHA-токены в пределах официального TTL для идемпотентных ретраев в собственном backend.

Корректно кешируйте и переиспользуйте CAPTCHA-токены в пределах официального TTL для идемпотентных ретраев в с...

May 02, 2026
Integrations Изоляция браузерных профилей для QA с CaptchaAI
Разделяйте cookies, storage, тестовые учетные записи и CAPTCHA-конфигурации по браузерным профилям, чтобы QA-тесты в staging были чистыми и воспроизводимыми.

Разделяйте cookies, storage, тестовые учетные записи и CAPTCHA-конфигурации по браузерным профилям, чтобы QA-т...

Apr 28, 2026
Tutorials Создайте конвейер автоматизированного тестирования с помощью CaptchaAI
Пошаговое руководство по созданию конвейерного внедрения с помощью Captcha AI, с примерами прямого повторного использования и понятным рабочим процессом Captcha...

Пошаговое руководство по созданию конвейерного внедрения с помощью Captcha AI, с примерами прямого повторного...

Apr 29, 2026