
Sora Fujimoto
AI Solutions Architect

FunctionTool.from_defaults()で狭いCapSolver Turnstile関数をラップします。AntiTurnstileTaskProxyLessタスクを使用し、正確なページURLとサイトキーを指定します。actionとcdataを送信します。LlamaIndexエージェントでCloudflare Turnstileを安全に解決する最も良い方法は、CapSolverを型付き関数ツールとして公開し、ブラウザの状態、シークレット、認証チェックをモデルの外に保つことです。LlamaIndexは、サポートされているチャレンジが次の承認されたステップをブロックしていることを決定できますが、決定論的なPythonコードはターゲットを検証し、文書化されたAntiTurnstileTaskProxyLessを構築し、ブラウザコントローラーに短期間の解決トークンを返します。これはCapSolver AIエージェントアーキテクチャに従います:モデルが決定し、ツールアダプターがアクションを定義し、コア解決レイヤーが実行します。このガイドでは、正確なTurnstileフィールド、LlamaIndexのFunctionTool実装、FunctionAgentワークフロー、セキュアなトークンの受け渡し、制限付きリトライ、およびQA、RPA、許可されたブラウザオートメーションのための責任ある使用制御を紹介します。
LlamaIndexではツールがエージェント向けAPIとして扱われます。その公式ツールドキュメンテーションでは、FunctionToolが同期または非同期のPython関数をラップでき、関数シグネチャからスキーマを推論できると説明されています。ツール名、説明、注釈、ドキュストリングがモデルが呼び出すタイミングに影響を与えます。
この境界はチャレンジの復元に役立ちます。モデルは任意の解決コードを生成したり、CapSolver APIキーを受け取ってはいけません。狭い関数は、承認されたページURL、Turnstileサイトキー、およびオプションのウィジェットメタデータのみを受け入れます。
CapSolver AIブログではエージェントの統合がカバーされており、CapSolver AIと自動化のFAQではチャレンジの復元が既存のエージェントスタックとどのように補完されるかが説明されています。
CapSolverのCloudflare TurnstileドキュメンテーションではAntiTurnstileTaskProxyLessが指定されています。このタスクにはwebsiteURLとwebsiteKeyが必要です。オプションのメタデータにはウィジェットのactionとcdata値が含まれる場合があります。
| フィールド | 必須 | ソース | 目的 |
|---|---|---|---|
type |
はい | 固定 | AntiTurnstileTaskProxyLess |
websiteURL |
はい | 承認された現在のページ | 解決をページに関連付けます |
websiteKey |
はい | Turnstileウィジェット | ウィジェット構成を識別します |
metadata.action |
いいえ | data-action |
ウィジェットのアクション値を保持します |
metadata.cdata |
いいえ | data-cdata |
ウィジェットで使用されるカスタマーデータを保持します |
CapSolverは管理型、非対話型、および非表示のTurnstileプレゼンテーションを自動的にサポートするため、タスクにはサブタイプは必要ありません。CloudflareのTurnstileドキュメンテーションでは、ウィジェットとサイトオーナーが使用するサーバーサイド検証プロセスが説明されています。
pip install llama-index llama-index-llms-openai capsolver
ユーザーのドキュメンテーションに記載されているより広範なCapSolverエージェントアーキテクチャをインストールするには、コアとエージェントパッケージもインストールしてください:
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install git+https://github.com/capsolver-ai/capsolver-agent.git
プロンプト外でシークレットを構成します:
export CAPSOLVER_API_KEY="CAP-xxxxxxxxxxxxxxxx"
export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"
以下の直接SDK例では、正確なTurnstileタスクフィールドが使用されます。LlamaIndexはフレームワークのシェルを提供し、CapSolverがタスクを実行します。
CapSolverに送信する前にURLを検証します。モデルが任意のホスト名を選択できないようにします。
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ブラウザ拡張ガイドを使用してください。
FunctionTool.from_defaults()は関数シグネチャとドキュストリングをエージェントツールスキーマに変換します。
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は、LLMのツール呼び出し機能を使用してツールを選択および実行します。
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回だけ呼び出してください。失敗した場合、オペレーターのレビューを求めて停止してください。"
),
)
決定論的なブラウザコードで生成されたパラメータで実行を開始します:
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トークンは短期間で、サイトワークフローに紐づいています。可能であれば、信頼できるツールの結果から決定論的なブラウザコードに直接渡します。
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回のリトライを許可します。
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キー、クッキー、フォームの内容をログに記録しないでください。
| モード | 最適な用途 | 入力 | 出力 |
|---|---|---|---|
| トークンモード | 知られているTurnstile URLとサイトキー | URL、キー、オプションのメタデータ | 解決トークン |
| ブラウザモード | 既存のPlaywrightセッション内の動的なウィジェット | ライブページオブジェクト | ページの復元結果 |
| 人間のレビュー | 繰り返しの失敗またはサポートされていない状態 | 赤クロされたエラーとスクリーンショットの参照 | オペレーターの決定 |
ユーザー提供のCapSolverエージェントドキュメンテーションではsolve_captchaがコアトークン解決にマッピングされ、solve_on_pageがブラウザ復元にマッピングされます。ページが動的である場合、ブラウザエクストラをインストールし、元のブラウザセッションを維持してください:
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から始めて、制御できるステージングページで統合を検証し、本番環境前に許可リストとトレースのマスキングを追加してください。
型付きの同期または非同期Python関数をラップするためにFunctionTool.from_defaults()を使用してください。ツール呼び出しモデルの場合、結果のツールをFunctionAgentに渡します。
文書化されたAntiTurnstileTaskProxyLessはCapSolverのプロキシレスタスクパスを使用するため、タスクにプロキシを提供する必要はありません。
websiteURLとwebsiteKeyが必須です。承認されたウィジェットがそれらを公開している場合にのみmetadata.actionとmetadata.cdataを含めます。
いいえ。信頼できるブラウザコードへの直接的な受け渡しを優先し、エージェントに赤クロされた成功または失敗状態のみを返してください。
URL、サイトキー、オプションのメタデータ、ページ状態を確認してください。1回の制限付きリトライの後、ワークフローをオペレーターのレビューにルーティングしてください。
AIブラウザ復元ハーネスを構築し、CapSolver、Playwright fixture、ページ状態ルーティング、チェックポイント、制限付きリトライ、編集済みトレース、およびCIテストを使用して。

CapSolverのスキーマ、fixture、トレース評価ツール、アサーション、回帰データセット、およびCIゲートを用いて、AIエージェントのツールコール用CAPTCHA評価ハーネスを構築してください。
