CAPSOLVER
ブログ
CrewAIエージェントでreCAPTCHA v3をCapSolverを使って解決する方法

CrewAIエージェントでreCAPTCHA v3を解決する方法 – CapSolverを使って

Logo of CapSolver

Sora Fujimoto

How to use CapSolver

01-Sep-2026

TL;DR

  • CrewAI reCAPTCHA v3ソルバーは、一般的なブラウザや任意のURL関数ではなく、狭義のタイプのツールであるべきです。
  • サーバーサイドのレジストリからターゲットURL、サイトキー、期待されるpageAction、スコアポリシーを解決するべきです。
  • CapSolverのドキュメントに記載されているreCAPTCHA v3タスクパラメータを使用し、エンタープライズ、プロキシ、セッション設定を明示的に保つべきです。
  • トークンを信頼できるアプリケーションコードに送信し、CrewAIエージェントに返すのは赤紙化されたステータスオブジェクトのみにするべきです。
  • ソルバーの結果を中間ステップとして扱い、クルーが続行する前に意図したページ状態が変化したことを確認するべきです。

イントロダクション

CrewAIでreCAPTCHA v3を安全に解決する最も良い方法は、CapSolverをタイプ化され、ポリシー制御されたツールを通じて公開することです。CrewAIはタスクが必要なときに検証を決定すべきですが、信頼できるアプリケーションコードは承認されたターゲット、サイトキー、ページアクション、プロキシモード、スコアポリシーを解決すべきです。CapSolverのreCAPTCHA v3ドキュメントでは、サポートされているタスクタイプとパラメータが定義されており、ユーザーが提供するAgent SDKは構造化されたツールコールをcapsolver-coreにマッピングします。ツールはサーバーサイドでトークンを送信し、結果のページ状態を検証し、クルーに小さな結果(例: verifiedreview_requiredstopped)を返すべきです。この設計により、URLのずれ、アクションの推測、シークレットの漏洩、重複解決、誤った成功信号を防ぐことができます。

reCAPTCHA v3が異なるCrewAIツールを必要とする理由

reCAPTCHA v3はスコアベースで、通常は可視チェックボックスなしで動作します。ターゲットアプリケーションはアクションを呼び出し、トークンを取得し、サーバーでそのトークンを評価します。したがって、CrewAIワークフローは視覚的なチャレンジを一度も見ることなく失敗する可能性があります。

一般的な原因は会話ではなく運用上のものです:

  • 使用されたツールが間違ったサイトキーを使用している;
  • pageActionがページの実行時アクションと一致していない;
  • トークンが別のルートやブラウザ状態に送信されている;
  • タスクタイプがStandardまたはEnterpriseと一致していない;
  • クルーがタスクの完了をアプリケーションの検証と誤って扱っている;
  • 同じステップで状態変更なしに複数のトークンが作成されている。

CapSolver reCAPTCHAブログには実装ガイドが掲載されており、AIと自動化のFAQは安全なエージェントの境界を定義するのに役立ちます。

クルーの役割とソルバー権限を分離する

マルチエージェントクルーは、責任が明確な場合に最も効果的です。

役割 許可された責任 制限されるもの
ナビゲーター 承認されたアプリケーション状態を観察する APIキー、プロキシ資格情報、ローカルトークン
検証プランナー 承認されたステップがツールを必要とするかどうかを決定する 任意のURLまたはサイトキー
CapSolverツール ポリシーを解決し、1つのタスクを作成し、トークンを送信する 無制限のリトライまたは関係のないブラウジング
状態検証者 期待されるルートとセマンティックマーカーを確認する ビジネス承認の決定
レビュー者 失敗時の赤紙化された証拠を検査する シークレットセッション素材

モデルは登録されたターゲットIDを選択することができるが、ターゲットURLやチャレンジパラメータを構築してはならない。

公式のCrewAIツールパターンを使用する

CrewAIのカスタムツールドキュメントは、BaseToolにPydantic args_schema@toolデコレータ、タイプ付き結果、I/Oバウンド操作の非同期ツールをサポートしています。

ユーザーが提供するCapSolver Agentドキュメントは、capsolver-agentcapsolver-coreをラップしていることを説明しています: create_executor()はエクスキュータを生成し、executor.execute("solve_captcha", args)はタイプ付きリクエストをコアエンジンにディスパッチします。

ドキュメントに記載されているパッケージをインストールしてください:

bash Copy
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-..."

キーはランタイムシークレットストアに保持し、クルーのプロンプト、タスクの説明、ツールの結果に配置しないでください。

信頼できるターゲットレジストリを定義する

python Copy
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コールで見つかると説明されています。

python Copy
@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("アプリケーション状態が準備ができていません")

ツールは不一致を拒否すべきであり、曖昧なパラメータでトークンを作成すべきではありません。

CapSolver v3パラメータを理解する

パラメータ 目的 ポリシーのルール
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製品ページは、実装前にサポートされるタスクファミリを確認するのに役立ちます。

タイプ化されたCrewAIツールを作成する

python Copy
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キー、プロキシ、クッキー、およびプロバイダの元の応答を除外しています。

シークレットを解決し、トークンをサーバーサイドで送信する

python Copy
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セッションサービスを表します。ソルバーのツールはそれを使いますが、モデルはその資格情報を受け取らないでください。

非同期ツールを実装する

python Copy
@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()

この実装により、資格情報は信頼できるコードに保持され、クルーにはポリシーに安全なステータスのみが返されます。

ツールを1つのエージェントに接続する

python Copy
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つの役割に制限することで、認証と監査が明確になります。

重複したツール呼び出しを防ぐ

python Copy
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のメモリ、トレース、詳細ログはツール出力を保持する可能性があります。以下のもののみを返してください:

json Copy
{
  "status": "verified",
  "target_id": "approved_login_test",
  "state_id": "state_7c19",
  "reason": "アプリケーション状態が検証されました",
  "task_attempted": true
}

トークン、CapSolver APIキー、プロキシ値、ブラウザクッキー、元のHTML、パスワード、または個人フォームデータを決して返さないでください。

CapSolverのエラーとトラブルシューティングFAQは、クルーに元の応答を暴露せずにプロバイダーのエラー分類をサポートするのに役立ちます。

提出後にページを検証する

検証者は複数の独立したシグナルを必要とします:

python Copy
@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はエントープライズバージョンとオプションのセッションモードをドキュメント化しています。クルーがこれらのオプションを推測しないようにしてください。

python Copy
@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、キー、アクションを提供 避けた方がよい
ツールがトークンをクルーに返す 避けた方がよい
レジストリ解決されたツールが送信および検証 推奨
人間のみの検証ステップ 機密または不明な状態で使用

推奨されるデザインは、モデルに決定権を付与しながらも、実行権を信頼できるコード内に保ちます。

オペレーションメトリクスを追加

マスキングされたフィールドを追跡してください。例えば:

  • ターゲットID;
  • クルー役割;
  • 観測されたアクションの一致;
  • タスクの試行;
  • プロバイダのステータスカテゴリ;
  • 提出時間;
  • ページの検証;
  • マニュアルレビューの理由。
python Copy
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ステータスページは、プロバイダの利用可能性とアプリケーション固有のエラーを区別するのに役立ちます。

本番環境前のツールテスト

python Copy
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%ボーナスが得られます。

本番環境準備リスト

  • サーバーサイドですべてのターゲットURL、サイトキー、アクション、スコア、およびエントープライズ設定を登録してください。
  • 1つのCrewAIロールがソルバーツールを呼び出してください。
  • タスク作成前に観測されたURL、サイトキー、アクション、および状態を検証してください。
  • CapSolverのドキュメント化されたreCAPTCHA v3パラメータを使用してください。
  • トークンを信頼できるアプリケーションコード内で送信してください。
  • クルーにマスキングされた構造化結果のみを返してください。
  • 各観測されたアプリケーション状態に対して1回の試行を許可してください。
  • ルート、セマンティックマーカー、ステータス、チャレンジの不在を検証してください。
  • キー、トークン、プロキシデータ、クッキー、フォームデータをメモリおよびトレースから除外してください。
  • 不確実または機密な状態を人間のレビュアーにルーティングしてください。

CapSolver CAPTCHAソルビングFAQは、追加のタスクライフサイクルのガイダンスを提供します。

責任ある使用

CrewAIのreCAPTCHA v3ソルバーは、所有している、テストしている、または自動化に明示的な許可を与えているサイトでのみ使用してください。利用規約、レートリミット、認証の境界、プライバシ義務、および内部アクセスポリシーを尊重してください。公開されているサイトキーは、保護されたワークフローにアクセスする権限を提供するものではありません。重要な提出、支払い、アカウント変更、機密データの決定は、別途承認コントロールの後ろに保つ必要があります。

結論

本番環境用のCrewAI reCAPTCHA v3ソルバーは、狭く、型付きで、ポリシーで制御されている必要があります。CrewAIは検証の必要性を識別できますが、信頼できるコードがターゲット、サイトキー、ページアクション、スコア、エントープライズモード、およびネットワーク設定を解決する必要があります。CapSolverは検証された状態に対して一度実行され、トークンはサーバーサイドで送信され、意図したページが検証された後、クルーにマスキングされた結果のみを返す必要があります。

CapSolverで認可された実装を開始し、制御されたページでテストし、本番環境使用前にパラメータ、重複呼び出し、マスキング、ページ状態のテストを追加してください。

FAQ

CrewAIはCapSolverに直接呼び出せますか?

CrewAIは、ドキュメント化されたCapSolverエージェントエクセキューターにデリゲートする型付きツールを呼び出すことができます。ターゲット解決、シークレット、トークン送信、検証は信頼できるアプリケーションコード内で保持してください。

reCAPTCHA v3で必要なパラメータはどれですか?

ターゲットURLとサイトキーが必須です。ページアクション、最小スコア、エントープライズ設定、セッションモード、プロキシは、承認されたターゲット構成に依存します。

モデルがページアクションを選択すべきですか?

いいえ。ライブ承認ページからアクションを観測し、サーバーサイドのポリシー値と比較してください。

CapSolverトークンをクルーに返すべきですか?

いいえ。信頼できるコード内で送信し、検証済み、レビューが必要、または停止状態のみを返してください。

1つのCrewAIタスクで何回の試行をすべきですか?

デフォルトでは、観測されたアプリケーション状態ごとに1回の試行を使用してください。2回目の試行は、新しい観測と明示的なポリシー決定が必要です。

コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。

もっと見る

CapSolver MCP 公式登録 チュートリアルでは、登録記録、uvx コマンド、APIキー変数、およびアクティブな stdio 状態を表示します。
CapSolver MCPの公式MCPレジストリからのインストール方法

オフィシャル MCP レジストリで CapSolver MCP を検索し、uvx または pip を使用してバージョン 0.1.3 をインストールし、ローカルクライアントを設定し、stdio ツールを確認してください。

ai
Logo of CapSolver

Sora Fujimoto

18-Sep-2026

Pydantic AI CAPTCHA ツール: タイプ入力とソルバーの結果
Pydantic AI CAPTCHA ツール: タイプ入力とソルバーの結果

Pydantic AIに公式のCapSolverアダプタを使用してCAPTCHAツールを追加し、ローカルでツールの実行をテストし、タイプされた入力と構造化されたソルバーの結果を処理します。

ai
Logo of CapSolver

Sora Fujimoto

18-Sep-2026

MCPとCLIインターフェースが一つのAIエージェントツールサービスに接続されている
MCP 対 CLI における AIエージェントの コンテキストコストとフェールヤー処理

AIエージェントのMCPとCLIインターフェースを、ツール発見、コンテキストコスト、セキュリティ、デバッグ、フェールチャーアイド、およびハイブリッドアーキテクチャについて比較してください。

ai
Logo of CapSolver

Sora Fujimoto

18-Sep-2026

AIブラウザエージェントは、目的のフォームを選択し、そのCAPTCHAウィジェットをマッチングし、提出結果を確認します。
AIブラウザエージェントにおける複数のCAPTCHAウィジェットの取り扱い方法

1ページに複数のCAPTCHAウィジェットを処理するには、明示的なフォーム所有権、ソルバーのパラメータ、結果のルーティング、および意図されたAIエージェントのアクションの確認を備える。

ai
Logo of CapSolver

Lucas Mitchell

15-Sep-2026

AIエージェント対スクリプト:ウェブオートメーションにおける選択の仕方と主要な意思決定の図付き
AIエージェント対スクリプト:ウェブオートメーションにおける選択の仕方

タスクの不確実性、テスト可能性、コスト、信頼性のある実行に必要な制御を基に、AIエージェント、スクリプト、ハイブリッドWeb自動化のいずれかを選択してください。

ai
Logo of CapSolver

Lucas Mitchell

11-Sep-2026

CapSolver MCP ServerはAIエージェントを5つの自動化ツールに接続します
CapSolver MCP サーバーは現在、AIエージェント向けに利用可能になりました

PyPIからCapSolver MCP Serverをインストールしてください。そして、互換性のあるAIエージェントに、Model Context Protocolを通じて認可されたCAPTCHAの処理のための5つのツールを提供してください。

ai
Logo of CapSolver

Sora Fujimoto

10-Sep-2026