
Sora Fujimoto
AI Solutions Architect

pageAction、スコアポリシーを解決するべきです。CrewAIでreCAPTCHA v3を安全に解決する最も良い方法は、CapSolverをタイプ化され、ポリシー制御されたツールを通じて公開することです。CrewAIはタスクが必要なときに検証を決定すべきですが、信頼できるアプリケーションコードは承認されたターゲット、サイトキー、ページアクション、プロキシモード、スコアポリシーを解決すべきです。CapSolverのreCAPTCHA v3ドキュメントでは、サポートされているタスクタイプとパラメータが定義されており、ユーザーが提供するAgent SDKは構造化されたツールコールをcapsolver-coreにマッピングします。ツールはサーバーサイドでトークンを送信し、結果のページ状態を検証し、クルーに小さな結果(例: verified、review_required、stopped)を返すべきです。この設計により、URLのずれ、アクションの推測、シークレットの漏洩、重複解決、誤った成功信号を防ぐことができます。
reCAPTCHA v3はスコアベースで、通常は可視チェックボックスなしで動作します。ターゲットアプリケーションはアクションを呼び出し、トークンを取得し、サーバーでそのトークンを評価します。したがって、CrewAIワークフローは視覚的なチャレンジを一度も見ることなく失敗する可能性があります。
一般的な原因は会話ではなく運用上のものです:
pageActionがページの実行時アクションと一致していない;CapSolver reCAPTCHAブログには実装ガイドが掲載されており、AIと自動化のFAQは安全なエージェントの境界を定義するのに役立ちます。
マルチエージェントクルーは、責任が明確な場合に最も効果的です。
| 役割 | 許可された責任 | 制限されるもの |
|---|---|---|
| ナビゲーター | 承認されたアプリケーション状態を観察する | APIキー、プロキシ資格情報、ローカルトークン |
| 検証プランナー | 承認されたステップがツールを必要とするかどうかを決定する | 任意のURLまたはサイトキー |
| CapSolverツール | ポリシーを解決し、1つのタスクを作成し、トークンを送信する | 無制限のリトライまたは関係のないブラウジング |
| 状態検証者 | 期待されるルートとセマンティックマーカーを確認する | ビジネス承認の決定 |
| レビュー者 | 失敗時の赤紙化された証拠を検査する | シークレットセッション素材 |
モデルは登録されたターゲットIDを選択することができるが、ターゲットURLやチャレンジパラメータを構築してはならない。
CrewAIのカスタムツールドキュメントは、BaseToolにPydantic args_schema、@toolデコレータ、タイプ付き結果、I/Oバウンド操作の非同期ツールをサポートしています。
ユーザーが提供するCapSolver Agentドキュメントは、capsolver-agentがcapsolver-coreをラップしていることを説明しています: create_executor()はエクスキュータを生成し、executor.execute("solve_captcha", args)はタイプ付きリクエストをコアエンジンにディスパッチします。
ドキュメントに記載されているパッケージをインストールしてください:
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-..."
キーはランタイムシークレットストアに保持し、クルーのプロンプト、タスクの説明、ツールの結果に配置しないでください。
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",
)
}
公開されたサイトキーはアカウントのシークレットではありませんが、モデルがツールをリダイレクトしないように信頼できる構成から取得する必要があります。
pageActionを推測する代わりに観察するCapSolverのreCAPTCHA v3ドキュメントでは、pageActionがオプションのタスクフィールドとしてリストされ、その値はページのgrecaptcha.executeコールで見つかると説明されています。
@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("観察されたURLがポリシーと一致しません")
if observation.observed_site_key != policy.website_key:
raise ValueError("観察されたサイトキーがポリシーと一致しません")
if observation.observed_action != policy.page_action:
raise ValueError("観察されたページアクションがポリシーと一致しません")
if observation.form_state != "READY_FOR_VERIFICATION":
raise ValueError("アプリケーション状態が準備ができていません")
ツールは不一致を拒否すべきであり、曖昧なパラメータでトークンを作成すべきではありません。
| パラメータ | 目的 | ポリシーのルール |
|---|---|---|
captcha_type |
Agent SDKでreCAPTCHA v3を選択する | 固定値はreCaptchaV3 |
website_url |
チャレンジをホストするページ | レジストリから読み込む |
website_key |
公開サイトキー | レジストリから読み込み、ページと照合する |
page_action |
実行時v3アクション | 観察と一致する必要がある |
min_score |
要求された最小スコア | ターゲットポリシーで設定される |
enterprise |
StandardまたはEnterpriseパス | インテグレーション構成で固定される |
proxy |
オプションのネットワークID | 必要な場合、シークレットプロファイルから解決する |
CapSolverはStandard、Enterprise、プロキシ、プロキシレスなタスクのバリエーションをドキュメントに記載しています。関連モードが有効な場合、結果にはgRecaptchaResponse、ユーザーのエージェントデータ、セッション値が含まれる場合があります。
CapSolver製品ページは、実装前にサポートされるタスクファミリを確認するのに役立ちます。
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="登録されたターゲット識別子")
crew_role: str = Field(description="検証をリクエストする役割")
observed_action: str = Field(description="ライブページで観察されたアクション")
observed_site_key: str = Field(description="ライブページで観察されたサイトキー")
state_id: str = Field(description="非透明なサーバーサイドアプリケーション状態識別子")
class SolveResult(BaseModel):
status: Literal["verified", "review_required", "stopped"]
target_id: str
state_id: str
reason: str
task_attempted: bool
結果モデルは意図的にトークン、APIキー、プロキシ、クッキー、およびプロバイダの元の応答を除外しています。
PROXY_VAULT = {
"approved_proxy": os.environ.get("APPROVED_PROXY")
}
async def submit_token_and_verify(
*,
state_id: str,
token: str,
policy: RecaptchaV3Policy,
) -> bool:
"""アプリケーション所有の送信および検証関数。"""
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は、認可されたブラウザまたはHTTPセッションサービスを表します。ソルバーのツールはそれを使いますが、モデルはその資格情報を受け取らないでください。
@tool("承認されたreCAPTCHA v3を解決", 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:
"""登録されたreCAPTCHA v3ステップを解決し、アプリケーション状態を検証します。"""
policy = TARGETS.get(target_id)
if policy is None:
return SolveResult(
status="stopped",
target_id=target_id,
state_id=state_id,
reason="不明なターゲット",
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="このツールを呼び出す権限がありません",
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="観察されたアクションがターゲットポリシーと一致しません",
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="観察されたサイトキーがターゲットポリシーと一致しません",
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="CapSolverタスクが完了しませんでした",
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="タスク結果にトークンが含まれていません",
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="アプリケーション状態が検証されました" if verified else "アプリケーション状態が検証されませんでした",
task_attempted=True,
).model_dump()
この実装により、資格情報は信頼できるコードに保持され、クルーにはポリシーに安全なステータスのみが返されます。
from crewai import Agent, Crew, Process, Task
verification_agent = Agent(
role="verification_specialist",
goal="登録された検証ステップのみを完了し、検証された状態を報告する",
backstory=(
"あなたは承認された検証ツールを操作します。あなたはターゲットID、サイトキー、アクション、資格情報、または成功状態を発明しません。"
),
tools=[solve_approved_recaptcha_v3],
allow_delegation=False,
verbose=True,
)
verification_task = Task(
description=(
"提供された観察に登録されたターゲットに対して、URL、サイトキー、アクション、および状態が確認された場合にのみツールを1回呼び出してください。シークレットを含まない構造化されたステータスを返してください。"
),
expected_output="構造化されたverified、review_required、またはstoppedの結果。",
agent=verification_agent,
)
crew = Crew(
agents=[verification_agent],
tasks=[verification_task],
process=Process.sequential,
verbose=True,
)
ツールをすべてのエージェントに接続しないでください。1つの役割に制限することで、認証と監査が明確になります。
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
executor.execute()の前にclaim_attempt()を呼び出してください。繰り返されるクルーのメッセージは同じアプリケーション状態に対して2番目のトークンを作成してはなりません。
CrewAIのメモリ、トレース、詳細ログはツール出力を保持する可能性があります。以下のもののみを返してください:
{
"status": "verified",
"target_id": "approved_login_test",
"state_id": "state_7c19",
"reason": "アプリケーション状態が検証されました",
"task_attempted": true
}
トークン、CapSolver APIキー、プロキシ値、ブラウザクッキー、元のHTML、パスワード、または個人フォームデータを決して返さないでください。
CapSolverのエラーとトラブルシューティングFAQは、クルーに元の応答を暴露せずにプロバイダーのエラー分類をサポートするのに役立ちます。
検証者は複数の独立したシグナルを必要とします:
@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
)
変更されたURLだけでは十分ではありません。予期されたルート、セマンティックマーカー、ステータス、および既知のチャレンジやエラー状態の不在を要求してください。
CapSolverはエントープライズバージョンとオプションのセッションモードをドキュメント化しています。クルーがこれらのオプションを推測しないようにしてください。
@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
承認されたターゲットがエントープライズを使用している場合、その事実をポリシーに保存してください。セッションモードが必要な場合は、アプリケーションセッションサービス内で返されたセッション値を処理し、クルーの出力に含めないでください。
| デザイン | パラメータの整合性 | シークレットの安全性 | ページ状態の保証 | 推奨 |
|---|---|---|---|---|
| モデルがURL、キー、アクションを提供 | 低 | 低 | 低 | 避けた方がよい |
| ツールがトークンをクルーに返す | 中 | 低 | 低 | 避けた方がよい |
| レジストリ解決されたツールが送信および検証 | 高 | 高 | 高 | 推奨 |
| 人間のみの検証ステップ | 高 | 高 | 高 | 機密または不明な状態で使用 |
推奨されるデザインは、モデルに決定権を付与しながらも、実行権を信頼できるコード内に保ちます。
マスキングされたフィールドを追跡してください。例えば:
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}
CapSolverステータスページは、プロバイダの利用可能性とアプリケーション固有のエラーを区別するのに役立ちます。
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
重複試行のブロック、シークレットのマスキング、トークンの欠如処理、エントープライズポリシー、ページ検証の失敗もテストしてください。
ボーナスコード: CapSolverダッシュボードでコード WEBS を使用すると、毎回のチャージで追加の5%ボーナスが得られます。
CapSolver CAPTCHAソルビングFAQは、追加のタスクライフサイクルのガイダンスを提供します。
CrewAIのreCAPTCHA v3ソルバーは、所有している、テストしている、または自動化に明示的な許可を与えているサイトでのみ使用してください。利用規約、レートリミット、認証の境界、プライバシ義務、および内部アクセスポリシーを尊重してください。公開されているサイトキーは、保護されたワークフローにアクセスする権限を提供するものではありません。重要な提出、支払い、アカウント変更、機密データの決定は、別途承認コントロールの後ろに保つ必要があります。
本番環境用のCrewAI reCAPTCHA v3ソルバーは、狭く、型付きで、ポリシーで制御されている必要があります。CrewAIは検証の必要性を識別できますが、信頼できるコードがターゲット、サイトキー、ページアクション、スコア、エントープライズモード、およびネットワーク設定を解決する必要があります。CapSolverは検証された状態に対して一度実行され、トークンはサーバーサイドで送信され、意図したページが検証された後、クルーにマスキングされた結果のみを返す必要があります。
CapSolverで認可された実装を開始し、制御されたページでテストし、本番環境使用前にパラメータ、重複呼び出し、マスキング、ページ状態のテストを追加してください。
CrewAIは、ドキュメント化されたCapSolverエージェントエクセキューターにデリゲートする型付きツールを呼び出すことができます。ターゲット解決、シークレット、トークン送信、検証は信頼できるアプリケーションコード内で保持してください。
ターゲットURLとサイトキーが必須です。ページアクション、最小スコア、エントープライズ設定、セッションモード、プロキシは、承認されたターゲット構成に依存します。
いいえ。ライブ承認ページからアクションを観測し、サーバーサイドのポリシー値と比較してください。
いいえ。信頼できるコード内で送信し、検証済み、レビューが必要、または停止状態のみを返してください。
デフォルトでは、観測されたアプリケーション状態ごとに1回の試行を使用してください。2回目の試行は、新しい観測と明示的なポリシー決定が必要です。
CloakBrowser 2026年向けレビュー、特徴、価格、ライセンス、展開オプション、利点、制限、代替、および理想的な使用ケースをカバーしています。

CloakBrowserをCapSolverとPlaywright互換のPythonオートメーションを通じて統合し、reCAPTCHA v2、画像タスク、コード、およびトラブルシューティングを含む。
