
Sora Fujimoto
AI Solutions Architect

LlamaIndexエージェントは、さまざまなソース間でデータ取得、インデックス作成、クエリワークフローを調整します。これらのエージェントがCAPTCHAチャレンジで保護されたウェブベースのデータソースにアクセスする場合、データインジェストを続けるために解決メカニズムが必要です。CapSolverのcapsolver-agentパッケージは、LlamaIndexのFunctionToolシステムと互換性のあるツールスキーマを提供し、エージェントがreCAPTCHA、Cloudflare Turnstile、その他の検証チャレンジをデータパイプラインの一部として解決できるようにします。
FunctionToolラッパーを通じて統合されますcapsolver-agentエクセキュータは解決を処理し、エージェントの推論ループに構造化された結果を返しますcreate_executor()とFunctionTool.from_defaults()を使用して15行未満で統合できますLlamaIndexは、複数のソースからデータを取得、インデックス作成、クエリするエージェントを構築するのに優れています。これらのソースにCAPTCHAシステムで保護されたウェブページ、API、またはデータベースが含まれる場合、エージェントのデータインジェストパイプラインが破損します。CAPTCHAで保護されたサイトからのドキュメンテーションをインデックス化するRAGエージェントや、複数のウェブソースをクエリするリサーチエージェントは、検証をクリアしない限り進行できません。
この問題は特にLlamaIndexのデータコネクタエコシステムにおいて深刻です。繰り返しアクセスされるウェブベースのコネクタは、インデックス作成用のページを取得する際にCAPTCHAに遭遇します。解決ツールがない場合、エージェントはソースをスキップする(データが不完全)か、完全に失敗する(パイプラインが破損)しかありません。
CapSolverのツール統合はLlamaIndexの標準的なパターンに従います:関数を定義し、それをFunctionToolとしてラップし、エージェントのツールリストに追加します。エージェントの推論エンジンは、タスクの文脈に基づいて解決を呼び出すタイミングを決定します。
# CapSolverパッケージ
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install git+https://github.com/capsolver-ai/capsolver-agent.git
# LlamaIndex
pip install llama-index llama-index-llms-openai
export CAPSOLVER_API_KEY="your-capsolver-api-key"
export OPENAI_API_KEY="your-openai-api-key"
import asyncio
from llama_index.core.tools import FunctionTool
from capsolver_agent.schema import create_executor
executor = create_executor(api_key="YOUR_CAPSOLVER_API_KEY")
def solve_captcha(captcha_type: str, website_url: str, website_key: str) -> str:
"""CAPTCHAチャレンジを解決し、検証トークンを返します。
ウェブリソースにアクセスする際には使用してください。
引数:
captcha_type: 'reCaptchaV2', 'reCaptchaV3', または 'cloudflare'
website_url: CAPTCHAで保護されたページの完全なURL
website_key: サイトキー(data-sitekey属性の値)
戻り値:
解決されたトークン文字列またはエラーメッセージ
"""
result = asyncio.run(executor.execute("solve_captcha", {
"captcha_type": captcha_type,
"website_url": website_url,
"website_key": website_key
}))
if result["success"]:
return f"CAPTCHAが解決されました。トークン: {result['solution']['token']}"
return f"失敗: {result['error']}"
# LlamaIndexのFunctionToolとしてラップ
captcha_tool = FunctionTool.from_defaults(
fn=solve_captcha,
name="solve_captcha",
description="保護されたウェブページ上のreCAPTCHA v2/v3、Cloudflare TurnstileのCAPTCHAチャレンジを解決"
)
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
# LLMを作成
llm = OpenAI(model="gpt-4o", temperature=0)
# CAPTCHA解決ツールを持つエージェントを作成
agent = ReActAgent.from_tools(
tools=[captcha_tool],
llm=llm,
verbose=True
)
# エージェントを実行
response = agent.chat(
"https://example.com/dataにアクセスする必要があります。これはreCAPTCHA v2で保護されています。"
"サイトキーは6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhIです。解決してトークンを教えてください。"
)
print(response)
データをインジェストするエージェントの場合、CAPTCHA解決とデータロードを組み合わせます:
from llama_index.core import VectorStoreIndex, Document
def fetch_protected_page(url: str, site_key: str) -> str:
"""最初に検証を解決してから、CAPTCHAで保護されたページを取得します。"""
# CAPTCHAを解決
token = solve_captcha("reCaptchaV2", url, site_key)
if "Failed" in token:
return ""
# トークンを使用してページにアクセス
import requests
response = requests.post(url, data={"g-recaptcha-response": token.split("Token: ")[1]})
return response.text
# 保護されたデータインジェスト用のカスタムツールを作成
protected_fetch_tool = FunctionTool.from_defaults(
fn=fetch_protected_page,
name="fetch_protected_page",
description="最初に検証を解決してから、CAPTCHAで保護されたウェブページのコンテンツを取得"
)
# 解決と取得機能を持つエージェント
data_agent = ReActAgent.from_tools(
tools=[captcha_tool, protected_fetch_tool],
llm=llm,
verbose=True
)
def solve_captcha_with_retry(captcha_type: str, website_url: str, website_key: str, max_retries: int = 3) -> str:
"""失敗時に再試行を行うプロダクショングレードのCAPTCHA解決。"""
for attempt in range(max_retries):
result = asyncio.run(executor.execute("solve_captcha", {
"captcha_type": captcha_type,
"website_url": website_url,
"website_key": website_key
}))
if result["success"]:
return f"解決済み (試行 {attempt+1}). トークン: {result['solution']['token']}"
if attempt < max_retries - 1:
import time
time.sleep(3)
return f"{max_retries}回の試行後に失敗: {result.get('error')}"
# 再試行機能付きのプロダクションツール
production_captcha_tool = FunctionTool.from_defaults(
fn=solve_captcha_with_retry,
name="solve_captcha",
description="エラー時に自動的に再試行するCAPTCHA解決"
)
| CAPTCHAタイプ | パラメータ | 解決時間 | 1,000件あたりのコスト |
|---|---|---|---|
| reCAPTCHA v2 | reCaptchaV2 |
5-12秒 | $2-3 |
| reCAPTCHA v3 | reCaptchaV3 |
3-8秒 | $1-2 |
| Cloudflare Turnstile | cloudflare |
2-5秒 | $1-2 |
ボーナーコードを取得してください: CapSolverダッシュボードでコード WEBS を使用すると、すべてのチャージに対して追加の5%のボーナスを取得できます。
CapSolver APIドキュメンテーションは追加パラメータをカバーしています。CAPTCHAタイプの識別には、CapSolver拡張機能を使用してください。CapSolverウェブスクレイピングガイドは、LlamaIndexデータコネクタに適用可能なデータ収集パターンをカバーしています。
LlamaIndexエージェントにCAPTCHA解決を統合するには、CapSolverのエクセキュータをFunctionToolにラップし、ReActエージェントのツールリストに追加する必要があります。エージェントの推論ループはタスクの文脈に基づいて解決を呼び出すタイミングを決定します。CapSolverは、統一されたAPIを通じてreCAPTCHAとCloudflare Turnstileを処理する解決インフラストラクチャを提供し、LlamaIndexデータパイプラインを中断することなく運用し続けます。
はい。capsolver-agentエクセキュータは完全に非同期です。LlamaIndexの非同期エージェントを使用する場合は、asyncio.run()でラップする代わりにawait executor.execute()を直接使用してください。
はい。CAPTCHA解決ツールをカスタムウェブリーダーと組み合わせて、ページコンテンツを取得する前に検証を処理できます。エージェントは最初にCAPTCHAを解決し、その後トークンをウェブリーダーに渡して認証アクセスを行います。
get_supported_captchasツールはサポートされているタイプのリストを返します。エージェントがサポートされていないタイプに遭遇した場合、明確なエラーメッセージを受け取り、ユーザーに報告するか、静かに失敗する代わりにユーザーに通知できます。
capsolver-mcpを使用する場合と比べてどうなりますか?capsolver-mcpはMCPクライアント(Claude Desktop、Cursor)向けです。コードで実行されるLlamaIndexエージェントの場合、capsolver-agentとFunctionToolを使用してください — これにより、LlamaIndexフレームワーク内で直接的なプログラマティックコントロールが得られます。