
Anh Tuan
Data Science Expert

202 Challenge hoặc 405 CAPTCHA khi một yêu cầu không mang theo token hợp lệ; hãy kiểm tra cả trạng thái và tiêu đề x-amzn-waf-action trước khi định tuyến một agent.capsolver-core, với các công cụ LangChain sẵn có và phương pháp phát hiện và điền lại có hướng trình duyệt.resolved, not_needed, review, hoặc denied.Hành vi của các hành động Challenge và CAPTCHA của AWS WAF thay đổi con đường yêu cầu bình thường. Theo tài liệu hành động AWS WAF, một yêu cầu có token hợp lệ sẽ tiếp tục đến quy tắc tiếp theo. Một yêu cầu không có token hợp lệ có thể nhận được phản hồi thử thách.
Đối với Challenge, AWS ghi chú tiêu đề phản hồi x-amzn-waf-action: challenge và trạng thái HTTP 202. Đối với CAPTCHA, nó ghi chú x-amzn-waf-action: captcha và trạng thái 405. Khi khách hàng kỳ vọng HTML, AWS WAF có thể trả về một trang trung gian JavaScript. Tương tác thành công cập nhật token và gửi lại yêu cầu gốc.
Hành vi này quan trọng đối với agent vì một khách hàng HTTP thông thường có thể hiểu phản hồi là trang bình thường, lỗi máy chủ tạm thời hoặc kết quả trống. Một mô hình ngôn ngữ không nên đoán trường hợp nào xảy ra. Ứng dụng chủ sở hữu nên phân loại phản hồi, kiểm tra xác thực và định tuyến quy trình thông qua bước phục hồi được kiểm soát.
Mục tiêu không phải là làm cho việc xử lý thử thách trở nên vô hình. Mục tiêu là làm cho nó rõ ràng, có giới hạn, quan sát được và chỉ giới hạn ở tự động hóa hợp pháp trên các hệ thống mà người vận hành sở hữu hoặc có quyền kiểm tra.
Một thiết kế sản xuất có năm trách nhiệm riêng biệt:
Hướng dẫn công cụ agent chính thức của CapSolver ghi chú capsolver-agent là một bộ thích ứng mỏng trên capsolver-core. Gói core thực hiện các thao tác như solve, detect và solve_on_page; gói agent cung cấp các lược đồ công cụ thân thiện với khung. Đường dẫn LangChain được ghi chú cung cấp các công cụ sẵn có thông qua get_langchain_tools().
Lớp ranh giới này hữu ích. Mô hình không cần thông tin xác thực thô, token, đối tượng trình duyệt hoặc chức năng mạng không giới hạn. Nó nhận được hợp đồng công cụ hẹp trong khi mã ứng dụng xác định khi công cụ có thể chạy.
Trước khi viết mã agent, xác định ranh giới hoạt động:
CAPSOLVER_API_KEY và thông tin xác thực mô hình;Sử dụng môi trường Python tách biệt. Các lệnh cài đặt dưới đây tuân theo hướng dẫn agent CapSolver hiện tại:
python -m venv .venv
source .venv/bin/activate
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install "capsolver-agent[langchain] @ git+https://github.com/capsolver-ai/capsolver-agent.git"
pip install langchain-openai langgraph playwright
playwright install chromium
Lưu thông tin xác thực bên ngoài kiểm soát nguồn:
export CAPSOLVER_API_KEY="set-this-in-your-secret-manager"
export OPENAI_API_KEY="set-this-in-your-secret-manager"
Không dán các bí mật thực tế vào prompt, trace, notebook, issue hoặc checkpoint. Biến môi trường tiện lợi cho các ví dụ cục bộ; kho lưu trữ bí mật được quản lý là lựa chọn tốt hơn trong các hệ thống triển khai.
Thành phần xác định đầu tiên nên phân loại phản hồi. Ví dụ này sử dụng kết hợp trạng thái và tiêu đề được ghi chú bởi AWS:
from dataclasses import dataclass
from typing import Mapping, Literal
WafAction = Literal["challenge", "captcha", "none", "unknown"]
@dataclass(frozen=True)
class WafSignal:
action: WafAction
status_code: int
needs_review: bool = False
def classify_aws_waf_response(
status_code: int,
headers: Mapping[str, str],
) -> WafSignal:
normalized = {key.lower(): value.lower() for key, value in headers.items()}
action = normalized.get("x-amzn-waf-action", "")
if action == "challenge" and status_code == 202:
return WafSignal(action="challenge", status_code=status_code)
if action == "captcha" and status_code == 405:
return WafSignal(action="captcha", status_code=status_code)
if action in {"challenge", "captcha"}:
return WafSignal(
action="unknown",
status_code=status_code,
needs_review=True,
)
return WafSignal(action="none", status_code=status_code)
Yêu cầu cả hai tín hiệu. Một 202 riêng lẻ có thể là phản hồi hợp lệ của ứng dụng, và một 405 riêng lẻ có thể có nghĩa là điểm cuối không cho phép phương thức HTTP. Một kết hợp không mong muốn nên đi đến xem xét thay vì kích hoạt vòng lặp phục hồi tự động.
AWS cũng lưu ý rằng JavaScript trình duyệt chạy qua các nguồn không thể đọc x-amzn-waf-action vì tiêu đề này không có sẵn qua CORS. Trong trường hợp đó, phân loại phản hồi mạng trong lớp tự động hóa trình duyệt hoặc sử dụng tích hợp cùng nguồn. Không suy ra thử thách chỉ từ nội dung trang.
Nhận mã thưởng CapSolver của bạn
Tăng ngân sách tự động hóa của bạn ngay lập tức!
Sử dụng mã thưởng CAP26 khi nạp tiền vào tài khoản CapSolver để nhận thêm 5% thưởng trên mỗi lần nạp tiền — không giới hạn.
Nhận mã thưởng ngay bây giờ trong Bảng điều khiển CapSolver
Việc xử lý thử thách không nên có sẵn cho mọi URL mà mô hình có thể đề cập. Kiểm tra mục tiêu trước khi bất kỳ công cụ agent nào được thực thi:
from dataclasses import dataclass
from urllib.parse import urlparse
@dataclass(frozen=True)
class PolicyDecision:
allowed: bool
reason: str
ALLOWED_HOSTS = {"staging.example.com", "research.example.org"}
ALLOWED_PURPOSES = {"qa-validation", "authorized-research"}
def authorize_recovery(
url: str,
purpose: str,
attempts: int,
) -> PolicyDecision:
host = (urlparse(url).hostname or "").lower()
if host not in ALLOWED_HOSTS:
return PolicyDecision(False, "host-not-allowed")
if purpose not in ALLOWED_PURPOSES:
return PolicyDecision(False, "purpose-not-allowed")
if attempts >= 2:
return PolicyDecision(False, "retry-budget-exhausted")
return PolicyDecision(True, "authorized")
Giữ hàm này bên ngoài mô hình ngôn ngữ. Trong sản xuất, tải các tên miền và mục đích được phê duyệt từ cấu hình có phiên bản, từ chối chuyển hướng đến tên miền khác và ghi lại chỉ dữ liệu quyết định không nhạy cảm.
Gói agent được ghi chú có thể phơi bày các công cụ tương thích LangChain. Một thiết lập tối thiểu trông như sau:
import os
from capsolver_agent.langchain import get_langchain_tools
capsolver_tools = get_langchain_tools(
api_key=os.environ["CAPSOLVER_API_KEY"],
)
API xây dựng agent có thể thay đổi qua các phiên bản LangChain và LangGraph. Giữ việc thu thập công cụ CapSolver trong một mô-đun thích ứng nhỏ, cố định phiên bản phụ thuộc được kiểm tra và kết nối capsolver_tools thông qua người xây dựng agent được hỗ trợ bởi các phiên bản đó.
Không cung cấp mọi công cụ cho mọi agent. Mẫu an toàn hơn là phơi bày các công cụ thử thách chỉ bên trong một đồ thị phục hồi hoặc người thực thi chuyên dụng chạy sau khi authorize_recovery() trả về allowed=True.
CapSolver ghi chú bản đồ công cụ agent ở cấp độ cao:
solve_captcha gọi khả năng solve của core;detect_captchas gọi khả năng detect của core;solve_on_page gọi khả năng solve_on_page của core;Chỉ sử dụng công cụ nhỏ nhất cần thiết cho tích hợp. Đối với phiên trình duyệt sống, quy trình phát hiện và điền lại có hướng trình duyệt thường bảo tồn nhiều ngữ cảnh hơn so với việc mô hình thao tác giải pháp thô.
Token AWS WAF là một phần của phiên khách hàng. Tài liệu token AWS WAF giải thích rằng các hành động Challenge và CAPTCHA sử dụng token để theo dõi tương tác thành công. Thay thế trình duyệt hoặc mất cookie của nó giữa phát hiện và thử lại có thể xóa trạng thái đó.
Không serialize đối tượng Playwright Page vào tin nhắn LangChain hoặc điểm kiểm tra đồ thị. Lưu trữ nó trong một thư viện do ứng dụng sở hữu:
class BrowserRegistry:
def __init__(self) -> None:
self._pages: dict[str, object] = {}
def register(self, page_id: str, page: object) -> None:
self._pages[page_id] = page
def get(self, page_id: str) -> object:
if page_id not in self._pages:
raise KeyError("browser page is not registered")
return self._pages[page_id]
async def close(self, page_id: str) -> None:
page = self._pages.pop(page_id, None)
if page is not None:
await page.close()
Trạng thái agent nên chứa chỉ page_id mờ, URL hiện tại, mục đích, số lần thử và trạng thái. Loại bỏ cookie, bộ nhớ cục bộ, token giải pháp, khóa API và HTML thô.
Sử dụng kiểu kết quả nhỏ để mô hình không thể tái diễn một phản hồi cấp thấp:
from typing import Literal, TypedDict
RecoveryStatus = Literal[
"not_needed",
"authorized",
"resolved",
"retry",
"review",
"denied",
]
class RecoveryState(TypedDict, total=False):
request_id: str
purpose: str
current_url: str
page_id: str
attempts: int
waf_action: str
recovery_status: RecoveryStatus
error_code: str | None
final_assertion_passed: bool
def route_after_detection(state: RecoveryState) -> str:
if state.get("waf_action") not in {"challenge", "captcha"}:
return "continue"
if state.get("recovery_status") == "authorized":
return "recover"
if state.get("recovery_status") in {"denied", "review"}:
return "human_review"
return "authorize"
def route_after_recovery(state: RecoveryState) -> str:
status = state.get("recovery_status")
if status == "resolved":
return "verify"
if status == "retry":
return "authorize"
return "human_review"
Nút phục hồi có thể gọi công cụ trình duyệt CapSolver được phê duyệt, nhưng nó nên trả về chỉ trạng thái và mã lỗi ổn định. Không đặt phản hồi công cụ thô vào prompt tiếp theo của mô hình.
Hoàn thành thử thách không chứng minh rằng thao tác kinh doanh ban đầu đã thành công. Lặp lại điều hướng hoặc yêu cầu mong muốn trong cùng phiên và kiểm tra tín hiệu ứng dụng sở hữu:
async def verify_expected_page(page, expected_url_prefix: str) -> bool:
await page.wait_for_load_state("domcontentloaded")
if not page.url.startswith(expected_url_prefix):
return False
marker = page.get_by_test_id("authorized-content")
try:
await marker.wait_for(state="visible", timeout=15_000)
return True
except Exception:
return False
Chọn một điểm đánh dấu ổn định do ứng dụng kiểm soát: ID kiểm tra, phản hồi API cụ thể hoặc chuyển tiếp trạng thái đã biết. Tránh các tuyên bố rộng như "trang chứa văn bản" vì trang lỗi có thể chứa các từ tương tự.
Nếu xác minh thất bại, đừng gọi giải pháp lại ngay lập tức. Phân loại lại phản hồi hiện tại, kiểm tra xem phiên có thay đổi không, áp dụng ngân sách thử lại và gửi các trường hợp mơ hồ đến con người.
Một quy trình có giới hạn nên phân biệt ít nhất các trường hợp sau:
| Điều kiện | Hướng dẫn được khuyến khích |
|---|---|
| Không có tín hiệu AWS WAF | Tiếp tục quy trình bình thường |
| Tín hiệu đã biết trên tên miền được phê duyệt | Chạy nút phục hồi được ủy quyền |
| Trạng thái/đầu tiêu không xác định | Xem xét con người |
| Chuyển hướng đến tên miền không được phê duyệt | Từ chối |
| Thời gian chờ công cụ thử thách | Thử lại một lần nếu ngân sách cho phép |
| Phục hồi báo cáo thành công nhưng xác minh trang thất bại | Phân loại lại, sau đó xem xét |
| Đạt giới hạn thử lại | Dừng và ghi mã lỗi ổn định |
| Thiếu thông tin xác thực hoặc phiên trình duyệt | Lỗi cấu hình; không yêu cầu mô hình sửa chữa |
Sử dụng backoff mũ cho lỗi truyền tải tạm thời, nhưng không sử dụng vòng lặp không giới hạn. Bộ đếm thử lại thuộc về trạng thái xác định, không phải bộ nhớ mô hình.
Ghi sự kiện như waf_signal_detected, policy_allowed, recovery_started, recovery_finished và page_verified. Bao gồm ID yêu cầu, tên miền, thời gian, số lần thử và mã lỗi. Loại bỏ thông tin xác thực, cookie, token, dữ liệu thử thách thô và nội dung trang nhạy cảm.
Các dấu vết của agent cho thấy workflow đã quyết định; các chỉ số AWS cho thấy điều lớp bảo vệ quan sát được. AWS liệt kê các chỉ số CloudWatch cho hoạt động Challenge và CAPTCHA, bao gồm số lượng yêu cầu, thử, giải quyết và token hợp lệ trong tham khảo chỉ số WAF.
Các câu hỏi vận hành hữu ích bao gồm:
Kết nối các hệ thống bằng ID yêu cầu nội bộ, không phải bằng chứng chỉ hoặc token. Một sự gia tăng đột ngột trong lưu lượng thử thách nên kích hoạt chẩn đoán, không phải ngân sách thử lại lớn hơn mặc định.
Nội dung trang dễ gây hiểu lầm và dễ thay đổi. Ưu tiên trạng thái phản hồi và tiêu đề được tài liệu hóa, sự kiện mạng trình duyệt hoặc tín hiệu do ứng dụng sở hữu.
Một trình duyệt mới có thể mất cookie và trạng thái token. Giữ cùng phiên được phê duyệt qua phát hiện, phục hồi, thử lại và xác minh.
Mô hình không cần chúng. Giữ các giá trị nhạy cảm bên trong bộ chuyển đổi xác định và trả về trạng thái có kiểu.
Luôn lặp lại thao tác mong muốn và kiểm tra một sự xác nhận chuyên biệt cho lĩnh vực.
Áp dụng danh sách cho phép tên miền, kiểm tra mục đích, kiểm tra chuyển hướng, ngân sách thử lại và xem xét đường dẫn bên ngoài mô hình.
API xây dựng LangChain và LangGraph thay đổi theo thời gian. Cố định phiên bản đã vượt qua bài kiểm tra của bạn, cô lập dây chuyền khung phần mềm trong một mô-đun và chạy lại kiểm tra tích hợp trước khi nâng cấp.
Sử dụng trang thử nghiệm do bạn sở hữu và kiểm tra các trường hợp sau:
Mô phỏng bộ phân loại, cổng chính sách và bộ xác minh trong kiểm tra đơn vị. Dành kiểm tra end-to-end có chứng chỉ cho môi trường được phê duyệt. Kiểm tra nhật ký cũng vậy: xác nhận rằng chứng chỉ, cookie và token không xuất hiện.
Hướng dẫn bắt đầu với CapSolver ghi lại chu kỳ cuộc sống nhiệm vụ và các danh mục CAPTCHA được hỗ trợ. Sử dụng tài liệu chính thức hiện tại khi chọn đường dẫn nhiệm vụ; không đoán các trường từ đoạn mã cũ hoặc bài viết của bên thứ ba.
Một tích hợp AWS WAF LangChain đáng tin cậy là một máy trạng thái được kiểm soát, không phải một "giải quyết" duy nhất. Phát hiện tín hiệu WAF được tài liệu hóa, xác minh mục đích và đích, gọi công cụ có phạm vi hẹp, giữ cùng phiên khách hàng, và xác nhận thao tác ban đầu trước khi agent tiếp tục.
Đối với tự động hóa được ủy quyền, CapSolver cung cấp lớp agent và lớp cốt lõi cần thiết để kết nối xử lý thử thách với LangChain trong khi giữ chính sách, bí mật và xác minh cuối cùng trong mã ứng dụng.
Sử dụng tài liệu của CapSolver để xác minh đường tích hợp hiện tại, sau đó thử CapSolver trên môi trường thử nghiệm do bạn sở hữu hoặc được ủy quyền rõ ràng. Áp dụng mã khuyến mãi CAP26 khi nạp tiền để nhận khuyến mãi 5% được cấu hình.
Câu hỏi: Agent LangChain phát hiện thử thách AWS WAF như thế nào?
Kiểm tra sự kết hợp được tài liệu hóa của HTTP 202 và x-amzn-waf-action: challenge trong lớp HTTP hoặc trình duyệt xác định. Không yêu cầu mô hình ngôn ngữ suy luận điều kiện từ nội dung trang.
Câu hỏi: Trả lời nào cho thấy hành động CAPTCHA của AWS WAF?
AWS tài liệu hóa HTTP 405 với x-amzn-waf-action: captcha cho phản hồi CAPTCHA khi yêu cầu không có token hợp lệ. Xử lý sự không khớp giữa trạng thái và tiêu đề như không xác định và định tuyến nó đến xem xét.
Câu hỏi: API khóa CapSolver có nên được truyền đến mô hình LangChain không?
Không. Tải nó bên trong ứng dụng hoặc bộ thích ứng công cụ từ kho lưu trữ chứng chỉ được phê duyệt. Mô hình nên không bao giờ nhìn thấy khóa, cookie, token WAF hoặc giá trị giải quyết thô.
Câu hỏi: Agent có thể sử dụng trình duyệt mới sau khi thử thách được hoàn thành không?
Nên giữ cùng ngữ cảnh trình duyệt khi có thể vì trạng thái token WAF AWS liên quan đến phiên khách hàng. Thay thế phiên có thể xóa trạng thái cần thiết cho yêu cầu lặp lại.
Câu hỏi: Kết quả công cụ thử thách thành công có đủ để tiếp tục không?
Không. Lặp lại thao tác mong muốn và xác minh sự xác nhận thành công chuyên biệt cho ứng dụng. Kết quả công cụ chỉ là trạng thái trung gian.
Câu hỏi: Agent nên thử lại bao nhiêu lần?
Đặt ngân sách thử lại nhỏ và rõ ràng dựa trên rủi ro và giới hạn thời gian của workflow. Các ví dụ sử dụng hai lần thử như chính sách ứng dụng, không phải cam kết của CapSolver hoặc AWS.
Câu hỏi: Quy trình này có thể sử dụng trên bất kỳ trang web nào không?
Không. Chỉ sử dụng trên các hệ thống bạn sở hữu hoặc được ủy quyền rõ ràng để tự động hóa. Áp dụng kiểm tra đích và mục đích bên ngoài mô hình và định tuyến các trường hợp không chắc chắn đến xem xét của con người.
Học cách tự động giải CAPTCHA AWS WAF bằng cách sử dụng tiện ích mở rộng trình duyệt và tích hợp API. Hướng dẫn này bao gồm nhận dạng hình ảnh, thách thức dựa trên token và giải pháp của CapSolver để tự động hóa mượt mà và quét web.

Nâng cao kỹ năng giải quyết các thách thức CAPTCHA của Amazon AWS WAF trong tự động hóa trình duyệt với các chiến lược chuyên gia. Học cách tích hợp CapSolver để có các quy trình tự động hóa liền mạch và hiệu quả. Hướng dẫn này bao gồm các giải pháp dựa trên token và phân loại.
