Script của bạn vừa gặp trang "Verify you are human" hoặc bị trả về 403? Bạn đang đối mặt với một trong hai lớp bảo vệ khác nhau của Cloudflare: Bot Management — chấm điểm bot ở cấp mạng, chỉ có ở gói Doanh nghiệp — hoặc Turnstile — tiện ích CAPTCHA miễn phí mà trang nào cũng nhúng được. Nhầm lẫn hai thứ này khiến automation "chữa sai bệnh": cố giải CAPTCHA trong khi request đã bị chặn ở WAF, hoặc dựng proxy/TLS tốn công trong khi chỉ cần gọi API giải Turnstile.
Bài này giúp bạn phân biệt nhanh và biết chính xác nên xử lý ở đâu.
Quy tắc nhanh: thấy widget nhỏ trên form → đó là Turnstile, gọi CaptchaAI là xong. Thấy
403hoặc trang "Checking your browser" trước khi tới được form → đó là Bot Management, CaptchaAI chỉ giải được phần CAPTCHA bên trong, không giải được phần chặn cấp mạng.
So sánh nhanh
| Tiêu chí | Bot Management | Turnstile |
|---|---|---|
| Bản chất | Nền tảng chống bot cấp doanh nghiệp | Tiện ích CAPTCHA miễn phí |
| Chi phí | Nằm trong gói Enterprise ($$$) | Miễn phí cho mọi gói |
| Cách triển khai | Cấp mạng (qua proxy Cloudflare) | Widget JavaScript nhúng trên trang |
| Phạm vi kiểm tra | Toàn bộ request tới domain | Một hành động cụ thể (submit form...) |
| Điểm bot | 1–99 (theo từng request) | Pass/fail (theo từng lượt) |
| CaptchaAI hỗ trợ | Qua method Turnstile/Challenge | Có, tỷ lệ giải thành công cao |
Ngoài bảng trên, còn vài khác biệt đáng chú ý:
- DNS: Bot Management cần domain trỏ qua Cloudflare; Turnstile dùng được trên mọi site.
- Thử thách hiển thị: Bot Management thỉnh thoảng hiện managed challenge; Turnstile đa số vô hình.
- JavaScript challenge: Bot Management là trang chờ ~5 giây; Turnstile là proof-of-work chạy ngầm.
- Rate limiting: chỉ Bot Management có sẵn.
Cloudflare Bot Management hoạt động ra sao
Bot Management nằm trong gói Enterprise của Cloudflare. Nó chạy ở cấp mạng — mọi request tới domain đều được đánh giá trước khi chạm tới origin server, kể cả khi request đó không hề đụng tới CAPTCHA.
Luồng xử lý
Request arrives at Cloudflare edge
↓
Bot Management engine evaluates:
├─ Machine learning model (behavioral fingerprint)
├─ Heuristics (known bot patterns)
├─ JavaScript fingerprinting (if JS challenge triggered)
├─ JA3/JA4 TLS fingerprint
├─ HTTP header analysis
└─ IP reputation (Cloudflare sees ~20% of internet traffic)
↓
Bot score assigned: 1 (definitely bot) to 99 (definitely human)
↓
WAF rules act on the score:
- Score > 50 → Allow
- Score 30-50 → Managed challenge
- Score < 30 → Block or JavaScript challenge
Các thành phần chính
Bot Management gồm bảy mảnh ghép, chạy song song trên mỗi request:
- Bot Score — điểm dựa trên ML cho từng request.
- Managed Challenge — tự chọn hiển thị JS challenge hay Turnstile.
- Super Bot Fight Mode — bản rút gọn cho các gói Cloudflare Pro/Business.
- Bot Analytics — dashboard theo dõi traffic bot và người dùng thật.
- WAF Custom Rules — rule kích hoạt theo ngưỡng điểm bot.
- Rate Limiting — ngưỡng tần suất request theo IP/session.
- JavaScript Detection — phát hiện trình duyệt headless và công cụ automation.
Automation sẽ gặp gì
Khi trang đích bật Bot Management, request tự động có thể nhận một trong bốn kết quả — không theo thứ tự cố định, tùy vào điểm bot mà request đó nhận được:
- Chặn thẳng (403) — điểm bot quá thấp, rule WAF chặn ngay.
- Trang JavaScript challenge — "Checking your browser" kéo dài khoảng 5 giây.
- Managed challenge — hiện widget Turnstile hoặc JS challenge.
- Qua vô hình — request được cho phép vì điểm bot đủ cao.
Cloudflare Turnstile hoạt động ra sao
Định nghĩa ngắn: Turnstile là widget CAPTCHA độc lập, thay thế CAPTCHA truyền thống, chạy tách biệt với Bot Management và dùng được trên bất kỳ site nào — không cần domain đang trỏ qua Cloudflare.
Luồng xử lý
Page loads Turnstile widget
↓
Widget runs background checks:
├─ Browser proof-of-work challenge (cryptographic puzzle)
├─ Private Access Token (Apple devices)
├─ Browser environment validation
└─ Cloudflare threat intelligence
↓
Result: cf-turnstile-response token generated
↓
Token submitted with form data
↓
Server validates token via Cloudflare API (siteverify)
3 chế độ hiển thị
- Managed — Cloudflare tự quyết định ẩn hay hiện tương tác. Dùng mặc định, nên chọn chế độ này trừ khi có lý do khác.
- Non-interactive — luôn ẩn, chỉ chạy proof-of-work. Phù hợp cho form cần ít ma sát.
- Invisible — không hiện widget, chạy ngay khi trang load. Dùng cho xác minh nền.
Chọn chế độ nào cho automation?
Với script tự động hóa, chế độ widget không ảnh hưởng tới cách CaptchaAI giải — cả ba đều trả về cùng một cf-turnstile-response token khi hoàn tất. Điều bạn cần quan tâm là sitekey hiển thị trong HTML, không phải chế độ.
Nhúng vào trang
<!-- Simple Turnstile integration -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
data-sitekey là giá trị bạn cần trích xuất khi tự động hóa gọi CaptchaAI:
- Có thể lấy từ HTML tĩnh (
view-sourcehoặcrequests.get(...).text) nếu trang không dựng bằng JS. - Nếu trang render bằng JavaScript, cần Playwright/Selenium để đọc DOM sau khi render rồi mới lấy được
data-sitekey.
Giải Bot Management và Turnstile bằng CaptchaAI
Turnstile — chỉ cần sitekey
Turnstile được giải qua method turnstile của CaptchaAI, với tỷ lệ giải thành công cao:
import requests
import time
API_KEY = "YOUR_API_KEY"
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x4AAAAAAAC3DHQhMMQ_Rxrg",
"pageurl": "https://example.com/signup",
"json": 1,
})
task_id = submit.json()["request"]
for _ in range(60):
time.sleep(5)
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"]
print(f"Turnstile token: {token[:50]}...")
break
Ví dụ thực tế: các đội QA outsourcing ở TP.HCM/Hà Nội theo dõi giá công khai trên Shopee, Tiki, Lazada thường chỉ cần đoạn code trên khi trang đích bật Turnstile đơn thuần. Nếu trang dùng Bot Management, request có thể bị chặn 403 trước khi Turnstile kịp xuất hiện — lúc đó vấn đề nằm ở header/TLS, không phải ở CAPTCHA.
Thử thách từ Bot Management
Bot Management dùng nhiều lớp phòng thủ cùng lúc. Thành phần CAPTCHA (nếu có) thường là Managed Challenge, hiển thị dưới dạng Turnstile.
Trước khi gọi CaptchaAI
Kiểm tra ba điều sau trên response trước khi tốn credit gọi API giải:
- Status code có phải
403không — nếu có, đó là chặn cứng, không phải CAPTCHA. - HTML có chứa
cf-turnstilehoặcchallenges.cloudflare.comkhông — nếu có, mới cần giải Turnstile. - Response có
jschlkhông — nếu có, đó là JS challenge của Bot Management, không giải qua methodturnstile.
Chỉ khi xác nhận đúng là widget Turnstile mới nên chạy đoạn code dưới:
# Bot Management flow for automation:
# 1. Make initial request
response = requests.get("https://protected-site.com/api/data")
# 2. Check if challenged
if response.status_code == 403:
# Hard block — need to adjust headers, proxy, or approach
pass
elif "challenge" in response.text.lower() or response.status_code == 503:
# JavaScript challenge or managed challenge
# If it contains a Turnstile widget, solve it:
if "cf-turnstile" in response.text or "challenges.cloudflare.com" in response.text:
# Extract sitekey and solve via CaptchaAI
sitekey = extract_turnstile_sitekey(response.text)
token = solve_turnstile(sitekey, "https://protected-site.com/api/data")
Trang Cloudflare Challenge không phải Turnstile
Trang "Checking your browser" KHÔNG phải widget Turnstile. CaptchaAI xử lý riêng qua method cloudflare_challenge:
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "cloudflare_challenge",
"sitekey": "managed",
"pageurl": "https://protected-site.com/login",
"json": 1,
})
Cách nhận biết bạn đang gặp cái nào
Đối chiếu những gì bạn thấy trên màn hình/response với năm dấu hiệu sau:
- Trang "Checking your browser" trong ~5 giây → Bot Management (JS challenge). Dấu hiệu:
cf-chl-bypass,jschl_vctrong HTML. - Widget CAPTCHA nhỏ trên form → Turnstile (độc lập). Dấu hiệu: class
cf-turnstile, scriptchallenges.cloudflare.com/turnstile. 403 Forbiddenkèm trang lỗi Cloudflare → Bot Management (chặn cứng). Dấu hiệu: headercf-ray, template lỗi mặc định của Cloudflare.- Checkbox tương tác trên trang Cloudflare → Managed challenge (Bot Mgmt). Dấu hiệu: domain
challenges.cloudflare.com. - Không thấy thử thách nào nhưng đã có cookie
cf→ Bot Management (đã qua). Dấu hiệu: cookieqa_session_cookie.
Một site có thể khớp nhiều dấu hiệu cùng lúc
Đừng dừng ở dấu hiệu đầu tiên tìm thấy — kiểm tra hết cả 5 rồi mới quyết định hướng xử lý, vì Bot Management và Turnstile có thể xuất hiện đồng thời trên cùng một luồng request.
Code nhận diện tự động
import requests
def identify_cloudflare_protection(url):
"""Identify which Cloudflare protection a URL uses."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0",
}
response = requests.get(url, headers=headers, timeout=15, allow_redirects=False)
html = response.text
result = {
"cloudflare_protected": "cf-ray" in response.headers.get("cf-ray", "")
or "cloudflare" in response.headers.get("server", "").lower(),
"bot_management_challenge": False,
"turnstile_widget": False,
"hard_block": False,
"passed": False,
}
if response.status_code == 403:
result["hard_block"] = True
elif response.status_code == 503 and "jschl" in html:
result["bot_management_challenge"] = True
elif "cf-turnstile" in html:
result["turnstile_widget"] = True
elif response.status_code == 200:
result["passed"] = True
return result
Câu hỏi thường gặp
Turnstile có phải là CAPTCHA truyền thống không?
Không hẳn. Turnstile không bắt người dùng chọn ảnh xe buýt hay gõ ký tự méo mó. Về mặt kỹ thuật đây vẫn là một CAPTCHA (xác minh người/máy), chỉ khác ở trải nghiệm:
- Không có bước tương tác thủ công trong đa số trường hợp.
- Chạy proof-of-work và các phép kiểm tra ngầm trong trình duyệt.
Một trang có thể dùng cả Bot Management lẫn Turnstile không?
Có. Bot Management chạy ở cấp mạng cho toàn bộ request, còn Turnstile có thể được thêm như một widget trên trang cụ thể. Ví dụ site chặn bot rõ ràng ở edge bằng Bot Management, rồi vẫn thêm Turnstile trên form đăng nhập/đăng ký để xác minh thêm một lớp.
Cloudflare Challenge và Turnstile khác nhau ở đâu?
Cloudflare Challenge là trang "Checking your browser" chạy JS challenge thuần, không có widget CAPTCHA nào để tương tác. Turnstile là một widget riêng, có cf-turnstile-response token sau khi vượt qua. Hai thứ dùng hai method khác nhau trên CaptchaAI:
cloudflare_challenge— cho trang "Checking your browser".turnstile— cho widget Turnstile độc lập.
Giải Turnstile qua CaptchaAI tốn khoảng bao nhiêu?
CaptchaAI tính phí theo thread chứ không theo từng lượt giải, ví dụ:
- Gói BASIC ($15/tháng, 5 thread) đã đủ cho khối lượng vừa.
- Mỗi thread giải không giới hạn số lượt trong tháng.
- Turnstile thường xử lý xong trong vài giây nên một thread có thể xử lý được rất nhiều request mỗi ngày.
CaptchaAI giải được cả hai loại không?
CaptchaAI giải widget Turnstile (tỷ lệ giải thành công cao) và trang Cloudflare Challenge. Bot Management thì tách phần:
- CaptchaAI đảm nhiệm phần thử thách CAPTCHA bên trong (Managed Challenge dạng Turnstile).
- Phần chặn cấp mạng (response
403) cần hạ tầng phía bạn — header hợp lý, TLS phù hợp, proxy — nằm ngoài phạm vi của CaptchaAI.
Tóm tắt
Cloudflare Bot Management là lớp phòng thủ cấp mạng dành cho gói Doanh nghiệp, đánh giá mọi request bằng điểm ML, rule WAF và phân tích hành vi. Cloudflare Turnstile là widget CAPTCHA miễn phí xác minh người dùng qua proof-of-work của trình duyệt.
Ba điều cần nhớ khi lên kế hoạch automation:
- Turnstile giải trực tiếp bằng CaptchaAI với tỷ lệ giải thành công cao — chỉ cần
sitekeyvàpageurl. - Bot Management yêu cầu mô phỏng trình duyệt đúng cách (header, TLS) trước, CaptchaAI chỉ xử lý phần CAPTCHA phát sinh bên trong.
- Hai lớp bảo vệ có thể chạy đồng thời trên cùng một trang, nên script cần xử lý cả hai kịch bản.