Bạn đã gửi CAPTCHA quay vòng tới CaptchaAI, nhận lại mã thông báo nhưng trang đích từ chối. Mã thông báo đã được giải quyết về mặt kỹ thuật - vấn đề là cách thức hoặc thời điểm bạn sử dụng nó. Hướng dẫn này đề cập đến mọi lý do khiến mã thông báo Turnstile không thành công sau khi giải quyết.
Triệu chứng
| Những gì bạn nhìn thấy | Có khả năng gây ra |
|---|---|
| Trang web trả về 403 sau khi gửi mã thông báo | Mã thông báo đã hết hạn trước khi gửi |
| Gửi biểu mẫu không thành công trong âm thầm | Tên trường sai để tiêm mã thông báo |
| Mã thông báo được chấp nhận nhưng hành động bị chặn | Khóa trang web không khớp - đã giải quyết sai tiện ích |
| Làm được một lần rồi thất bại | Mã thông báo đã được sử dụng (dùng một lần) |
| Hoạt động trong trình duyệt, không thành công trong tập lệnh | Thiếu cookie hoặc tiêu đề |
Nguyên nhân 1: Token hết hạn
Mã thông báo quay vòng hết hạn nhanh chóng — thường trong vòng 300 giây (5 phút). Nếu mã của bạn mất quá nhiều thời gian từ khi nhận được mã thông báo đến khi gửi mã thì mã thông báo đã chết.
Khắc phục: Gửi mã thông báo ngay sau khi nhận được.
import requests
import time
API_KEY = "YOUR_API_KEY"
# Submit Turnstile task
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAADnPIDROz1234",
"pageurl": "https://staging.example.com/qa-login",
"json": 1
}).json()
task_id = submit["request"]
time.sleep(10)
# Poll for result
for _ in range(24):
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:
token = result["request"]
# USE TOKEN IMMEDIATELY — do not delay
response = requests.post("https://staging.example.com/qa-login", data={
"username": "user",
"password": "pass",
"cf-turnstile-response": token
})
break
time.sleep(5)
Nguyên nhân 2: Sitekey sai
Mỗi tiện ích Turnstile có một khóa trang web duy nhất. Nếu trang có nhiều tiện ích hoặc bạn sao chép sai khóa, mã thông báo sẽ hợp lệ nhưng bị từ chối.
Cách tìm khóa trang web chính xác:
// In browser console on the target page
document.querySelectorAll('[data-sitekey]').forEach(el => {
console.log('Sitekey:', el.getAttribute('data-sitekey'));
console.log('Element:', el);
});
Nếu có nhiều khóa trang web, hãy sử dụng khóa được đính kèm với biểu mẫu bạn đang gửi.
Nguyên nhân 3: Tên trường sai
Turnstile mong đợi mã thông báo ở cf-turnstile-response chứ không phải g-recaptcha-response.
# WRONG — this is for reCAPTCHA
data = {"g-recaptcha-response": token}
# CORRECT — this is for Turnstile
data = {"cf-turnstile-response": token}
Một số trang web sử dụng tên trường tùy chỉnh. Kiểm tra biểu mẫu để tìm trường thực tế:
// Check what field the Turnstile widget populates
document.querySelector('[name*="turnstile"], [name*="cf-"]')
Nguyên nhân 4: Token đã được sử dụng
Mã thông báo quay vòng là loại sử dụng một lần. Nếu mã của bạn thử lại một yêu cầu có cùng mã thông báo thì lần thử thứ hai sẽ không thành công.
Khắc phục: Giải CAPTCHA mới cho mỗi lần gửi.
Nguyên nhân 5: Thiếu cookie hoặc bối cảnh phiên
Cloudflare có thể xác thực mã thông báo dựa trên cookie phiên. Nếu bạn giải CAPTCHA trong một phiên và gửi trong phiên khác thì có khả năng bị từ chối.
# Use the SAME session for page load and token submission
session = requests.Session()
# Load the page first to establish cookies
session.get("https://staging.example.com/qa-login")
# Then solve and submit using the same session
token = solve_turnstile(sitekey, pageurl)
session.post("https://staging.example.com/qa-login", data={
"cf-turnstile-response": token
})
Nguyên nhân 6: Hành động hoặc cData không khớp
Một số triển khai Turnstile bao gồm các tham số action hoặc cData được liên kết với mã thông báo. Nếu trang web mong đợi những điều này, bạn phải vượt qua chúng khi giải quyết.
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAADnPIDROz1234",
"pageurl": "https://staging.example.com/qa-login",
"action": "login", # If required by the site
"data": "custom_cdata_value", # If required by the site
"json": 1
}).json()
Cây quyết định
Token solved but rejected
↓
Used within 5 minutes? → No → Solve again, submit immediately
↓ Yes
Correct sitekey? → No → Find the correct sitekey from the page
↓ Yes
Using cf-turnstile-response field? → No → Change field name
↓ Yes
Same session for page load + submit? → No → Use session persistence
↓ Yes
Token used only once? → No → Solve a new token per submission
↓ Yes
Site requires action/cData? → Check page source, add to API call
Câu hỏi thường gặp
Mã thông báo Turnstile tồn tại trong bao lâu?
Thông thường là 300 giây (5 phút). Một số triển khai đặt thời hạn ngắn hơn. Gửi mã thông báo trong vòng vài giây sau khi nhận được nó.
Cloudflare Turnstile có giống với Cloudflare Challenge không?
Không. Turnstile là một tiện ích được nhúng (như reCAPTCHA). Cloudflare Challenge là quảng cáo chuyển tiếp toàn trang. Họ sử dụng các phương pháp CaptchaAI khác nhau: turnstile và cloudflare_challenge.
Tại sao mã thông báo của tôi hoạt động trong Postman nhưng không hoạt động trong tập lệnh của tôi?
Người đưa thư có thể gửi các tiêu đề hoặc cookie khác nhau. Hãy khớp tiêu đề và trạng thái phiên của tập lệnh với nội dung trình duyệt gửi.
Giải quyết CAPTCHA quay vòng tại CaptchaAI
Nhận giải pháp Turnstile đáng tin cậy tạicaptchaai.com.