Bạn đã giải được CAPTCHA của Turnstile và nhận được mã thông báo hợp lệ nhưng trang đích vẫn trả về 403 Bị cấm. Hướng dẫn này bao gồm mọi nguyên nhân.
Tại sao 403 sau mã thông báo hợp lệ
| nguyên nhân | Khả năng |
|---|---|
| Thiếu cookie |
Rất phổ biến |
| Mã thông báo đã hết hạn | chung |
| Điểm cuối gửi sai | chung |
| Thiếu tiêu đề yêu cầu | Trung bình |
| IP không khớp giữa giải quyết và gửi | Trung bình |
| Cloudflare Challenge (không phải cửa quay) | Đôi khi bối rối |
Nguyên nhân 1: Thiếu Cookie
Turnstile đặt cookie trong quá trình xác thực. Nếu bạn không đưa những cookie này vào yêu cầu tiếp theo của mình, Cloudflare sẽ chặn bạn.
import requests
session = requests.Session()
# Step 1: Load the page to get initial cookies
session.get("https://example.com")
# Step 2: Solve Turnstile
token = solve_turnstile(
api_key="YOUR_API_KEY",
sitekey="TURNSTILE_SITEKEY",
pageurl="https://example.com",
)
# Step 3: Submit token to the validation endpoint
# This sets <staging-session-cookie> cookie
resp = session.post("https://example.com/api/verify", data={
"cf-turnstile-response": token,
}, headers={
"Content-Type": "application/x-www-form-urlencoded",
"Origin": "https://example.com",
"Referer": "https://example.com/",
})
# Step 4: Now make your actual request WITH the session cookies
resp = session.get("https://example.com/protected-page")
print(resp.status_code) # Should be 200 now
Nguyên nhân 2: Token hết hạn
Mã thông báo quay vòng kéo dài ~300 giây nhưng hãy sử dụng chúng ngay lập tức để có kết quả tốt nhất.
import time
# Solve
start = time.time()
token = solve_turnstile(...)
solve_time = time.time() - start
# Check if token is still fresh
if solve_time > 240: # > 4 minutes is risky
print("Token may be too old, solving again...")
token = solve_turnstile(...)
# Submit immediately
submit_token(token)
Nguyên nhân 3: Phương thức gửi sai
Tìm cách trang web gửi mã thông báo Turnstile:
# Some sites use a hidden form field
data = {
"cf-turnstile-response": token,
"username": "user",
"password": "pass",
}
# Some sites use a custom header
headers = {
"X-Turnstile-Token": token,
}
# Some sites use JSON body
json_data = {
"turnstileToken": token,
"email": "user@example.com",
}
Cách tìm đúng tên trường:
- Mở trình duyệt DevTools → tab Mạng
- Hoàn thành thử thách Turnstile theo cách thủ công
- Tìm yêu cầu gửi biểu mẫu
- Nhìn vào nội dung yêu cầu để biết tên trường mã thông báo
Nguyên nhân 4: Thiếu tiêu đề
Cloudflare kiểm tra tính nhất quán của các tiêu đề yêu cầu:
headers = {
"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",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Origin": "https://example.com",
"Referer": "https://staging.example.com/qa-login",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-origin",
}
session.headers.update(headers)
Nguyên nhân 5: Cloudflare Challenge vs Turnstile
Cloudflare Turnstile và Cloudflare Challenge là các hệ thống khác nhau:
| tính năng | cửa quay | Cloudflare Challenge |
|---|---|---|
| Tiện ích | Hộp kiểm hiển thị trên trang | Màn hình thử thách toàn trang |
| Phương pháp CaptchaAI | turnstile |
cloudflare_challenge |
| Trường mã thông báo | cf-turnstile-response |
N/A (dựa trên cookie) |
Nếu bạn thấy thử thách toàn trang, hãy sử dụng method=cloudflare_challenge để thay thế.
Hoàn thành ví dụ làm việc
import requests
import time
import re
def solve_turnstile_and_access(target_url, api_key):
"""Complete flow: solve Turnstile and access protected page."""
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
})
# Load page, get cookies and sitekey
resp = session.get(target_url)
match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if not match:
raise RuntimeError("Turnstile sitekey not found")
sitekey = match.group(1)
# Solve via CaptchaAI
submit_resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": "turnstile",
"sitekey": sitekey,
"pageurl": target_url,
"json": 1,
}, timeout=30)
task_id = submit_resp.json()["request"]
# Poll
for _ in range(12):
time.sleep(5)
poll = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = poll.json()
if data.get("status") == 1:
token = data["request"]
break
else:
raise TimeoutError("Solve timeout")
# Submit token using the same session
form_resp = session.post(target_url, data={
"cf-turnstile-response": token,
}, headers={
"Origin": f"https://{requests.utils.urlparse(target_url).netloc}",
"Referer": target_url,
})
return session, form_resp
# Usage
session, resp = solve_turnstile_and_access(
"https://staging.example.com/qa-login",
"YOUR_API_KEY",
)
# session now has valid cookies for subsequent requests
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| 403 mặc dù mã thông báo hợp lệ | Thiếu cookie phiên | Sử dụng cùng một phiên cho tất cả các yêu cầu |
| 403 ở các trang tiếp theo | Xác thực mã thông báo phải trả lại cookie | |
| Hoạt động một lần, sau đó 403 | Cookie đã hết hạn | Giải quyết lại cho cookie mới |
| Luôn luôn 403 | Thử thách toàn trang, không phải Cloudflare Turnstile | Sử dụng phương pháp cloudflare_challenge |
Câu hỏi thường gặp
kéo dài bao lâu?
Thông thường là 30 phút đến 24 giờ. Nếu các yêu cầu tiếp theo bắt đầu thất bại, hãy giải quyết lại Cloudflare Turnstile.
Tôi có cần proxy cho Turnstile không?
Thường là không - Tỷ lệ thành công 100% của CaptchaAI trên Turnstile thường hoạt động mà không cần proxy. Chỉ thêm proxy nếu trang web kiểm tra tính nhất quán của IP.
Tôi có thể chuyển sang phiên khác không?
Có, nhưng nó được liên kết với Tác nhân người dùng và có thể được liên kết với IP. Giữ cả hai nhất quán.
Hướng dẫn liên quan
Sửa lỗi 403 —giải quyết Turnstile với CaptchaAI.