CAPSOLVER
ブログ
Cloudflare TurnstileをLlamaIndexエージェントで解決する方法

LlamaIndexエージェントでCloudflare Turnstileを解決する方法

Logo of CapSolver

Sora Fujimoto

How to use CapSolver

27-Aug-2026

TL;DR

  • LlamaIndexのFunctionTool.from_defaults()で狭いCapSolver Turnstile関数をラップします。
  • 記載されているAntiTurnstileTaskProxyLessタスクを使用し、正確なページURLとサイトキーを指定します。
  • 認証されたページがこれらのオプション値を公開している場合にのみactioncdataを送信します。
  • 解決トークンを長期的なエージェントメモリに保存する代わりに、決定論的なブラウザコードに返します。
  • 承認済みホストの検証、1回の制限付きリトライ、トレースのマスキング、および本番環境前の人間レビューの分岐を追加します。

イントロダクション

LlamaIndexエージェントでCloudflare Turnstileを安全に解決する最も良い方法は、CapSolverを型付き関数ツールとして公開し、ブラウザの状態、シークレット、認証チェックをモデルの外に保つことです。LlamaIndexは、サポートされているチャレンジが次の承認されたステップをブロックしていることを決定できますが、決定論的なPythonコードはターゲットを検証し、文書化されたAntiTurnstileTaskProxyLessを構築し、ブラウザコントローラーに短期間の解決トークンを返します。これはCapSolver AIエージェントアーキテクチャに従います:モデルが決定し、ツールアダプターがアクションを定義し、コア解決レイヤーが実行します。このガイドでは、正確なTurnstileフィールド、LlamaIndexのFunctionTool実装、FunctionAgentワークフロー、セキュアなトークンの受け渡し、制限付きリトライ、およびQA、RPA、許可されたブラウザオートメーションのための責任ある使用制御を紹介します。

LlamaIndex FunctionToolが適している理由

LlamaIndexではツールがエージェント向けAPIとして扱われます。その公式ツールドキュメンテーションでは、FunctionToolが同期または非同期のPython関数をラップでき、関数シグネチャからスキーマを推論できると説明されています。ツール名、説明、注釈、ドキュストリングがモデルが呼び出すタイミングに影響を与えます。

この境界はチャレンジの復元に役立ちます。モデルは任意の解決コードを生成したり、CapSolver APIキーを受け取ってはいけません。狭い関数は、承認されたページURL、Turnstileサイトキー、およびオプションのウィジェットメタデータのみを受け入れます。

CapSolver AIブログではエージェントの統合がカバーされており、CapSolver AIと自動化のFAQではチャレンジの復元が既存のエージェントスタックとどのように補完されるかが説明されています。

公式Turnstileタスクの理解

CapSolverのCloudflare TurnstileドキュメンテーションではAntiTurnstileTaskProxyLessが指定されています。このタスクにはwebsiteURLwebsiteKeyが必要です。オプションのメタデータにはウィジェットのactioncdata値が含まれる場合があります。

フィールド 必須 ソース 目的
type はい 固定 AntiTurnstileTaskProxyLess
websiteURL はい 承認された現在のページ 解決をページに関連付けます
websiteKey はい Turnstileウィジェット ウィジェット構成を識別します
metadata.action いいえ data-action ウィジェットのアクション値を保持します
metadata.cdata いいえ data-cdata ウィジェットで使用されるカスタマーデータを保持します

CapSolverは管理型、非対話型、および非表示のTurnstileプレゼンテーションを自動的にサポートするため、タスクにはサブタイプは必要ありません。CloudflareのTurnstileドキュメンテーションでは、ウィジェットとサイトオーナーが使用するサーバーサイド検証プロセスが説明されています。

LlamaIndexとCapSolverのインストール

bash Copy
pip install llama-index llama-index-llms-openai capsolver

ユーザーのドキュメンテーションに記載されているより広範なCapSolverエージェントアーキテクチャをインストールするには、コアとエージェントパッケージもインストールしてください:

bash Copy
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install git+https://github.com/capsolver-ai/capsolver-agent.git

プロンプト外でシークレットを構成します:

bash Copy
export CAPSOLVER_API_KEY="CAP-xxxxxxxxxxxxxxxx"
export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"

以下の直接SDK例では、正確なTurnstileタスクフィールドが使用されます。LlamaIndexはフレームワークのシェルを提供し、CapSolverがタスクを実行します。

型付きTurnstile関数の作成

CapSolverに送信する前にURLを検証します。モデルが任意のホスト名を選択できないようにします。

python Copy
import os
from typing import Annotated
from urllib.parse import urlparse

import capsolver

capsolver.api_key = os.environ["CAPSOLVER_API_KEY"]

ALLOWED_HOSTS = {
    "staging.example.com",
    "qa.example.com",
}


def solve_turnstile(
    website_url: Annotated[str, "承認されたHTTPSページに含まれるTurnstile"],
    website_key: Annotated[str, "ページからの正確なTurnstileサイトキー"],
    action: Annotated[str, "オプションのdata-action値"] = "",
    cdata: Annotated[str, "オプションのdata-cdata値"] = "",
) -> dict:
    """承認されたページのCloudflare Turnstileを解決し、トークンを返します。"""
    parsed = urlparse(website_url)
    if parsed.scheme != "https" or parsed.hostname not in ALLOWED_HOSTS:
        return {
            "success": False,
            "error": "ターゲットは承認されたホスト名の許可リスト外です",
        }

    if not website_key.startswith("0x4"):
        return {
            "success": False,
            "error": "予期せぬTurnstileサイトキーの形式",
        }

    task = {
        "type": "AntiTurnstileTaskProxyLess",
        "websiteURL": website_url,
        "websiteKey": website_key,
    }

    metadata = {}
    if action:
        metadata["action"] = action
    if cdata:
        metadata["cdata"] = cdata
    if metadata:
        task["metadata"] = metadata

    try:
        solution = capsolver.solve(task)
        token = solution.get("token")
        if not token:
            return {"success": False, "error": "トークンが返されませんでした"}
        return {
            "success": True,
            "token": token,
            "solution_type": solution.get("type", "turnstile"),
        }
    except Exception as exc:
        return {"success": False, "error": str(exc)}

形式チェックは有用な早期警告ですが、承認されたページからの正確なパラメータ抽出を置き換えることはできません。開発中にウィジェットの構成を検査する必要がある場合は、CapSolverブラウザ拡張ガイドを使用してください。

関数をLlamaIndexでラップ

FunctionTool.from_defaults()は関数シグネチャとドキュストリングをエージェントツールスキーマに変換します。

python Copy
from llama_index.core.tools import FunctionTool

turnstile_tool = FunctionTool.from_defaults(
    fn=solve_turnstile,
    name="solve_turnstile",
    description=(
        "承認されたHTTPSページでのCloudflare Turnstileのみを解決します。"
        "信頼できるブラウザコントローラーから提供された正確なページURL、サイトキー、"
        "およびオプションのaction/cdataを使用してください。"
    ),
)

名前を短くし、説明を操作的にしてください。ツールを一般的なアクセスメカニズムとして説明しないでください。モデルは、すでに承認されたワークフロー内の復元アクションであることを理解する必要があります。

LlamaIndex FunctionAgentにツールを追加

LlamaIndexのFunctionAgentは、LLMのツール呼び出し機能を使用してツールを選択および実行します。

python Copy
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI

llm = OpenAI(model="gpt-4o-mini", temperature=0)

agent = FunctionAgent(
    tools=[turnstile_tool],
    llm=llm,
    system_prompt=(
        "あなたは承認されたブラウザワークフローのみを操作します。"
        "信頼できるアプリケーションから正確なページURLとサイトキーが提供された場合にのみ"
        "solve_turnstileを呼び出してください。ターゲット、キー、アクション、cdataを発明しないでください。"
        "ツールを1回だけ呼び出してください。失敗した場合、オペレーターのレビューを求めて停止してください。"
    ),
)

決定論的なブラウザコードで生成されたパラメータで実行を開始します:

python Copy
import asyncio

async def main():
    response = await agent.run(
        "承認されたステージングワークフローは、"
        "https://staging.example.com/account-checkでTurnstileを見つけ、"
        "サイトキー0x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAとアクション"
        "account_checkを提供しました。登録されたツールを1回呼び出し、"
        "構造化された結果を返してください。"
    )
    print(response)

asyncio.run(main())

本番環境では、信頼できないユーザーのテキストからこのメッセージを直接構築しないでください。ブラウザコントローラーが値を抽出し、検証し、シリアライズする必要があります。

トークンの消費をモデル外に保つ

Turnstileトークンは短期間で、サイトワークフローに紐づいています。可能であれば、信頼できるツールの結果から決定論的なブラウザコードに直接渡します。

python Copy
async def apply_turnstile_token(page, token: str) -> None:
    await page.evaluate(
        """
        (token) => {
          const field = document.querySelector(
            'input[name="cf-turnstile-response"]'
          );
          if (!field) {
            throw new Error('Turnstile response field not found');
          }
          field.value = token;
          field.dispatchEvent(new Event('input', { bubbles: true }));
          field.dispatchEvent(new Event('change', { bubbles: true }));
        }
        """,
        token,
    )

一部のアプリケーションではコールバックベースのレンダリングやサーバー管理の送信が使用されます。自前のステージングアプリケーションでテストし、サポートされている統合に従ってください。CloudflareのSiteverifyドキュメンテーションでは、サイトオーナーがトークンをサーバーサイドで検証する方法が説明されています。

CapSolver Turnstileガイドでは実装の文脈が提供され、CapSolverトラブルシューティングFAQでは拒否された解決策の診断に役立ちます。

1回の制限付きリトライを追加

エージェントが無限ループしないようにします。検証失敗を最終的なものとして分類し、一時的なタイムアウトに対して最大1回のリトライを許可します。

python Copy
import asyncio

async def solve_with_policy(params: dict) -> dict:
    last_error = "unknown error"

    for attempt in range(1, 3):
        result = solve_turnstile(**params)
        if result.get("success"):
            return {**result, "attempt": attempt}

        last_error = result.get("error", last_error)
        normalized = last_error.lower()
        if "allowlist" in normalized or "site-key" in normalized:
            break
        if attempt == 1:
            await asyncio.sleep(2)

    return {
        "success": False,
        "error": last_error,
        "requires_operator_review": True,
    }

ホスト名、タスクタイプ、期間、リトライ回数、正規化された結果をログに記録してください。トークン、APIキー、クッキー、フォームの内容をログに記録しないでください。

トークンモード vs ブラウザモード

モード 最適な用途 入力 出力
トークンモード 知られているTurnstile URLとサイトキー URL、キー、オプションのメタデータ 解決トークン
ブラウザモード 既存のPlaywrightセッション内の動的なウィジェット ライブページオブジェクト ページの復元結果
人間のレビュー 繰り返しの失敗またはサポートされていない状態 赤クロされたエラーとスクリーンショットの参照 オペレーターの決定

ユーザー提供のCapSolverエージェントドキュメンテーションではsolve_captchaがコアトークン解決にマッピングされ、solve_on_pageがブラウザ復元にマッピングされます。ページが動的である場合、ブラウザエクストラをインストールし、元のブラウザセッションを維持してください:

bash Copy
pip install "capsolver-agent[browser] @ git+https://github.com/capsolver-ai/capsolver-agent.git"

関連するブラウザワークフローについてはCapSolver自動化チュートリアルを参照してください。サポートされている解決カテゴリについてはCapSolver製品ページをご覧ください。

ボーナスコード: CapSolverダッシュボードでコードWEBSを使用すると、毎回のチャージで追加の5%ボーナスを得られます。

本番環境制御

本番環境のLlamaIndex Turnstile統合では、承認されたホストレジストリ、シークレットの隔離、短期間のトークンの受け渡し、1回の制限付きリトライ、トレースのマスキング、オペレーターのレビュー、および読み取り専用のオートメーションと高影響アクションの厳格な分離を使用する必要があります。

制御 推奨される実装
ターゲットの権限 テナント固有のHTTPS許可リスト
パラメータのソース 信頼できるブラウザコントローラー
シークレットの保存 エクスキューターエンバイロメントのみ
リトライポリシー 一時的なエラーに対して1回のリトライ
トークンの処理 ブラウザへの直接受け渡し; 長期的な保存はしない
トレース トークンやクッキーをマスキング
最終的なアクション 提出や変更を行う前に確認を必要とする

CapSolver CAPTCHA解決FAQではタスクのライフサイクルが説明されており、CapSolverウェブスクレイピングFAQでは運用上の考慮事項がカバーされています。

責任ある使用

この統合は、所有するアプリケーション、テストするアプリケーション、または自動化に明示的な許可を与えたアプリケーションでのみ使用してください。チャレンジの解決は、プライベートデータへのアクセス、アカウントの作成、トランザクションの送信、またはサイトの利用規約を無視する権限を提供しません。レートリミットを適用し、監査トレールを維持し、データの変更やユーザーへの影響があるすべてのアクションに対して確認を要求してください。

結論

LlamaIndexでCloudflare Turnstileを信頼性高く解決するには、CapSolverを狭いFunctionToolとしてし、認証、シークレット、リトライ、トークンの消費を決定論的なコードに保ちます。LlamaIndexエージェントは復元が必要なタイミングを決定し、ツールは文書化されたAntiTurnstileTaskProxyLessを作成し、返されたトークンで同じ承認されたワークフローをブラウザが再開します。

CapSolverから始めて、制御できるステージングページで統合を検証し、本番環境前に許可リストとトレースのマスキングを追加してください。

FAQ

どのLlamaIndexツールクラスを使用すべきですか?

型付きの同期または非同期Python関数をラップするためにFunctionTool.from_defaults()を使用してください。ツール呼び出しモデルの場合、結果のツールをFunctionAgentに渡します。

Turnstileタスクにはプロキシが必要ですか?

文書化されたAntiTurnstileTaskProxyLessはCapSolverのプロキシレスタスクパスを使用するため、タスクにプロキシを提供する必要はありません。

必須フィールドはどれですか?

websiteURLwebsiteKeyが必須です。承認されたウィジェットがそれらを公開している場合にのみmetadata.actionmetadata.cdataを含めます。

トークンはLlamaIndexメモリに保存すべきですか?

いいえ。信頼できるブラウザコードへの直接的な受け渡しを優先し、エージェントに赤クロされた成功または失敗状態のみを返してください。

繰り返しの失敗後に何が起こるべきですか?

URL、サイトキー、オプションのメタデータ、ページ状態を確認してください。1回の制限付きリトライの後、ワークフローをオペレーターのレビューにルーティングしてください。

コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。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