Khắc Phục Sự Cố

Vòng thử thách Cloudflare: Tại sao các thử thách cứ lặp đi lặp lại

Bạn gửi request tới CaptchaAI, nhận cookie qa_session_cookie, gắn vào session — nhưng vài request sau, Cloudflare lại đẩy ra đúng trang thử thách đó. Nguyên nhân gần như luôn nằm ở một chỗ: cookie bị ràng buộc chặt với IP proxy, User-Agentdomain tại thời điểm giải; lệch một trong ba là Cloudflare từ chối cookie ngay, bất kể cookie còn hạn hay không. Dưới đây là 5 nguyên nhân, xếp theo tần suất gặp thực tế trong các ticket hỗ trợ, kèm code sửa cho từng trường hợp.


Tổng quan nhanh: 5 nguyên nhân gây vòng lặp Cloudflare Challenge

Trước khi đọc chi tiết, đối chiếu nhanh dấu hiệu của bạn với bảng dưới đây để khoanh vùng đúng nguyên nhân:

Nguyên nhân Dấu hiệu nhận biết Cách sửa nhanh
User-Agent không khớp Loop xảy ra ngay lần request đầu tiên Đồng bộ User-Agent giữa request giải và request duyệt
Proxy đổi IP Loop xảy ra ngẫu nhiên, không theo mẫu cố định Ghim (pin) một IP cố định cho cả phiên
Cookie sai domain Cookie có trong session nhưng vẫn bị từ chối Set cookie với dấu chấm đầu domain (.example.com)
Cookie hết hạn Loop xuất hiện sau 15–30 phút chạy ổn định Theo dõi tuổi cookie, giải lại trước khi hết hạn
TLS fingerprint lộ Loop dù IP/User-Agent/domain đều khớp Dùng curl_cffi hoặc tls-client thay vì requests thuần

Cookie này không phải một token dùng vĩnh viễn — nó được cấp riêng cho một tổ hợp cụ thể tại thời điểm giải:

  • IP proxy dùng để giải thử thách
  • User-Agent gửi kèm request giải
  • Domain của trang đích

Chỉ cần request duyệt tiếp theo lệch một trong ba yếu tố này, Cloudflare coi phiên là chưa xác thực và hiển thị lại thử thách ngay lập tức.


Chi tiết 5 nguyên nhân và cách khắc phục từng trường hợp

Nguyên nhân #1: User-Agent lúc giải và lúc duyệt không khớp

Nguyên nhân phổ biến nhất trong các ticket hỗ trợ. User-Agent gửi cho CaptchaAI phải giống hệt, từng ký tự, với User-Agent trong request duyệt tiếp theo.

import requests

USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"

# Step 1: Solve with the SAME User-Agent
solve_data = {
    "key": "YOUR_API_KEY",
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com",
    "proxy": "host:port:user:pass",
    "proxytype": "HTTP",
    "userAgent": USER_AGENT,  # Must match step 2
    "json": 1
}
submit = requests.post("https://ocr.captchaai.com/in.php", data=solve_data).json()

# ... poll for result ...

# Step 2: Use the SAME User-Agent in subsequent requests
session = requests.Session()
session.headers["User-Agent"] = USER_AGENT  # Must match step 1
session.cookies.set("qa_session_cookie", cf_clearance_value, domain=".example.com")
resp = session.get("https://example.com")

Nguyên nhân #2: Proxy đổi IP giữa bước giải và bước request

Cookie qa_session_cookie được cấp cho đúng IP đã giải thử thách. Đổi sang IP khác ở request kế tiếp là cookie bị từ chối ngay.

PROXY = "host:port:user:pass"

# Solve with this proxy
solve_data = {
    "key": "YOUR_API_KEY",
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com",
    "proxy": PROXY,
    "proxytype": "HTTP",
    "userAgent": USER_AGENT,
    "json": 1
}

# Use the SAME proxy for subsequent requests
session.proxies = {
    "http": f"http://user:pass@host:port",
    "https": f"http://user:pass@host:port"
}

Lưu ý: nếu pool proxy của bạn đổi IP liên tục giữa các request, hãy ghim (pin) về một phiên cố định cho luồng đang giải Cloudflare Challenge — IP phải giữ nguyên từ lúc giải đến lúc duyệt.


Cookie qa_session_cookie phải được set trên đúng domain, kèm dấu chấm đầu để phủ cả subdomain.

# WRONG — setting on wrong domain
session.cookies.set("qa_session_cookie", value, domain="example.com")

# CORRECT — include the dot prefix for subdomain coverage
session.cookies.set("qa_session_cookie", value, domain=".example.com")

# Or set all cookies returned by CaptchaAI
for cookie_str in result.get("cookies", "").split(";"):
    if "qa_session_cookie" in cookie_str:
        name, val = cookie_str.strip().split("=", 1)
        session.cookies.set(name.strip(), val.strip(), domain=".example.com")

Cookie qa_session_cookie sống trong thời gian giới hạn — phổ biến là 15–30 phút tùy trang. Hết hạn là Cloudflare hiển thị lại thử thách, dù IP/User-Agent/domain vẫn khớp.

Cách sửa: theo dõi tuổi cookie, chủ động giải lại trước khi hết hạn thay vì chờ request thất bại.

import time

last_solve_time = None
COOKIE_TTL = 900  # 15 minutes

def get_cf_clearance():
    global last_solve_time
    if last_solve_time and (time.time() - last_solve_time) < COOKIE_TTL:
        return  # Cookie still valid

    # Solve again
    qa_session_cookie = solve_cloudflare_challenge()
    session.cookies.set("qa_session_cookie", qa_session_cookie, domain=".example.com")
    last_solve_time = time.time()

Nguyên nhân #5: Dấu vân tay TLS lộ ra thư viện không phải trình duyệt thật

Cloudflare còn kiểm tra dấu vân tay TLS (TLS fingerprint). Thư viện requests của Python có dấu vân tay khác hẳn Chrome, nên một số trang từ chối request dù cookie qa_session_cookie còn hợp lệ.

Cách sửa: dùng curl_cffi hoặc tls-client để giả lập dấu vân tay giống trình duyệt thật.

pip install curl_cffi
from curl_cffi import requests as curl_requests

session = curl_requests.Session(impersonate="chrome120")
session.cookies.set("qa_session_cookie", value, domain=".example.com")
resp = session.get("https://example.com")

Checklist chẩn đoán vòng lặp Cloudflare Challenge theo đúng thứ tự

Đi từ trên xuống, dừng ở bước đầu tiên phát hiện sai lệch — phần lớn trường hợp dừng ngay ở bước 1 hoặc 2:

Challenge keeps repeating
    ↓
User-Agent in solve request matches browsing request? → No → Sync User-Agent
    ↓ Yes
Same proxy IP for solve and browse? → No → Pin proxy IP (sticky session)
    ↓ Yes
Cookie set on correct domain (.example.com)? → No → Fix domain
    ↓ Yes
Cookie less than 15 minutes old? → No → Re-solve the challenge
    ↓ Yes
TLS fingerprint matches a browser? → No → Use curl_cffi or tls-client
    ↓ Yes
Site may have additional bot detection → Use headless browser instead

Ví dụ thực tế: đội theo dõi giá Shopee/Tiki gặp vòng lặp vì pool proxy đổi IP liên tục

Một đội QA/data tại công ty outsourcing ở TP.HCM chạy pipeline theo dõi giá đối thủ trên các sàn được Cloudflare bảo vệ. Ban đầu họ dùng pool proxy đổi IP ngẫu nhiên cho mọi request, kể cả request giải lẫn request duyệt sau đó — tỷ lệ gặp lại thử thách cao bất thường dù log cho thấy cookie vẫn còn hạn. Đúng là Nguyên nhân #2.

Cách sửa: ghim một IP cố định cho mỗi luồng đang giữ cookie qa_session_cookie còn hiệu lực, thay vì để pool đổi IP giữa các request cùng luồng. Với gói BASIC ($15/tháng, 5 thread) của CaptchaAI, mỗi trong 5 thread nên gắn đúng một proxy suốt vòng đời phiên.


Câu hỏi thường gặp

Vì sao pool proxy đổi IP liên tục hay gây ra vòng lặp Cloudflare Challenge?

Vì mỗi lần proxy đổi IP, IP mới không khớp với IP đã giải thử thách, nên Cloudflare coi đây là phiên chưa xác thực và hiển thị lại thử thách. Ghim IP cố định cho từng luồng đang giữ cookie là cách sửa trực tiếp.

Thường 15–30 phút, tùy chính sách từng trang. Nên chủ động giải lại trước khi hết hạn thay vì đợi Cloudflare từ chối request.

CaptchaAI có giải được Cloudflare Challenge không?

Có — Cloudflare Challenge là loại CaptchaAI hỗ trợ chính thức (method cloudflare_challenge), cùng Cloudflare Turnstile, reCAPTCHA v2/v3, GeeTest v3 và CAPTCHA hình ảnh.

Nên chọn gói CaptchaAI nào để chạy nhiều phiên Cloudflare Challenge song song?

Tùy số luồng cần chạy đồng thời: BASIC ($15/tháng, 5 thread) đủ cho pipeline nhỏ; chạy hàng chục phiên song song thì ADVANCE ($90/tháng, 50 thread) hoặc PREMIUM ($170/tháng, 100 thread) phù hợp hơn. Mỗi thread giải không giới hạn số lượt trong tháng.


Giải Cloudflare Challenge ổn định với CaptchaAI

Phá vỡ vòng lặp thử thách tại captchaai.com.


Hướng dẫn liên quan

Os comentários estão desativados para este artigo.