Trang bạn đang test trả về ERROR_CAPTCHA_UNSOLVABLE dù key và proxy đều đúng? Nhiều khả năng script đang gửi sai method — cloudflare_challenge cho trang thực ra dùng turnstile, hoặc ngược lại. Hai lớp bảo vệ này của Cloudflare khác nhau hoàn toàn: khác tham số gửi đi, khác dữ liệu trả về. Bài này chỉ ra dấu hiệu nhận biết từng loại, kèm script Python phát hiện tự động, để chọn đúng method ngay từ đầu.
Nhận diện nhanh: Challenge hay Turnstile?
| Tiêu chí | Cloudflare Challenge | Cloudflare Turnstile |
|---|---|---|
| Dạng hiển thị | Trang chờ toàn màn hình | Widget nhúng trong form |
| Giao diện | Chặn toàn bộ trang, hiện "Checking your browser" | Hộp kiểm nhỏ hoặc widget vô hình trong biểu mẫu |
| Method CaptchaAI | cloudflare_challenge |
turnstile |
| Kết quả trả về | Cookie qa_session_cookie |
Chuỗi token |
| Cần proxy | Có, bắt buộc | Khuyến nghị |
| Cần User-Agent | Có, bắt buộc | Không |
Đang thấy
ERROR_CAPTCHA_UNSOLVABLE? Bảng lỗi thường gặp ngay dưới đây chỉ đúng nguyên nhân.
Lỗi thường gặp khi chọn sai method
| Lỗi | Kết quả trả về | Cách khắc phục |
|---|---|---|
Gửi turnstile cho trang Challenge |
ERROR_CAPTCHA_UNSOLVABLE |
Đổi sang cloudflare_challenge |
Gửi cloudflare_challenge cho Turnstile |
Sai định dạng phản hồi | Đổi sang turnstile |
| Không kèm proxy khi giải Challenge | ERROR_PROXY_NOT_AUTHORIZED |
Thêm proxy — bắt buộc |
| Thiếu sitekey khi giải Turnstile | ERROR_BAD_PARAMETERS |
Trích xuất sitekey từ HTML của trang |
Chưa chắc lỗi nào là của bạn? Phần dấu hiệu bên dưới giúp xác định đúng loại.
Dấu hiệu nhận biết Cloudflare Challenge
Cloudflare Challenge là trang chờ toàn màn hình chặn quyền truy cập nội dung thật. Bạn thấy nó trước khi trang đích tải xong.
Dấu hiệu trực quan:
- Dòng chữ "Checking your browser before accessing..."
- Vòng xoay loading của Cloudflare
- Tiêu đề trang hiển thị "Just a moment..."
- URL không đổi, nhưng nội dung là trang trung gian của Cloudflare, không phải trang đích
Dấu hiệu trong HTML:
<!-- Cloudflare Challenge page indicators -->
<title>Just a moment...</title>
<div id="challenge-running">...</div>
<div class="cf-browser-verification">...</div>
Phát hiện bằng code:
import requests
resp = requests.get("https://example.com")
is_cf_challenge = (
resp.status_code == 403 and
"Just a moment" in resp.text or
"cf-browser-verification" in resp.text or
"challenge-platform" in resp.text
)
if is_cf_challenge:
print("Cloudflare Challenge detected — use method: cloudflare_challenge")
Status code 403 kèm một trong ba chuỗi trên gần như chắc chắn là Challenge — dùng method cloudflare_challenge.
Dấu hiệu nhận biết Cloudflare Turnstile
Turnstile là widget nhúng trong một trang đã tải xong, xuất hiện trong form giống reCAPTCHA, không chặn toàn trang.
Dấu hiệu trực quan:
- Widget nhỏ của Cloudflare nằm trong form (dạng checkbox)
- Phần còn lại của trang vẫn hiển thị bình thường
- Widget ghi "Verify you are human"
Dấu hiệu trong HTML:
<!-- Turnstile widget indicators -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAADnPIDROz1234"></div>
<!-- Or loaded via JavaScript -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js"></script>
Phát hiện bằng code:
import requests
resp = requests.get("https://staging.example.com/qa-login")
is_turnstile = (
"cf-turnstile" in resp.text or
"challenges.cloudflare.com/turnstile" in resp.text
)
if is_turnstile:
# Extract sitekey
if 'data-sitekey="' in resp.text:
start = resp.text.index('data-sitekey="') + 14
end = resp.text.index('"', start)
sitekey = resp.text[start:end]
print(f"Turnstile detected — sitekey: {sitekey}")
print("Use method: turnstile")
Script phát hiện tự động cả hai loại
Gộp hai kiểm tra trên vào một hàm để không phải đoán thủ công mỗi lần đổi trang:
def detect_cloudflare_type(url):
"""Detect which Cloudflare protection a URL uses."""
resp = requests.get(url, allow_redirects=True)
# Check for full-page Challenge
if resp.status_code in [403, 503]:
if any(marker in resp.text for marker in [
"Just a moment",
"cf-browser-verification",
"challenge-platform",
"challenge-running"
]):
return {"type": "cloudflare_challenge", "method": "cloudflare_challenge"}
# Check for embedded Turnstile
if "cf-turnstile" in resp.text or "challenges.cloudflare.com/turnstile" in resp.text:
sitekey = None
if 'data-sitekey="' in resp.text:
start = resp.text.index('data-sitekey="') + 14
end = resp.text.index('"', start)
sitekey = resp.text[start:end]
return {"type": "turnstile", "method": "turnstile", "sitekey": sitekey}
return {"type": "none", "method": None}
# Usage
result = detect_cloudflare_type("https://example.com")
print(f"Protection: {result['type']}")
print(f"CaptchaAI method: {result['method']}")
Gửi đúng method tới CaptchaAI
Tham số gửi tới in.php khác nhau đáng kể giữa hai method.
Cloudflare Challenge:
data = {
"key": "YOUR_API_KEY",
"method": "cloudflare_challenge",
"pageurl": "https://example.com",
"proxy": "host:port:user:pass", # MANDATORY
"proxytype": "HTTP", # MANDATORY
"userAgent": "Mozilla/5.0 ...", # MANDATORY
"json": 1
}
# Returns qa_session_cookie cookie — set it in your session
Cloudflare Turnstile:
data = {
"key": "YOUR_API_KEY",
"method": "turnstile",
"sitekey": "0x4AAAAAAADnPIDROz1234",
"pageurl": "https://staging.example.com/qa-login",
"json": 1
}
# Returns a token — inject into cf-turnstile-response field
Ví dụ thực tế: script cũ nhận nhầm loại bảo vệ
Một đội automation tại công ty outsourcing ở TP.HCM từng dính lỗi này khi theo dõi giá trên một sàn thương mại điện tử nội địa: script cũ chỉ xử lý Challenge, nhưng sau khi sàn nâng cấp bảo mật, trang đăng nhập đổi sang Turnstile và request liên tục trả ERROR_CAPTCHA_UNSOLVABLE. Chạy detect_cloudflare_type() trước mỗi lần deploy là cách rẻ nhất để tránh lặp lại.
Câu hỏi thường gặp
Làm sao phân biệt Cloudflare Challenge và Turnstile chỉ bằng mắt thường?
Trang bị chặn toàn bộ với dòng "Checking your browser" là Challenge; trang tải bình thường kèm widget nhỏ là Turnstile.
Một trang có thể dùng cả Cloudflare Challenge lẫn Turnstile không?
Có. Trang có thể bật Challenge lúc truy cập lần đầu và đặt Turnstile trong form đăng nhập — giải Challenge trước để lấy cookie qa_session_cookie, rồi giải tiếp Turnstile.
Vì sao giải Challenge bắt buộc proxy còn Turnstile thì không?
Cookie Challenge trả về gắn với địa chỉ IP cụ thể, nên CaptchaAI cần proxy của bạn để tạo cookie hợp lệ từ đúng IP. Token Turnstile không gắn IP nên không cần proxy.
Turnstile ở chế độ vô hình (invisible) có làm script phát hiện thất bại không?
Không. Dù widget ẩn với người dùng, <div class="cf-turnstile"> và script challenges.cloudflare.com/turnstile vẫn nằm trong HTML, nên detect_cloudflare_type() vẫn nhận diện được.
Giải CAPTCHA Cloudflare bằng CaptchaAI
CaptchaAI hỗ trợ đầy đủ cả cloudflare_challenge và turnstile tại captchaai.com.