
Anh Tuan
Data Science Expert

Cách an toàn nhất để giải reCAPTCHA v3 trong CrewAI là mở rộng CapSolver qua một công cụ có kiểu và kiểm soát chính sách. CrewAI nên quyết định khi nhiệm vụ cần xác minh, nhưng mã ứng dụng đáng tin cậy nên giải quyết các mục tiêu được phê duyệt, khóa trang web, hành động trang, chế độ proxy và chính sách điểm số. Tài liệu reCAPTCHA v3 của CapSolver định nghĩa các loại nhiệm vụ và tham số được hỗ trợ, trong khi SDK Agent do người dùng cung cấp ánh xạ các lời gọi công cụ có cấu trúc đến capsolver-core. Công cụ nên gửi mã thông báo phía máy chủ, xác minh trạng thái trang kết quả và cung cấp cho đoàn một kết quả nhỏ như verified, review_required hoặc stopped. Thiết kế này ngăn chặn sự trôi URL, đoán hành động, rò rỉ bí mật, giải lại trùng lặp và tín hiệu thành công giả.
reCAPTCHA v3 dựa trên điểm số và thường chạy mà không có hộp kiểm hiển thị. Ứng dụng mục tiêu gọi một hành động, nhận được mã thông báo và đánh giá mã thông báo đó trên máy chủ. Do đó, quy trình CrewAI có thể thất bại ngay cả khi nó chưa bao giờ thấy thử thách trực quan.
Các nguyên nhân phổ biến là vận hành thay vì giao tiếp:
pageAction không khớp với hành động chạy trên trang;Bài viết blog reCAPTCHA của CapSolver https://www.capsolver.com/blog/recaptcha chứa hướng dẫn triển khai hỗ trợ, trong khi FAQ AI và tự động hóa https://www.capsolver.com/faq/ai-and-automation giúp xác định ranh giới an toàn cho tác nhân.
Một đoàn đa tác nhân hoạt động tốt nhất khi trách nhiệm rõ ràng.
| Vai trò | Trách nhiệm được phép | Không được kiểm soát |
|---|---|---|
| Người định hướng | Quan sát trạng thái ứng dụng được phê duyệt | Mã API, thông tin xác thực proxy, mã thông báo thô |
| Kế hoạch xác minh | Quyết định xem bước được phê duyệt có cần công cụ hay không | URL hoặc khóa trang bất kỳ |
| Công cụ CapSolver | Giải quyết chính sách, tạo một nhiệm vụ, gửi mã thông báo | Thử lại không giới hạn hoặc lướt web không liên quan |
| Xác minh trạng thái | Xác nhận đường dẫn và các dấu hiệu ngữ nghĩa mong muốn | Quyết định phê duyệt kinh doanh |
| Người xem xét | Kiểm tra bằng chứng đã che giấu khi thất bại | Vật liệu phiên bí mật |
Mô hình có thể chọn ID mục tiêu đã đăng ký. Nó không nên tạo URL mục tiêu hoặc tham số thử thách.
Tài liệu custom-tool của CrewAI hỗ trợ BaseTool với args_schema Pydantic, bộ định danh @tool, kết quả có kiểu và công cụ bất đồng bộ cho các thao tác I/O.
Tài liệu Agent CapSolver do người dùng cung cấp giải thích rằng capsolver-agent bao bọc capsolver-core: create_executor() tạo executor, và executor.execute("solve_captcha", args) phân phát yêu cầu có kiểu đến động cơ cốt lõi.
Cài đặt các gói được tài liệu hóa:
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install git+https://github.com/capsolver-ai/capsolver-agent.git
pip install crewai
export CAPSOLVER_API_KEY="CAP-..."
Giữ các khóa trong kho lưu trữ bí mật thời gian chạy. Không đặt chúng trong lời nhắc đoàn, mô tả nhiệm vụ hoặc kết quả công cụ.
from dataclasses import dataclass
@dataclass(frozen=True)
class RecaptchaV3Policy:
target_id: str
website_url: str
website_key: str
page_action: str
minimum_score: float
enterprise: bool
proxy_profile: str | None
allowed_crew_role: str
max_attempts: int = 1
TARGETS = {
"approved_login_test": RecaptchaV3Policy(
target_id="approved_login_test",
website_url="https://approved.example.com/login",
website_key="PUBLIC_SITE_KEY",
page_action="login",
minimum_score=0.7,
enterprise=False,
proxy_profile=None,
allowed_crew_role="verification_specialist",
)
}
Khóa trang web công khai không phải là bí mật tài khoản, nhưng nó vẫn nên đến từ cấu hình đáng tin cậy để mô hình không thể chuyển hướng công cụ.
pageAction Thay vì Đoán NóTài liệu reCAPTCHA v3 của CapSolver reCAPTCHA v3 liệt kê pageAction như một trường nhiệm vụ tùy chọn và giải thích rằng giá trị có thể được tìm thấy trong cuộc gọi grecaptcha.execute trên trang.
@dataclass(frozen=True)
class PageObservation:
target_id: str
current_url: str
observed_action: str
observed_site_key: str
form_state: str
observed_at: str
def validate_observation(
observation: PageObservation,
policy: RecaptchaV3Policy,
) -> None:
if observation.current_url != policy.website_url:
raise PermissionError("Observed URL does not match policy")
if observation.observed_site_key != policy.website_key:
raise ValueError("Observed site key does not match policy")
if observation.observed_action != policy.page_action:
raise ValueError("Observed page action does not match policy")
if observation.form_state != "READY_FOR_VERIFICATION":
raise ValueError("Application state is not ready")
Công cụ nên từ chối các sự không khớp thay vì tạo mã thông báo cho tham số không chắc chắn.
| Tham số | Mục đích | Quy tắc chính sách |
|---|---|---|
captcha_type |
Chọn reCAPTCHA v3 trong SDK Agent | Cố định thành reCaptchaV3 |
website_url |
Trang chứa thử thách | Tải từ kho lưu trữ |
website_key |
Khóa trang web công khai | Tải từ kho lưu trữ và kiểm tra với trang |
page_action |
Hành động v3 chạy | Phải khớp với quan sát |
min_score |
Điểm số tối thiểu được yêu cầu | Thiết lập bởi chính sách mục tiêu |
enterprise |
Đường đi Standard hoặc Enterprise | Cố định bởi cấu hình tích hợp |
proxy |
Xác định mạng tùy chọn | Giải quyết từ hồ sơ bí mật nếu cần |
CapSolver tài liệu các biến thể nhiệm vụ Standard, Enterprise, proxy và không proxy. Kết quả của nó có thể chứa gRecaptchaResponse, dữ liệu user-agent và giá trị phiên khi chế độ liên quan được bật.
Trang sản phẩm CapSolver https://www.capsolver.com/products giúp xác nhận gia đình nhiệm vụ được hỗ trợ trước khi triển khai.
import os
from typing import Literal
from crewai.tools import tool
from pydantic import BaseModel, Field
from capsolver_agent.schema import create_executor
executor = create_executor(api_key=os.environ["CAPSOLVER_API_KEY"])
class SolveRequest(BaseModel):
target_id: str = Field(description="Định danh mục tiêu đã đăng ký")
crew_role: str = Field(description="Vai trò yêu cầu xác minh")
observed_action: str = Field(description="Hành động quan sát trên trang trực tiếp")
observed_site_key: str = Field(description="Khóa trang web quan sát trên trang trực tiếp")
state_id: str = Field(description="Định danh trạng thái ứng dụng phía máy chủ không rõ")
class SolveResult(BaseModel):
status: Literal["verified", "review_required", "stopped"]
target_id: str
state_id: str
reason: str
task_attempted: bool
Mô hình kết quả cố ý loại bỏ mã thông báo, khóa API, proxy, cookie và phản hồi nhà cung cấp thô.
PROXY_VAULT = {
"approved_proxy": os.environ.get("APPROVED_PROXY")
}
async def submit_token_and_verify(
*,
state_id: str,
token: str,
policy: RecaptchaV3Policy,
) -> bool:
"""Hàm submit và kiểm tra do ứng dụng sở hữu."""
response = await application_sessions.submit_recaptcha_v3(
state_id=state_id,
token=token,
expected_action=policy.page_action,
)
return (
response.current_url.startswith("https://approved.example.com/account")
and response.semantic_marker == "AUTHENTICATED_ACCOUNT_PAGE"
and response.challenge_present is False
)
application_sessions đại diện cho dịch vụ phiên trình duyệt hoặc HTTP được ủy quyền của bạn. Công cụ giải mã sử dụng nó, nhưng mô hình không nhận được thông tin xác thực của nó.
@tool("Giải reCAPTCHA v3 đã phê duyệt", result_schema=SolveResult)
async def solve_approved_recaptcha_v3(
target_id: str,
crew_role: str,
observed_action: str,
observed_site_key: str,
state_id: str,
) -> dict:
"""Giải một bước reCAPTCHA v3 đã đăng ký và xác minh trạng thái ứng dụng."""
policy = TARGETS.get(target_id)
if policy is None:
return SolveResult(
status="stopped",
target_id=target_id,
state_id=state_id,
reason="Mục tiêu không biết",
task_attempted=False,
).model_dump()
if crew_role != policy.allowed_crew_role:
return SolveResult(
status="stopped",
target_id=target_id,
state_id=state_id,
reason="Vai trò không được phép gọi công cụ này",
task_attempted=False,
).model_dump()
if observed_action != policy.page_action:
return SolveResult(
status="review_required",
target_id=target_id,
state_id=state_id,
reason="Hành động quan sát không khớp chính sách mục tiêu",
task_attempted=False,
).model_dump()
if observed_site_key != policy.website_key:
return SolveResult(
status="review_required",
target_id=target_id,
state_id=state_id,
reason="Khóa trang quan sát không khớp chính sách mục tiêu",
task_attempted=False,
).model_dump()
args = {
"captcha_type": "reCaptchaV3",
"website_url": policy.website_url,
"website_key": policy.website_key,
"page_action": policy.page_action,
"min_score": policy.minimum_score,
"enterprise": policy.enterprise,
}
if policy.proxy_profile:
args["proxy"] = PROXY_VAULT[policy.proxy_profile]
result = await executor.execute("solve_captcha", args)
if not result.get("success"):
return SolveResult(
status="review_required",
target_id=target_id,
state_id=state_id,
reason="Nhiệm vụ CapSolver không hoàn thành",
task_attempted=True,
).model_dump()
solution = result.get("solution") or {}
token = solution.get("token")
if not token:
return SolveResult(
status="review_required",
target_id=target_id,
state_id=state_id,
reason="Kết quả nhiệm vụ không chứa mã thông báo",
task_attempted=True,
).model_dump()
verified = await submit_token_and_verify(
state_id=state_id,
token=token,
policy=policy,
)
return SolveResult(
status="verified" if verified else "review_required",
target_id=target_id,
state_id=state_id,
reason="Trạng thái ứng dụng được xác minh" if verified else "Trạng thái ứng dụng không được xác minh",
task_attempted=True,
).model_dump()
Triển khai này giữ bí mật trong mã đáng tin cậy và cung cấp cho đoàn chỉ trạng thái an toàn theo chính sách.
from crewai import Agent, Crew, Process, Task
verification_agent = Agent(
role="verification_specialist",
goal="Hoàn thành chỉ các bước xác minh đã đăng ký và báo cáo trạng thái đã xác minh",
backstory=(
"Bạn vận hành các công cụ xác minh được phê duyệt. Bạn không bao giờ tạo ID mục tiêu, "
"khóa trang, hành động, thông tin xác thực hoặc trạng thái thành công."
),
tools=[solve_approved_recaptcha_v3],
allow_delegation=False,
verbose=True,
)
verification_task = Task(
description=(
"Đối với mục tiêu đã đăng ký trong quan sát được cung cấp, gọi công cụ một lần "
"chỉ khi URL, khóa trang, hành động và trạng thái được xác nhận. Trả về kết quả "
"có cấu trúc mà không có bí mật."
),
expected_output="Một kết quả có cấu trúc, được xác minh, yêu cầu xem xét hoặc dừng.",
agent=verification_agent,
)
crew = Crew(
agents=[verification_agent],
tasks=[verification_task],
process=Process.sequential,
verbose=True,
)
Không gắn công cụ giải mã với mọi tác nhân. Giới hạn nó chỉ cho một vai trò sẽ làm rõ quyền hạn và kiểm toán.
from datetime import datetime, timedelta, timezone
ATTEMPTS: dict[tuple[str, str], datetime] = {}
def claim_attempt(target_id: str, state_id: str) -> bool:
key = (target_id, state_id)
now = datetime.now(timezone.utc)
prior = ATTEMPTS.get(key)
if prior and now - prior < timedelta(minutes=2):
return False
ATTEMPTS[key] = now
return True
Gọi claim_attempt() trước executor.execute(). Một thông điệp đoàn lặp lại không nên tạo mã thông báo thứ hai cho cùng một trạng thái ứng dụng.
Bộ nhớ, dấu vết và nhật ký chi tiết của CrewAI có thể lưu trữ đầu ra công cụ. Chỉ trả về:
{
"status": "verified",
"target_id": "approved_login_test",
"state_id": "state_7c19",
"reason": "Trạng thái ứng dụng được xác minh",
"task_attempted": true
}
Không bao giờ trả về mã thông báo, khóa API CapSolver, giá trị proxy, cookie trình duyệt, HTML thô, mật khẩu hoặc dữ liệu biểu mẫu cá nhân.
FAQ lỗi và khắc phục sự cố của CapSolver https://www.capsolver.com/faq/errors-and-troubleshooting có thể hỗ trợ phân loại lỗi nhà cung cấp mà không tiết lộ phản hồi thô cho đoàn.
Người xác minh nên yêu cầu nhiều tín hiệu độc lập:
@dataclass(frozen=True)
class StateCheck:
expected_path_prefix: str
required_marker: str
forbidden_markers: tuple[str, ...]
def is_verified(page, check: StateCheck) -> bool:
return (
page.url.path.startswith(check.expected_path_prefix)
and page.has_semantic_marker(check.required_marker)
and not any(page.contains(marker) for marker in check.forbidden_markers)
and page.http_status == 200
)
Một URL thay đổi đơn lẻ không đủ. Yêu cầu đường dẫn mong muốn, dấu hiệu ngữ nghĩa, trạng thái và sự vắng mặt của các trạng thái thử thách hoặc lỗi đã biết.
CapSolver ghi chú các phiên bản doanh nghiệp và chế độ phiên làm việc tùy chọn. Không để đội ngũ suy luận các tùy chọn này.
@dataclass(frozen=True)
class RecaptchaV3Policy:
target_id: str
website_url: str
website_key: str
page_action: str
minimum_score: float
enterprise: bool
is_session: bool
proxy_profile: str | None
allowed_crew_role: str
max_attempts: int = 1
Nếu mục tiêu được phê duyệt sử dụng doanh nghiệp, hãy lưu trữ thông tin đó trong chính sách. Nếu chế độ phiên làm việc cần thiết, xử lý các giá trị phiên được trả về bên trong dịch vụ phiên ứng dụng và giữ chúng khỏi đầu ra của đội ngũ.
| Thiết kế | Tính toàn vẹn tham số | An toàn bí mật | Đảm bảo trạng thái trang | Khuyến nghị |
|---|---|---|---|---|
| Mô hình cung cấp URL, khóa và hành động | Thấp | Thấp | Thấp | Tránh |
| Công cụ trả về token cho đội ngũ | Trung bình | Thấp | Thấp | Tránh |
| Công cụ được giải quyết bởi bảng tra cứu và xác minh | Cao | Cao | Cao | Ưa tiên |
| Bước xác minh chỉ dành cho con người | Cao | Cao | Cao | Sử dụng cho trạng thái nhạy cảm hoặc không chắc chắn |
Thiết kế được ưa chuộng cấp quyền ra quyết định cho mô hình nhưng giữ quyền thực thi bên trong mã tin cậy.
Theo dõi các trường đã che đi như:
SAFE_FIELDS = {
"target_id",
"crew_role",
"action_match",
"task_attempted",
"provider_category",
"duration_ms",
"verified",
"review_reason",
}
def safe_event(event: dict) -> dict:
return {key: event[key] for key in SAFE_FIELDS if key in event}
Trang trạng thái CapSolver có thể giúp phân biệt khả năng sẵn sàng của nhà cung cấp với các lỗi ứng dụng cụ thể.
import pytest
@pytest.mark.asyncio
async def test_unknown_target_stops_before_task():
result = await solve_approved_recaptcha_v3.run(
target_id="unknown",
crew_role="verification_specialist",
observed_action="login",
observed_site_key="x",
state_id="state-1",
)
assert result["status"] == "stopped"
assert result["task_attempted"] is False
@pytest.mark.asyncio
async def test_action_mismatch_requests_review():
result = await solve_approved_recaptcha_v3.run(
target_id="approved_login_test",
crew_role="verification_specialist",
observed_action="checkout",
observed_site_key="PUBLIC_SITE_KEY",
state_id="state-2",
)
assert result["status"] == "review_required"
assert result["task_attempted"] is False
Cũng kiểm tra chặn thử lại, che đi bí mật, xử lý token thiếu, chính sách doanh nghiệp và lỗi xác minh trang.
Mã thưởng: Sử dụng mã WEBS tại Bảng điều khiển CapSolver để nhận thêm 5% thưởng cho mỗi lần nạp tiền.
Trang FAQ giải CAPTCHA của CapSolver cung cấp hướng dẫn bổ sung về chu kỳ cuộc sống nhiệm vụ.
Sử dụng trình giải reCAPTCHA v3 của CrewAI chỉ trên các trang bạn sở hữu, kiểm thử hoặc có sự cho phép rõ ràng để tự động hóa. 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 truy cập nội bộ. Một khóa trang công khai không cấp phép truy cập vào quy trình được bảo vệ. Giữ các khoản nộp có hậu quả, thanh toán, thay đổi tài khoản và quyết định dữ liệu nhạy cảm phía sau các kiểm soát phê duyệt riêng biệt.
Một trình giải reCAPTCHA v3 của CrewAI trong môi trường sản xuất nên có phạm vi hẹp, kiểu dữ liệu rõ ràng và được kiểm soát bởi chính sách. CrewAI có thể xác định nhu cầu xác minh, nhưng mã tin cậy phải giải quyết mục tiêu, khóa trang, hành động trang, điểm số, chế độ doanh nghiệp và cài đặt mạng. CapSolver nên chạy một lần cho trạng thái đã xác minh, token nên được gửi từ phía máy chủ, và đội ngũ nên nhận chỉ kết quả đã che đi sau khi trang mong muốn được xác minh.
Bắt đầu triển khai có quyền hạn với CapSolver, kiểm tra trên trang được kiểm soát và thêm các bài kiểm tra tham số, gọi lặp lại, che đi và trạng thái trang trước khi sử dụng trong sản xuất.
CrewAI có thể gọi công cụ có kiểu dữ liệu mà ủy quyền cho trình thực thi CapSolver được tài liệu hóa. Giữ việc giải quyết mục tiêu, bí mật, gửi token và xác minh bên trong mã ứng dụng tin cậy.
URL mục tiêu và khóa trang là bắt buộc. Hành động trang, điểm số tối thiểu, cài đặt doanh nghiệp, chế độ phiên làm việc và proxy phụ thuộc vào cấu hình mục tiêu được phê duyệt.
Không. Quan sát hành động từ trang được phê duyệt trực tiếp và so sánh với giá trị chính sách phía máy chủ.
Không. Gửi nó bên trong mã tin cậy và chỉ trả lại trạng thái đã xác minh, yêu cầu kiểm tra hoặc dừng.
Mặc định, chỉ thực hiện một lần thử cho mỗi trạng thái ứng dụng quan sát. Một lần thử thứ hai nên yêu cầu quan sát mới và quyết định chính sách rõ ràng.
Đánh giá CloakBrowser năm 2026 bao gồm tính năng, giá cả, giấy phép, các tùy chọn triển khai, ưu điểm, hạn chế, các lựa chọn thay thế và các trường hợp sử dụng lý tưởng.

Tích hợp CloakBrowser với CapSolver thông qua tự động hóa Python tương thích Playwright, bao gồm reCAPTCHA v2, nhiệm vụ hình ảnh, code và xử lý sự cố.
