
Anh Tuan
Data Science Expert

AntiCloudflareTask với URL đích chính xác và proxy tĩnh hoặc dính; duy trì cùng một trình duyệt Chrome được hỗ trợ.cf_clearance, cookie, token, thông tin xác thực proxy và HTML thô là bí mật có thời hạn, không được đưa vào nhật ký hoặc phân tích.Chẩn đoán xác minh Cloudflare nên bắt đầu bằng phân loại trạng thái và xác định phiên, không phải tạo nhiệm vụ lặp lại. Một trang được bảo vệ có thể hiển thị trang xác minh trung gian, widget Turnstile, phản hồi HTTP 429, chặn cứng, màn hình xác thực, lỗi gốc hoặc trang ứng dụng bình thường. Mỗi trạng thái cần hành động khác nhau. Đối với trang xác minh được hỗ trợ, CapSolver tài liệu AntiCloudflareTask với URL đích chính xác, proxy tĩnh hoặc dính, và trình duyệt Chrome nhất quán; một số trang cũng cần HTML xác minh mới từ cùng phiên đó. Dữ liệu làm sạch được trả về phải được áp dụng cho cùng một danh tính yêu cầu và được kiểm tra với trang đích mong muốn. Hướng dẫn này trình bày triển khai chung mà không liên kết thiết kế với ngành, trường hợp sử dụng hoặc khung tác vụ.
Cloudflare mô tả Challenges là các cơ chế bảo mật đánh giá tín hiệu trình duyệt và phía client, có thể yêu cầu tương tác tối thiểu của người dùng. Danh mục rộng này không nên nhầm lẫn với mọi phản hồi bị chặn hoặc không hoàn chỉnh.
Một quy trình chẩn đoán nên trả lời bốn câu hỏi theo thứ tự:
Bài viết blog của CapSolver về Cloudflare https://www.capsolver.com/blog/cloudflare chứa tài liệu sản phẩm và triển khai liên quan, trong khi FAQ giải quyết CAPTCHA của CapSolver https://www.capsolver.com/faq/captcha-solving giải thích chu kỳ nhiệm vụ tổng thể.
| Trạng thái | Bằng chứng điển hình | Hành động tiếp theo đúng |
|---|---|---|
| Trang mong muốn | Tiêu đề biết trước, đường dẫn, bộ chọn ngữ nghĩa hoặc lược đồ phản hồi | Phân tích hoặc tiếp tục |
| Trang xác minh Cloudflare | “Just a moment…”, mã xác minh, các dấu hiệu Cloudflare | Xác minh phạm vi và xem xét AntiCloudflareTask |
| Widget Turnstile | Mã Turnstile, khóa trang, khung widget | Sử dụng quy trình nhiệm vụ Turnstile được tài liệu hóa |
| Giới hạn tốc độ | HTTP 429, Retry-After, phản hồi giới hạn |
Chờ và giảm tốc độ yêu cầu |
| Yêu cầu xác thực | Mẫu đăng nhập, 401, trạng thái phiên hết hạn | Xác thực qua luồng được phê duyệt |
| Chặn cứng | 403 liên tục mà không có bằng chứng xác minh được hỗ trợ | Dừng và xem xét chính sách truy cập hoặc danh tính mạng |
| Lỗi gốc hoặc mạng | 5xx, DNS, TLS, thời gian hết hạn | Sửa cơ sở hạ tầng; không tạo nhiệm vụ xác minh |
| Trang không xác định | Bố cục hoặc ngữ nghĩa không khớp với các trạng thái đã biết | Lưu chẩn đoán bị che khuất và yêu cầu xem xét |
Một dịch vụ xác minh không bao giờ nên được sử dụng như phản hồi chung cho mọi trang 403 hoặc trang trống.
from dataclasses import dataclass
@dataclass(frozen=True)
class HttpObservation:
url: str
status_code: int
title: str
html: str
headers: dict[str, str]
def classify_observation(obs: HttpObservation) -> str:
title = obs.title.lower()
html = obs.html.lower()
if obs.status_code == 429:
return "RATE_LIMIT"
if obs.status_code >= 500:
return "ORIGIN_OR_NETWORK_ERROR"
if "challenges.cloudflare.com/turnstile" in html:
return "TURNSTILE_WIDGET"
challenge_markers = (
"just a moment" in title
or "challenge-platform" in html
or "cf-chl-" in html
)
if challenge_markers:
return "CLOUDFLARE_CHALLENGE"
if 'type="password"' in html or obs.status_code == 401:
return "AUTH_REQUIRED"
if obs.status_code == 200 and 'data-page="expected"' in html:
return "EXPECTED_PAGE"
if obs.status_code == 403:
return "HARD_BLOCK"
return "UNKNOWN_PAGE"
Sử dụng các chỉ báo thành công đặc trưng cho mục tiêu. Một HTTP 200 chung không đủ vì các trang xác minh, lỗi và đồng ý cũng có thể trả về 200.
FAQ lỗi của CapSolver hữu ích để tách biệt lỗi nhà cung cấp khỏi lỗi trạng thái trang.
Xác minh Cloudflare liên quan đến bối cảnh người truy cập và thiết bị. Tài liệu clearance của Cloudflare nêu rõ rằng cf_clearance liên quan đến người truy cập và thiết bị cụ thể và có thể được đánh giá lại khi hành vi phiên thay đổi.
Biểu diễn danh tính yêu cầu một cách rõ ràng:
from dataclasses import dataclass
@dataclass(frozen=True)
class SessionIdentity:
session_id: str
proxy_profile: str
chrome_user_agent: str
tls_profile: str
cookie_jar_id: str
target_host: str
Bộ dữ liệu này nên ổn định từ quan sát ban đầu qua thực hiện nhiệm vụ và xác minh trang đích.
from dataclasses import dataclass
from urllib.parse import urlparse
@dataclass(frozen=True)
class TargetPolicy:
target_id: str
hostname: str
allowed_path_prefixes: tuple[str, ...]
purpose: str
proxy_profile: str
max_attempts: int = 1
TARGETS = {
"docs_demo": TargetPolicy(
target_id="docs_demo",
hostname="approved.example.com",
allowed_path_prefixes=("/public/", "/test/"),
purpose="kiểm tra tích hợp được cấp phép",
proxy_profile="approved_static_us",
)
}
def resolve_target(target_id: str, url: str) -> TargetPolicy:
policy = TARGETS.get(target_id)
if policy is None:
raise PermissionError("Mục tiêu không xác định")
parsed = urlparse(url)
if parsed.scheme != "https":
raise PermissionError("HTTPS là bắt buộc")
if parsed.hostname != policy.hostname:
raise PermissionError("Tên miền nằm ngoài phạm vi được phê duyệt")
if not any(parsed.path.startswith(p) for p in policy.allowed_path_prefixes):
raise PermissionError("Đường dẫn nằm ngoài phạm vi được phê duyệt")
return policy
Không để người gọi không đáng tin cậy cung cấp URL, proxy hoặc mục đích tùy ý.
AntiCloudflareTaskTài liệu Challenges Cloudflare của CapSolver định nghĩa AntiCloudflareTask.
| Trường | Bắt buộc | Quy tắc chẩn đoán |
|---|---|---|
type |
Có | Phải là AntiCloudflareTask |
websiteURL |
Có | Trang đích được phê duyệt chính xác |
proxy |
Có | Proxy tĩnh hoặc dính được sử dụng cho phiên |
userAgent |
Tùy chọn | Trình duyệt Chrome được hỗ trợ giống nhau được sử dụng bởi client |
html |
Tùy chọn | HTML xác minh mới từ cùng phiên |
Tài liệu cũng yêu cầu thư viện yêu cầu hỗ trợ TLS và khuyến khích duy trì phiên proxy ít nhất ba phút.
Trang sản phẩm của CapSolver giúp phân biệt các loại nhiệm vụ Cloudflare và Turnstile được hỗ trợ.
import os
import capsolver
capsolver.api_key = os.environ["CAPSOLVER_API_KEY"]
PROXY_VAULT = {
"approved_static_us": os.environ["APPROVED_STATIC_PROXY"],
}
def build_task(
policy: TargetPolicy,
identity: SessionIdentity,
target_url: str,
fresh_html: str | None,
) -> dict:
if identity.proxy_profile != policy.proxy_profile:
raise ValueError("Proxy phiên không khớp với chính sách mục tiêu")
if identity.target_host != policy.hostname:
raise ValueError("Tên miền phiên không khớp với chính sách mục tiêu")
task = {
"type": "AntiCloudflareTask",
"websiteURL": target_url,
"proxy": PROXY_VAULT[identity.proxy_profile],
"userAgent": identity.chrome_user_agent,
}
if fresh_html:
task["html"] = fresh_html
return task
Người xây dựng nhiệm vụ đọc thông tin xác thực mạng từ kho lưu trữ bảo vệ. Nó không trả lại cho người gọi hoặc ghi vào nhật ký.
Khi cần HTML, thu thập nó ngay lập tức sau khi bộ phân loại xác định trang xác minh.
from datetime import datetime, timezone
@dataclass(frozen=True)
class ChallengeDocument:
session_id: str
target_url: str
body: str
status_code: int
captured_at: str
async def capture_challenge_document(client, identity, target_url):
response = await client.get(
target_url,
session_id=identity.session_id,
proxy_profile=identity.proxy_profile,
user_agent=identity.chrome_user_agent,
tls_profile=identity.tls_profile,
cookie_jar_id=identity.cookie_jar_id,
)
observation = HttpObservation(
url=str(response.url),
status_code=response.status_code,
title=extract_title(response.text),
html=response.text,
headers=dict(response.headers),
)
if classify_observation(observation) != "CLOUDFLARE_CHALLENGE":
raise ValueError("Phản hồi không phải là trang xác minh được nhận diện")
return ChallengeDocument(
session_id=identity.session_id,
target_url=target_url,
body=response.text,
status_code=response.status_code,
captured_at=datetime.now(timezone.utc).isoformat(),
)
Không tái sử dụng HTML được thu thập bởi proxy, trình duyệt, phiên hoặc URL đích khác.
def solve_approved_challenge(
target_id: str,
target_url: str,
identity: SessionIdentity,
document: ChallengeDocument,
) -> dict:
policy = resolve_target(target_id, target_url)
if document.session_id != identity.session_id:
raise ValueError("Tài liệu và phiên không khớp")
if document.target_url != target_url:
raise ValueError("Tài liệu và URL đích không khớp")
task = build_task(
policy=policy,
identity=identity,
target_url=target_url,
fresh_html=document.body,
)
solution = capsolver.solve(task)
cookies = solution.get("cookies") or {}
clearance = cookies.get("cf_clearance") or solution.get("token")
returned_user_agent = solution.get("userAgent") or identity.chrome_user_agent
if not clearance:
raise RuntimeError("Kết quả nhiệm vụ không chứa dữ liệu làm sạch")
return {
"cookies": cookies,
"user_agent": returned_user_agent,
}
Không in solution. Trích xuất chỉ các trường thời gian chạy cần thiết cho yêu cầu tiếp theo.
async def apply_clearance(client, identity: SessionIdentity, result: dict):
for name, value in result["cookies"].items():
await client.set_cookie(
cookie_jar_id=identity.cookie_jar_id,
domain=identity.target_host,
name=name,
value=value,
secure=True,
)
await client.set_user_agent(
session_id=identity.session_id,
user_agent=result["user_agent"],
)
Sử dụng tên miền và phạm vi cookie chính xác yêu cầu bởi mục tiêu được phê duyệt. Không sao chép cookie sang tên miền không liên quan hoặc máy khác.
@dataclass(frozen=True)
class VerificationRule:
expected_status: int
required_selectors: tuple[str, ...]
forbidden_markers: tuple[str, ...]
expected_path_prefix: str
async def verify_target_page(
client,
identity: SessionIdentity,
target_url: str,
rule: VerificationRule,
) -> dict:
response = await client.get(
target_url,
session_id=identity.session_id,
proxy_profile=identity.proxy_profile,
user_agent=identity.chrome_user_agent,
tls_profile=identity.tls_profile,
cookie_jar_id=identity.cookie_jar_id,
)
parsed = urlparse(str(response.url))
body = response.text.lower()
status_ok = response.status_code == rule.expected_status
path_ok = parsed.path.startswith(rule.expected_path_prefix)
markers_ok = not any(marker.lower() in body for marker in rule.forbidden_markers)
selectors_ok = all(selector_in_html(response.text, selector) for selector in rule.required_selectors)
return {
"verified": status_ok and path_ok and markers_ok and selectors_ok,
"status_ok": status_ok,
"path_ok": path_ok,
"markers_ok": markers_ok,
"selectors_ok": selectors_ok,
}
Kết quả nhiệm vụ CapSolver không đủ. Ứng dụng chỉ nên tiếp tục sau khi xác minh này trả về verified=True.
from enum import Enum
class FlowState(str, Enum):
OBSERVED = "OBSERVED"
CLASSIFIED = "CLASSIFIED"
TASK_CREATED = "TASK_CREATED"
RESULT_READY = "RESULT_READY"
PAGE_VERIFIED = "PAGE_VERIFIED"
STOPPED = "STOPPED"
ALLOWED = {
FlowState.OBSERVED: {FlowState.CLASSIFIED, FlowState.STOPPED},
FlowState.CLASSIFIED: {FlowState.TASK_CREATED, FlowState.STOPPED},
FlowState.TASK_CREATED: {FlowState.RESULT_READY, FlowState.STOPPED},
FlowState.RESULT_READY: {FlowState.PAGE_VERIFIED, FlowState.STOPPED},
FlowState.PAGE_VERIFIED: {FlowState.STOPPED},
}
def transition(current: FlowState, next_state: FlowState) -> FlowState:
if next_state not in ALLOWED[current]:
raise ValueError(f"Chuyển tiếp không hợp lệ: {current} -> {next_state}")
return next_state
Cho phép một lần thử nhiệm vụ cho mỗi trạng thái trang quan sát được. Nếu xác minh thất bại, dừng và yêu cầu xem xét thay vì lặp lại.
Tài liệu thông báo lỗi của CapSolver phân biệt lỗi đầu vào, giới hạn, thời gian chờ, proxy, tài khoản, hỗ trợ và dịch vụ tạm thời.
| Lớp lỗi | Ví dụ | Hành động |
|---|---|---|
| Đầu vào không hợp lệ | ERROR_INVALID_TASK_DATA |
Sửa lỗi xây dựng nhiệm vụ đáng tin cậy |
| Giới hạn tốc độ | ERROR_RATE_LIMIT |
Chờ theo chính sách |
| Thời gian chờ | ERROR_TASK_TIMEOUT |
Ghi lại thời gian và dừng hoặc xem xét |
| Nhiệm vụ không hỗ trợ | ERROR_TASK_NOT_SUPPORTED |
Phân loại lại loại xác minh |
| Không thể giải | ERROR_CAPTCHA_UNSOLVABLE |
Dừng và xem xét trạng thái trang |
| Proxy bị chặn | ERROR_PROXY_BANNED |
Xác minh danh tính mạng lưới đã được phê duyệt |
| Tài khoản/khóa | ERROR_KEY_DENIED_ACCESS, ERROR_ZERO_BALANCE |
Sửa cấu hình tài khoản |
| Dịch vụ tạm thời | ERROR_SERVICE_UNAVALIABLE |
Ngừng thử và kiểm tra trạng thái nhà cung cấp |
Không áp dụng quy tắc thử lại giống nhau cho mọi lỗi.
ERROR_ACTIONS = {
"ERROR_INVALID_TASK_DATA": "FIX_INPUT",
"ERROR_RATE_LIMIT": "WAIT",
"ERROR_TASK_TIMEOUT": "REVIEW",
"ERROR_TASK_NOT_SUPPORTED": "RECLASSIFY",
"ERROR_CAPTCHA_UNSOLVABLE": "REVIEW",
"ERROR_PROXY_BANNED": "REVIEW_NETWORK",
"ERROR_KEY_DENIED_ACCESS": "FIX_ACCOUNT",
"ERROR_ZERO_BALANCE": "FIX_ACCOUNT",
"ERROR_SERVICE_UNAVALIABLE": "BACKOFF",
}
def normalize_error(error_code: str | None) -> dict:
code = error_code or "UNKNOWN_ERROR"
return {
"category": code,
"action": ERROR_ACTIONS.get(code, "OPERATOR_REVIEW"),
"retry_allowed": ERROR_ACTIONS.get(code) in {"WAIT", "BACKOFF"},
}
Chỉ cho phép thử lại theo chính sách đáng tin cậy và chỉ sau khi điều kiện kích hoạt đã thay đổi hoặc thời gian chờ đã hết.
Xem các mục sau là bí mật:
cf_clearance và các cookie khác;SAFE_EVENT_FIELDS = {
"event",
"target_id",
"state",
"error_category",
"attempt_count",
"duration_ms",
"verified",
"observed_at",
}
def redact_event(event: dict) -> dict:
return {
key: event[key]
for key in SAFE_EVENT_FIELDS
if key in event
}
Lưu trữ băm hoặc tham chiếu nội bộ đến bằng chứng nhạy cảm thay vì đặt chính bằng chứng đó trong nhật ký chung.
FAQ CapSolver cung cấp hướng dẫn vận hành bổ sung, và trang trạng thái CapSolver giúp phân biệt giữa lỗi ứng dụng và khả năng sẵn sàng của nhà cung cấp.
from datetime import datetime, timezone
from time import monotonic
def diagnostic_event(
target_id: str,
state: str,
attempt_count: int,
verified: bool,
started_at: float,
error_category: str | None = None,
) -> dict:
return redact_event({
"event": "cloudflare_challenge_diagnostic",
"target_id": target_id,
"state": state,
"attempt_count": attempt_count,
"duration_ms": int((monotonic() - started_at) * 1000),
"verified": verified,
"error_category": error_category,
"observed_at": datetime.now(timezone.utc).isoformat(),
})
Theo dõi tỷ lệ thách thức, tỷ lệ nhiệm vụ thành công, tỷ lệ trang được xác minh, phân bố lỗi, thời gian để sẵn sàng, và khối lượng yêu cầu xem xét của nhân viên. Không theo dõi bí mật.
import pytest
@pytest.mark.parametrize(
"status,title,html,expected",
[
(429, "Bị giới hạn tốc độ", "", "RATE_LIMIT"),
(403, "Vui lòng chờ...", "cf-chl-test", "CLOUDFLARE_CHALLENGE"),
(200, "Đăng nhập", '<input type="password">', "AUTH_REQUIRED"),
(500, "Lỗi máy chủ", "", "ORIGIN_OR_NETWORK_ERROR"),
],
)
def test_classifier(status, title, html, expected):
observation = HttpObservation(
url="https://approved.example.com/test/",
status_code=status,
title=title,
html=html,
headers={},
)
assert classify_observation(observation) == expected
Kiểm tra cả các sự không khớp danh tính:
def test_task_rejects_proxy_profile_mismatch():
policy = TARGETS["docs_demo"]
identity = SessionIdentity(
session_id="session-1",
proxy_profile="wrong_profile",
chrome_user_agent="Mozilla/5.0 ... Chrome/141.0.0.0 ...",
tls_profile="chrome141",
cookie_jar_id="jar-1",
target_host="approved.example.com",
)
with pytest.raises(ValueError):
build_task(
policy=policy,
identity=identity,
target_url="https://approved.example.com/test/",
fresh_html="<html>Vui lòng chờ...</html>",
)
Cuối cùng, kiểm tra xem việc che giấu dữ liệu loại bỏ các cookie, HTML, khóa và giá trị proxy.
Mã khuyến khích: Sử dụng mã WEBS tại Bảng điều khiển CapSolver để nhận thêm 5% khuyến mãi cho mỗi lần nạp tiền.
| Mẫu | Tính nhất quán danh tính | Độ rõ ràng chẩn đoán | Gợi ý |
|---|---|---|---|
| Thử lại mỗi 403 | Thấp | Thấp | Tránh |
| Tạo nhiệm vụ từ các trường do người gọi cung cấp | Biến đổi | Thấp | Tránh |
| Phân loại, xây dựng từ danh tính đáng tin cậy, sau đó xác minh | Cao | Cao | Ưa tiên |
| Dừng và yêu cầu xem xét thủ công | Cao | Cao | Bắt buộc với các trạng thái chưa biết hoặc nhạy cảm |
Mẫu ưa tiên làm cho mỗi quyết định rõ ràng và có thể kiểm tra.
AntiCloudflareTask cho trang thách thức được hỗ trợ đã biết.Trang sản phẩm CapSolver https://www.capsolver.com/products có thể giúp xác nhận các danh mục thách thức được hỗ trợ trước khi triển khai.
Chỉ sử dụng xử lý thách thức Cloudflare trên các trang bạn sở hữu, kiểm tra hoặc có sự cho phép rõ ràng. Tuân thủ các điều khoản, giới hạn tốc độ, ranh giới xác thực, nghĩa vụ bảo mật và chính sách nguồn. Khả năng xử lý thách thức không cấp quyền truy cập. Dừng lại khi mục tiêu chưa biết, trang nhạy cảm, danh tính không khớp hoặc xác minh thất bại. Giữ các hành động quan trọng đằng sau bước chính sách và phê duyệt của con người.
Chẩn đoán thách thức Cloudflare nên là quy trình nghiêm ngặt: cấp phép cho mục tiêu, phân loại trang quan sát, xây dựng AntiCloudflareTask từ danh tính phiên bản đáng tin cậy, giữ nguyên proxy và user agent Chrome được hỗ trợ nhất quán, áp dụng vật liệu clearance ngắn hạn vào cùng cookie jar, và xác minh trang đích mong muốn. Lỗi nên được phân loại thay vì thử lại một cách mù quáng, và bí mật không bao giờ được đưa vào nhật ký hoặc ngữ cảnh mô hình.
Bắt đầu triển khai được phê duyệt với CapSolver, kiểm tra trên trang thử nghiệm được kiểm soát và thêm các bài kiểm tra trạng thái, danh tính, xác minh và che giấu trước khi sử dụng sản xuất.
Sử dụng nhiệm vụ được tài liệu AntiCloudflareTask khi trang quan sát khớp với trang Cloudflare Challenge được hỗ trợ và mục tiêu được phê duyệt.
Có. CapSolver tài liệu một proxy tĩnh hoặc cố định cho nhiệm vụ này. Giữ nguyên danh tính mạng lưới này nhất quán qua xác minh.
html?Bao gồm HTML thách thức mới khi mục tiêu yêu cầu. Ghi lại HTML với cùng proxy cố định, user agent Chrome được hỗ trợ, cookie jar và URL đích.
Không. Áp dụng vật liệu phiên bản trả về vào cùng yêu cầu danh tính và xác minh rằng trang đích mong muốn đã tải mà không có dấu hiệu thách thức.
Dừng lại, lưu lại chẩn đoán đã che giấu và yêu cầu xem xét của nhân viên. Không tạo vòng lặp thử lại không giới hạn.
Xây dựng hệ thống theo dõi giá bất động sản đáng tin cậy với các bộ dữ liệu chính thức, các quan sát so sánh, giải quyết thử thách Cloudflare, bằng chứng và cảnh báo được kiểm soát.

Xây dựng hệ thống giám sát tồn kho thương mại điện tử đáng tin cậy với nguồn cung lấy API làm trọng tâm, khôi phục thách thức Cloudflare, tính nhất quán phiên, bằng chứng tồn kho và cảnh báo an toàn.
