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ộ giải Selenium reCAPTCHA v2
- Cloudflare Turnstile 403 Sau khi sửa mã thông báo
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