Hầu hết các lỗi Cloudflare Turnstile không phải là ngẫu nhiên. Chúng thuộc ba loại: lỗi ở giai đoạn yêu cầu (việc gửi tới API của bạn bị từ chối), lỗi ở giai đoạn kết quả (thảo luận không thành công hoặc hết thời gian chờ) và lỗi xác thực trang đích (API trả về mã thông báo hợp lệ nhưng trang vẫn từ chối nó).
Ba vấn đề lớn nhất liên quan đến Turnstile là:
- URL trang chính xác sai — đặc biệt là trên các trang thử thách Cloudflare, nơi ngữ cảnh chặt chẽ hơn
- Khóa trang web sai — bị bắt từ thành phần sai hoặc phiên bản tiện ích con khác
- Mã thông báo được áp dụng sai đường dẫn — trang mong đợi
cf-turnstile-response, lệnh gọi lại hoặc cả hai
CaptchaAI giải quyết Turnstile bằng mộtTỷ lệ thành công 100%trong vòng chưa đầy 10 giây. Khi quá trình tích hợp của bạn không thành công, vấn đề hầu như luôn nằm ở các thông số bạn gửi hoặc cách bạn áp dụng mã thông báo được trả về.
Điểm thất bại dành riêng cho cửa quay
Trước khi đi sâu vào mã lỗi, hãy hiểu ba điều khiến Turnstile khác biệt với các loại hình ảnh xác thực khác:
1. URL trang chính xác quan trọng hơn
Mã thông báo quay vòng được liên kết chặt chẽ với ngữ cảnh trang. Trên các trang thử thách Cloudflare (màn hình xác minh toàn trang), sử dụng sai URL — thậm chí là đường dẫn hơi khác — sẽ khiến mã thông báo bị từ chối.
2. Hai đường dẫn ứng dụng mã thông báo
Mã thông báo được trả về có thể được áp dụng theo hai cách và việc sử dụng sai mã thông báo sẽ không thành công:
| phương pháp | Khi nào nên sử dụng |
|---|---|
Trường ẩn — chèn vào cf-turnstile-response (và đôi khi là g-recaptcha-response) |
Khi trang sử dụng biểu mẫu chuẩn có thông tin nhập ẩn |
Hàm gọi lại — gọi hàm được xác định trong turnstile.render() hoặc data-callback |
Khi trang sử dụng xác thực theo chương trình thay vì biểu mẫu |
3. Token chỉ sử dụng một lần
Mã thông báo Turnstile chỉ có thể được xác minh một lần. Nếu tự động hóa của bạn vô tình gửi nó hai lần hoặc nếu có điều kiện chạy đua thì lần thử thứ hai sẽ thất bại.
Lỗi ở giai đoạn yêu cầu
Những điều này xảy ra khi gửi nhiệm vụ tới https://ocr.captchaai.com/in.php.
ERROR_WRONG_USER_KEY
Lý do: Định dạng khóa API không chính xác (phải có 32 ký tự).
Khắc phục: Xác minh khóa từcaptchaai.com/api.php.
ERROR_KEY_DOES_NOT_EXIST
Lý do: Khóa được định dạng đúng nhưng không được liên kết với tài khoản đang hoạt động.
Khắc phục: Kiểm tra trang tổng quan của bạn. Đảm bảo tài khoản đang hoạt động và khóa chính xác.
ERROR_ZERO_BALANCE
Lý do: Không có chủ đề miễn phí nào trong gói của bạn.
Khắc phục: Đợi các luồng giải phóng, giảm độ tương tranh hoặc nâng cấp.
ERROR_PAGEURL
Lý do: Thiếu tham số pageurl.
Khắc phục: Thêm URL đầy đủ — giao thức, miền và đường dẫn:
pageurl=https://staging.example.com/qa-login
ERROR_BAD_PARAMETERS
Lý do: Các tham số bắt buộc bị thiếu hoặc không đúng định dạng. Đối với Turnstile, các tham số bắt buộc là:
| tham số | loại | Bắt buộc | Mô tả |
|---|---|---|---|
key |
chuỗi | Có | Khóa API CaptchaAI của bạn |
method |
chuỗi | Có | Phải là turnstile |
sitekey |
chuỗi | Có | Khóa trang web tiện ích cửa quay |
pageurl |
chuỗi | Có | URL toàn trang |
Tùy chọn nhưng hữu ích:
| tham số | loại | Mô tả |
|---|---|---|
action |
chuỗi | Giá trị của data-action hoặc tham số action từ turnstile.render() |
proxy |
chuỗi | Định dạng: login:password@IP:PORT |
proxytype |
chuỗi | HTTP, HTTPS, SOCKS4, SOCKS5 |
Khắc phục: Xác minh tất cả các trường bắt buộc đều có và được nhập chính xác.
Phản hồi HTML hoặc 500/502
Nguyên nhân: Lỗi tạm thời phía máy chủ.
Khắc phục: Đợi 5–10 giây rồi thử lại.
Cách tìm khóa trang web Turnstile
Khóa trang web là thông số thường sai nhất. Đây là nơi để tìm thấy nó:
Tùy chọn 1 — thuộc tính data-sitekey:
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAB1example"></div>
Tùy chọn 2 — lệnh gọi turnstile.render():
turnstile.render('#captcha-container', {
sitekey: '0x4AAAAAAAB1example',
callback: function(token) {
document.getElementById('cf-turnstile-response').value = token;
}
});
Tùy chọn 3 — chặn lệnh gọi kết xuất (nâng cao):
Nếu khóa trang web được tải động, bạn có thể xác định lại turnstile.render trước khi tiện ích khởi chạy để nắm bắt các tham số:
// Inject this before the Turnstile script loads
const originalRender = window.turnstile.render;
window.turnstile.render = function(container, params) {
console.log('Sitekey:', params.sitekey);
console.log('Action:', params.action);
return originalRender.call(this, container, params);
};
Lỗi ở giai đoạn kết quả
Những điều này xảy ra khi bỏ phiếu https://ocr.captchaai.com/res.php.
CAPCHA_NOT_READY
Không phải lỗi. Việc giải quyết vẫn đang được tiến hành. Quá trình giải quyết bằng cửa quay tại CaptchaAI thường mất dưới 10 giây.
Khắc phục: Đợi 5 giây và thăm dò lại.
ERROR_WRONG_ID_FORMAT
Lý do: ID hình ảnh xác thực chứa các ký tự không phải số.
Khắc phục: Sử dụng ID chính xác được in.php trả về, chưa sửa đổi.
ERROR_WRONG_CAPTCHA_ID
Lý do: ID không khớp với bất kỳ tác vụ nào đã gửi.
Khắc phục: Xác minh rằng bạn đang thăm dò ID chính xác từ phản hồi gửi.
ERROR_EMPTY_ACTION
Lý do: Tham số action bị thiếu trong yêu cầu thăm dò ý kiến của bạn.
Khắc phục: Luôn bao gồm action=get:
https://ocr.captchaai.com/res.php?key=YOUR_KEY&action=get&id=CAPTCHA_ID&json=1
Lưu ý: Đối với Turnstile, hãy luôn sử dụng
json=1trong yêu cầu thăm dò ý kiến của bạn. Phản hồi JSON có thể bao gồmuser_agentcủa bộ giải mà một số trang được Cloudflare bảo vệ yêu cầu để xác thực mã thông báo thành công.
ERROR_CAPTCHA_UNSOLVABLE
Lý do: Giải quyết không thành công — có thể sai khóa trang web hoặc cấu hình trang không được hỗ trợ.
Khắc phục: Xác minh khóa trang web, làm mới yêu cầu và thử lại.
ERROR_INTERNAL_SERVER_ERROR
Nguyên nhân: Sự cố phía máy chủ.
Khắc phục: Đợi 10 giây và thử lại.
Lỗi xác thực trang đích
Đây là những lỗi khó gỡ lỗi nhất vì API trả về mã thông báo thành công nhưng trang đích từ chối mã đó.
Lỗi 1: Mã thông báo được chèn vào trường sai
Triệu chứng: Biểu mẫu được gửi nhưng trang trả về lỗi xác thực hoặc được làm mới.
Các trang quay vòng có thể mong đợi mã thông báo ở các trường khác nhau:
cf-turnstile-response- đầu vào ẩn Turnstile chínhg-recaptcha-response- một số trang sử dụng tính năng này làm dự phòng
Khắc phục: Kiểm tra biểu mẫu của trang cho cả hai trường. Trong tự động hóa trình duyệt:
# Selenium — inject into both fields for safety
driver.execute_script("""
var cfField = document.querySelector('[name="cf-turnstile-response"]');
var gField = document.querySelector('[name="g-recaptcha-response"]');
if (cfField) cfField.value = arguments[0];
if (gField) gField.value = arguments[0];
""", token)
Lỗi 2: Lệnh gọi lại không được kích hoạt
Triệu chứng: Mã thông báo có trong trường nhưng biểu mẫu vẫn chặn việc gửi.
Lý do: Trang sử dụng chức năng gọi lại thay vì (hoặc bổ sung) trường ẩn. Lệnh gọi lại xử lý logic bổ sung như bật nút gửi hoặc gửi yêu cầu AJAX.
Khắc phục: Tìm và gọi lại cuộc gọi:
// Check data-callback attribute
const callbackName = document.querySelector('.cf-turnstile').getAttribute('data-callback');
if (callbackName && window[callbackName]) {
window[callbackName](token);
}
// Or if it was passed in turnstile.render()
// You may need to intercept the render call to capture it
Lỗi 3: Ngữ cảnh trang chính xác sai
Triệu chứng: Mã thông báo bị từ chối mặc dù khóa trang web chính xác và giải pháp mới.
Lý do: pageurl được sử dụng trong yêu cầu API không khớp với ngữ cảnh thực tế của trang. Điều này đặc biệt phổ biến trên:
- Các trang thử thách Cloudflare — URL có thể bao gồm các tham số truy vấn hoặc các thành phần đường dẫn quan trọng
- Ứng dụng một trang — URL hiển thị có thể khác với URL đã tải tiện ích Turnstile
Khắc phục: Sử dụng tab Mạng DevTools để tìm URL chính xác mà tiện ích Turnstile tải từ đó. Sử dụng URL đó dưới dạng pageurl.
Thất bại 4: Tái sử dụng mã thông báo
Triệu chứng: Giải pháp đầu tiên thành công, những giải pháp tiếp theo thất bại.
Lý do: Mã thông báo quay vòng chỉ sử dụng một lần. Sau khi được máy chủ của Cloudflare xác minh, mã thông báo sẽ bị vô hiệu.
Khắc phục: Yêu cầu giải pháp mới cho mỗi lần gửi biểu mẫu. Không lưu vào bộ nhớ đệm hoặc sử dụng lại mã thông báo.
Tham khảo sửa lỗi nhanh
| Lỗi/Triệu chứng | sân khấu | Có khả năng gây ra | sửa chữa |
|---|---|---|---|
ERROR_WRONG_USER_KEY |
Gửi | Khóa API không đúng định dạng | Xác minh khóa 32 ký tự |
ERROR_KEY_DOES_NOT_EXIST |
Gửi | Khóa không hợp lệ | Kiểm tra trang tổng quan |
ERROR_ZERO_BALANCE |
Gửi | Không có chủ đề miễn phí | Chờ hoặc nâng cấp gói |
ERROR_PAGEURL |
Gửi | Thiếu pageurl |
Thêm URL đầy đủ |
ERROR_BAD_PARAMETERS |
Gửi | Thiếu khóa trang web, phương thức hoặc pageurl | Xác minh tất cả các trường bắt buộc |
CAPCHA_NOT_READY |
Thăm dò ý kiến | Đang giải quyết | Đợi 5 giây, thử lại |
ERROR_WRONG_ID_FORMAT |
Thăm dò ý kiến | ID hình ảnh xác thực không phải số | Sử dụng ID chính xác từ in.php |
ERROR_WRONG_CAPTCHA_ID |
Thăm dò ý kiến | ID hình ảnh xác thực không hợp lệ | Xác minh ID gửi |
ERROR_EMPTY_ACTION |
Thăm dò ý kiến | Thiếu action=get |
Thêm tham số hành động |
| Mã thông báo bị từ chối bởi trang | Xác thực | Trường sai, lệnh gọi lại không được kích hoạt, URL sai | Kiểm tra tên trường, gọi lại, xác minh pageurl chính xác |
| Giải quyết lần thứ hai thất bại | Xác thực | Tái sử dụng mã thông báo | Yêu cầu mã thông báo mới cho mỗi lần gửi |
Python: hoàn thành việc giải quyết Turnstile
import time
import requests
API_KEY = "YOUR_CAPTCHAAI_API_KEY"
SITEKEY = "0x4AAAAAAAB1example"
PAGE_URL = "https://staging.example.com/qa-login"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def solve_turnstile(api_key, sitekey, pageurl):
"""Submit a Turnstile challenge and return the solved token."""
# Submit
submit_resp = requests.post(
SUBMIT_URL,
data={
"key": api_key,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": pageurl,
"json": 1,
},
timeout=30,
)
submit_resp.raise_for_status()
submit_data = submit_resp.json()
if submit_data.get("status") != 1:
raise RuntimeError(f"Submit failed: {submit_data}")
captcha_id = submit_data["request"]
print(f"Task created — captcha ID: {captcha_id}")
# Wait before first poll (Turnstile is fast — 10 seconds is usually enough)
time.sleep(10)
# Poll for result
for _ in range(60):
result_resp = requests.get(
RESULT_URL,
params={
"key": api_key,
"action": "get",
"id": captcha_id,
"json": 1,
},
timeout=30,
)
result_resp.raise_for_status()
result_data = result_resp.json()
if result_data.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result_data.get("status") == 1:
return result_data["request"]
raise RuntimeError(f"Polling error: {result_data}")
raise TimeoutError("Turnstile solve timed out")
# Usage
token = solve_turnstile(API_KEY, SITEKEY, PAGE_URL)
print(f"Solved token: {token[:80]}...")
# Inject into cf-turnstile-response and/or g-recaptcha-response
# Then submit the form
Node.js: hoàn thành việc giải quyết Turnstile
const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const SITEKEY = "0x4AAAAAAAB1example";
const PAGE_URL = "https://staging.example.com/qa-login";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function solveTurnstile(apiKey, sitekey, pageurl) {
// Submit
const submitResp = await fetch(SUBMIT_URL, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: apiKey,
method: "turnstile",
sitekey: sitekey,
pageurl: pageurl,
json: "1",
}),
});
const submitData = await submitResp.json();
if (submitData.status !== 1) {
throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
}
const captchaId = submitData.request;
console.log(`Task created — captcha ID: ${captchaId}`);
// Turnstile is fast — wait 10 seconds before first poll
await sleep(10_000);
// Poll for result
for (let i = 0; i < 60; i++) {
const resultResp = await fetch(
`${RESULT_URL}?${new URLSearchParams({
key: apiKey,
action: "get",
id: captchaId,
json: "1",
})}`
);
const resultData = await resultResp.json();
if (resultData.request === "CAPCHA_NOT_READY") {
await sleep(5_000);
continue;
}
if (resultData.status === 1) {
return resultData.request;
}
throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
}
throw new Error("Turnstile solve timed out");
}
// Usage
solveTurnstile(API_KEY, SITEKEY, PAGE_URL)
.then((token) => {
console.log(`Solved token: ${token.slice(0, 80)}...`);
// Inject into cf-turnstile-response and/or g-recaptcha-response
})
.catch(console.error);
Turnstile vs Cloudflare Challenge: bạn đang đối mặt với cái nào?
| tín hiệu | cửa quay | Cloudflare Challenge |
|---|---|---|
| Những gì bạn thấy | Tiện ích được nhúng trên trang (hộp kiểm hoặc ẩn) | Màn hình xác minh Cloudflare toàn trang |
| ** CaptchaAI trả về những gì** | Mã thông báo để đưa vào biểu mẫu | Một cookie <staging-session-cookie> |
| Phương pháp API | turnstile |
cloudflare_challenge |
| Yêu cầu proxy? | Tùy chọn | Có (bắt buộc) |
Nếu bạn đang thực hiện thử thách Cloudflare toàn trang (không phải tiện ích được nhúng), bạn cần cóBộ giải Cloudflare Challengethay vào đó, nó trả về cookie <staging-session-cookie> và yêu cầu proxy.
Câu hỏi thường gặp
Tại sao Turnstile không thành công ngay cả khi yêu cầu có vẻ chính xác?
Ba nguyên nhân phổ biến nhất: (1) pageurl hơi sai — đặc biệt là trên các trang thử thách Cloudflare, (2) khóa trang web bị lấy từ thành phần sai hoặc (3) mã thông báo bị đưa vào sai trường hoặc đường dẫn gọi lại.
Lỗi Turnstile phổ biến nhất là gì?
Sử dụng URL trang chính xác sai. Mã thông báo quay vòng được liên kết chặt chẽ với ngữ cảnh trang — ngay cả một đường dẫn khác hoặc thiếu tham số truy vấn cũng có thể gây ra sự từ chối.
CAPCHA_NOT_READY có nghĩa là gì?
Việc giải quyết vẫn đang được tiến hành. Đợi 5 giây và thăm dò lại. Việc giải quyết bằng cửa xoay thường hoàn thành trong vòng chưa đầy 10 giây.
Tôi nên làm gì nếu API trả về mã thông báo nhưng trang vẫn từ chối?
- Xác minh
pageurlkhớp với trang chính xác nơi tiện ích tải. - Kiểm tra xem trang có mong đợi mã thông báo ở dạng
cf-turnstile-response,g-recaptcha-responsehay cả hai hay không. - Kiểm tra xem trang có sử dụng chức năng gọi lại thay vì (hoặc bổ sung) trường ẩn hay không.
- Đảm bảo mã thông báo chỉ được sử dụng một lần — Mã thông báo quay vòng chỉ sử dụng một lần.
CaptchaAI có hỗ trợ proxy cho Turnstile không?
Vâng. Thêm proxy và proxytype vào yêu cầu của bạn. Proxy là tùy chọn cho các tiện ích Turnstile độc lập nhưng được khuyến nghị trên các trang thử thách Cloudflare.
Sự khác biệt giữa Turnstile và Cloudflare Challenge là gì?
Turnstile là một tiện ích nhúng trả về mã thông báo. Cloudflare Challenge là xác minh toàn trang trả về cookie <staging-session-cookie>. Họ sử dụng các phương thức API khác nhau và các kiểu tích hợp khác nhau, mặc dù cả hai đều là sản phẩm của Cloudflare.
Sửa quy trình làm việc Turnstile của bạn
Nếu quá trình tích hợp Turnstile của bạn không thành công:
- Xác minh khóa trang web — Giải nén nó từ
data-sitekeyhoặcturnstile.render() - Xác minh pageurl — Sử dụng URL chính xác, bao gồm giao thức và đường dẫn
- Kiểm tra đường dẫn mã thông báo — Trang này có sử dụng
cf-turnstile-response,g-recaptcha-responsehoặc lệnh gọi lại không? - Sử dụng
json=1— Luôn sử dụng phản hồi JSON khi thăm dò kết quả Turnstile - Không sử dụng lại mã thông báo — Yêu cầu giải pháp mới cho mỗi lần gửi
Bắt đầu vớiBộ giải cửa quay CaptchaAI, xác minh các tham số của bạn dựa vàotài liệu API, và đọcCloudflare Turnstile hoạt động như thế nàonếu bạn cần kiến thức nền tảng về cơ chế phụ tùng.
Nhật ký lặp lại
| Lặp lại | Tập trung | Thay đổi |
|---|---|---|
| Dự thảo 1 | Cấu trúc và nội dung | Bản thảo khắc phục sự cố ban đầu - 3 giai đoạn lỗi, bảng lỗi cần sửa, Câu hỏi thường gặp |
| Dự thảo 2 | Độ chính xác kỹ thuật | Mã lỗi đã được xác minh, tham số Turnstile và đường dẫn mã thông báo dựa trên captchaai.com/api-docs. Đã thêm bảng tham số. Đã xác nhận method=turnstile và cả hai trường cf-turnstile-response / g-recaptcha-response. |
| Dự thảo 3 | Mã và độ sâu tiêm | Đã thêm các ví dụ giải quyết Python và Node.js. Đã thêm phương pháp trích xuất khóa trang web (3 cách tiếp cận). Đã thêm mã chèn Selenium cho cả hai trường mã thông báo. Đã thêm mã phát hiện cuộc gọi lại. |
| Dự thảo 4 | Nội dung khác biệt | Đã thêm bảng so sánh Turnstile và Cloudflare Challenge. Đã thêm ghi chú yêu cầu json=1 cho user_agent. Đã thêm kỹ thuật chặn hiển thị cho khóa trang động. |
| Dự thảo 5 | Đánh bóng QA cuối cùng | Đã xác minh tất cả các mã lỗi đều khớp với tài liệu chính thức. Đã thêm bảng tham khảo nhanh. Phần giới thiệu thắt chặt. Đã thêm cảnh báo mã thông báo sử dụng một lần. Đã xác nhận liên kết chéo tới các bài viết trong cụm. Các câu trả lời cho Câu hỏi thường gặp đã sẵn sàng cho lược đồ. |
Tóm tắt tài sản trực quan
Hình ảnh anh hùng
- Văn bản thay thế: Khắc phục sự cố của nhà phát triển đối với lỗi Cloudflare Turnstile — luồng yêu cầu, chèn mã thông báo và lỗi xác thực
- Phải hiển thị: Quy trình khắc phục sự cố kỹ thuật với các giai đoạn lỗi và đường dẫn khắc phục
- Tên tệp: cloudflare-turnstile-errors-troubleshooting-hero.png
Hình ảnh trong bài viết 1
- Vị trí: Sau "Lỗi ở giai đoạn kết quả"
- Loại: Cây quyết định
- Văn bản thay thế: Cây quyết định cho các lỗi Cloudflare Turnstile — lỗi yêu cầu, lỗi bỏ phiếu và từ chối trang
- Tên tệp: cloudflare-turnstile-error-decision-tree.png
Hình ảnh trong bài viết 2
- Vị trí: Sau "Lỗi xác thực trang đích"
- Loại: Sơ đồ nguyên nhân và cách khắc phục
- Văn bản thay thế: Sơ đồ hiển thị lý do mã thông báo Turnstile bị từ chối và cách khắc phục cho từng nguyên nhân
- Tên tệp: cloudflare-turnstile-validation-nguyên nhân-fixes.png