Troubleshooting

CAPTCHA tự động hóa trình duyệt không thành công nhưng API vẫn hoạt động: Hướng dẫn gỡ lỗi

Bạn đã giải CAPTCHA qua CaptchaAI và nhận được mã thông báo hợp lệ nhưng việc đưa mã này vào trình duyệt không hoạt động. Hướng dẫn này bao gồm mọi lý do tại sao và cách khắc phục từng lý do.


Điểm thất bại phổ biến

vấn đề Triệu chứng Nguyên nhân gốc rễ
Mã thông báo không được đưa vào đúng phần tử Gửi biểu mẫu mà không có mã thông báo Bộ chọn vùng văn bản sai
Mã thông báo đã hết hạn trước khi gửi Trang web hiển thị lại CAPTCHA Quá chậm giữa việc giải quyết và gửi
Cuộc gọi lại không được kích hoạt Nút biểu mẫu vẫn bị vô hiệu hóa Thiếu lệnh gọi lại grcaptcha
URL trang sai được gửi tới API Mã thông báo không hợp lệ cho tên miền này URL không khớp
Phát hiện bot ngoài CAPTCHA Bị chặn sau khi chấp nhận mã thông báo Lấy dấu vân tay của trình duyệt

Cách khắc phục 1: Chèn mã thông báo chính xác cho reCAPTCHA v2

Mã thông báo phải đi vào vùng văn bản g-recaptcha-response VÀ lệnh gọi lại phải kích hoạt:

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()

Cách khắc phục 2: Xử lý các biểu mẫu phụ thuộc vào cuộc gọi lại

Một số biểu mẫu vẫn bị vô hiệu hóa cho đến khi lệnh gọi lại CAPTCHA kích hoạt:

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

Cách 3: Tính thời gian — Giải quyết và sử dụng ngay

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")

Cách 4: Pageurl chính xác cho SPA và 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)

Khắc phục 5: Phát hiện chống Bot ngoài CAPTCHA

Ngay cả với mã thông báo hợp lệ, trang web có thể chặn các trình duyệt tự động:

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("")
    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 thuộc tính WebDriver chuẩn
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
    })

    return driver

driver = create_stealth_driver()

Cách khắc phục 6: Tiêm mã thông báo quay vòng

Cloudflare Turnstile sử dụng phương pháp tiêm khác:

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)

Danh sách kiểm tra gỡ lỗi

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

Khắc phục sự cố

Triệu chứng nguyên nhân sửa chữa
Đã đặt mã thông báo nhưng biểu mẫu bị từ chối Cuộc gọi lại không được kích hoạt Tìm và gọi hàm gọi lại
Nút gửi vẫn bị vô hiệu hóa Gọi lại cho phép nó Kích hoạt lệnh gọi lại sau khi tiêm mã thông báo
"CAPTCHA không hợp lệ" sau khi gửi Mã thông báo đã hết hạn Giảm thời gian giữa giải quyết và gửi
403 sau khi gửi biểu mẫu Phát hiện bot (không phải CAPTCHA) Sử dụng các tùy chọn trình duyệt ẩn
Hoạt động trong các yêu cầu, không thành công trong trình duyệt URL trang khác nhau Sử dụng driver.current_url làm pageurl

Câu hỏi thường gặp

Tại sao mã thông báo hoạt động trong yêu cầu nhưng không hoạt động trong trình duyệt?

Thông thường vì chức năng gọi lại không được kích hoạt. Các biểu mẫu trình duyệt thường dựa vào lệnh gọi lại để cho phép gửi hoặc đặt các trường ẩn.

Tôi có cần sử dụng một trình duyệt cụ thể không?

Chrome/Chromium tương thích nhất. Firefox hoạt động nhưng có thể cần các cách tiếp cận khác nhau cho lệnh CDP. Sử dụng chromedriver không bị phát hiện cho các trang web có khả năng phát hiện bot mạnh.

Tôi có nên sử dụng chế độ headless?

Một số trang web phát hiện trình duyệt không có giao diện người dùng và từ chối mã thông báo. Trước tiên hãy thử chế độ headful, sau đó chuyển sang headless với các cờ thích hợp nếu nó hoạt động.


Hướng dẫn liên quan



Bước tiếp theo

  • CaptchaAI Quickstart: Lần Giải CAPTCHA Đầu Tiên Của Bạn Trong 5 Phút
  • Cách Giải reCAPTCHA v2 Bằng API: Hướng Dẫn Từng Bước
  • Cách giải Cloudflare Turnstile bằng API
  • Cách giải quyết GeeTest v3 bằng API
Os comentários estão desativados para este artigo.

Postagens relacionadas

Tutorials Xây dựng quy trình thử nghiệm tự động với CaptchaAI
Hướng dẫn từng bước để xây dựng quy trình thử nghiệm tự động với Captcha AI, với các ví dụ có thể sử dụng lại trực tiếp và quy trình làm việc Captcha AI rõ ràng...

Hướng dẫn từng bước để xây dựng quy trình thử nghiệm tự động với Captcha AI, với các ví dụ có thể sử dụng lại...

Apr 30, 2026
Reference Tính bền vững phiên trình duyệt cho luồng QA CAPTCHA của bạn
Duy trì phiên trình duyệt qua nhiều bước trong kiểm thử QA CAPTCHA trên staging của bạn để giảm gián đoạn và tăng độ tái lập.

Duy trì phiên trình duyệt qua nhiều bước trong kiểm thử QA CAPTCHA trên staging của bạn để giảm gián đoạn và t...

Apr 30, 2026
Integrations Tách biệt hồ sơ trình duyệt cho QA với CaptchaAI
Tách cookie, storage, tài khoản kiểm thử và cấu hình CAPTCHA theo từng hồ sơ trình duyệt để giữ cho kiểm thử QA trong staging sạch và có thể tái lập.

Tách cookie, storage, tài khoản kiểm thử và cấu hình CAPTCHA theo từng hồ sơ trình duyệt để giữ cho kiểm thử Q...

Apr 29, 2026