
Sora Fujimoto
AI Solutions Architect

AIアシスタントに自動化されたサーバーサイドのデータ抽出をトリガーする機能を付与します — ブラウザのインジェクションやコードは必要ありません。
AIエージェントがウェブをナビゲートする際、CAPTCHAが主な障害物となります。保護されたページはエージェントをブロックし、フォームの送信ができない、タスクが人間の介入を待って停止します。これにより、自動データスクリーニングや情報処理におけるAIエージェントの効率と自律性が大きく制限されます。
この根本的な問題に対処するため、OpenClawとCapSolverの2つの強力なソリューションを提供します。
アプローチ1 — ブラウザ拡張機能の統合
OpenClawのブラウザ環境にCapSolverのChrome拡張機能をロードします。この拡張機能はクライアントサイドでCAPTCHAを検出・解決し、n8nの関与なしにスムーズに検証を回避します。これにより、AIエージェントはページをナビゲートしながら検証を無視できます。(拡張機能アプローチの詳細なガイドはこちらを参照)
アプローチ2 — サーバーサイドのn8nオートメーションパイプライン(本ガイドの焦点)
OpenClawが単一のwebhookリクエストをトリガーし、n8nがCapSolver APIを通じてCAPTCHAを解決し、フォームを送信し、AIエージェントにクリーンなページコンテンツを返します。このプロセスでは、AIエージェントが直接CAPTCHA検証を扱いません。
作成する内容:
OpenClawがwebhook経由でトリガーするサーバーサイドのCAPTCHAオートメーションパイプライン。n8nはCapSolverを活用してCAPTCHAを解決し、フォームを送信し、処理済みのページコンテンツをAIエージェントに返します。これにより、データ抽出タスクのスムーズな実行が保証されます。
開始する前に、以下の環境とツールを確保してください:
openclaw gateway start)CapSolverはn8nの公式統合として利用可能で、追加のコミュニティノードのインストールは必要ありません。ワークフローを構築する際、ノードパネルで直接見つけることができます。CapSolverノードをアカウントと認証するには、n8nで資格情報を設定する必要があります。
n8nのキャンバスを開き、**+**をクリックしてノードを追加し、CapSolverを検索してください。このノードは、タスクの作成、ポーリング、トークンの取得を1つのユニットで処理します。
資格情報を追加する手順:
重要: ワークフロー内のすべてのCapSolverノードはこの資格情報を参照します。1度だけ作成すればよく、すべてのCAPTCHA解決ワークフローが同じ資格情報を共有します。さらに、CapSolverは公式に豊富なGitHubスキルリポジトリを提供しており、CapSolverに関連する他の統合や使用例を探索できます。これにより、AIエージェントの能力をさらに拡張できます。
以下のすべては例です。URL、フィールド名、CAPTCHAタイプ、成功条件、応答構造 — すべてはここでのデモサイトに特化しています。実際のターゲットは異なります。各ノードの設定は完成形ではなく、スタート地点として扱ってください。
pageTextを抽出します。Webhook ──► CAPTCHAを解決 ──► トークンを送信 ──► 成功? ──► 結果を抽出 ──► Webhookに応答
└─► 失敗をマーク ───┘
「OpenClaw/Capsolver/n8n Scraper」という新しいワークフローを作成し、以下のノードを使用します:
openclaw/scrapeReCaptchaV2TaskProxylesshttps://example.com/protected-pageYOUR_SITE_KEY (ページソース内でdata-sitekeyを検索)reCAPTCHA v3を使用している場合、タスクタイプを
ReCaptchaV3TaskProxylessに切り替え、Page Actionフィールドを追加(例:login、submit、homepage)。これはv3で必須です — サイトがGoogleと登録するアクション名です。grecaptcha.execute(...)の呼び出し近くで見つかります。各CAPTCHAタイプには固有のパラメータセットがあります — v2ではオプションだったフィールドがv3では必須になる場合があります。また、v3ではv2に存在しないフィールド(例:
minScore)が表示される場合もあります。必ずCapSolverドキュメントでタスクタイプに必要な正確なパラメータを確認してください。
このノードはCapSolver APIを呼び出し、解決を待機(通常5〜20秒)し、$json.data.solution.gRecaptchaResponseでトークンを返します。
https://example.com/protected-pageg-recaptcha-response = ={{ $json.data.solution.gRecaptchaResponse }}これはブラウザと同じようにフォームを送信します。
ヒント: トークンの送信方法はサイトによって異なります。多くのフォームでは
g-recaptcha-responseとしてリクエストボディに送信しますが、一部のサイトではJSONフィールド、カスタムヘッダー、またはクッキー、異なる名前で送信する場合があります。実際の送信内容を確認するには、ブラウザのDevTools(Networkタブ)を使用し、HTTPリクエストノードでそれに合わせて設定してください。
$json.dataに"recaptcha-success"が含まれている両方のブランチで1つのフィールドを設定します:
pageText = {{ $json.data }}成功と失敗のブランチは両方ともpageTextを渡します — 呼び出し元はHTMLを検査して結果を判断できます。
ご自身のページに合わせてカスタマイズしてください: 応答データをパースおよび使用する方法は、ご自身の目的とターゲットサイトが返す内容に完全に依存します。一部のページはJSONを返し、他のページはHTMLを返し、成功時にリダイレクトする場合もあります。特定のフィールドの抽出、テーブルのパース、セッションクッキーの確認、HTMLの完全削除など、ご自身のニーズに合わせてカスタマイズしてください。成功条件(
"recaptcha-success")も例であり、ご自身のサイトには独自の指標があります。これらのノードはスタート地点として扱い、ご自身のユースケースに合わせてカスタマイズする必要があります。
このノードは、{ pageText, savedAt }をwebhook応答に渡し、オプションで結果をストレージに永続化します。
注意: n8nのCodeノードはNode.jsビルトインモジュール(例:
require('fs'))をブロックするサンドボックス環境のVMで実行されます。ディスクに書き込むにはExecute Commandノードを使用してください。または、ご自身のスタックに合った任意のn8n統合でこのノードを置き換えることもできます。
オプションA — ローカルJSONファイル(Execute Commandノード):
2つのノードを連続して使用します:
ノード7a — データ準備(Codeノード):
const item = $input.first().json;
const now = new Date();
const savedAt = now.toISOString();
const data = { pageText: item.pageText || '', savedAt };
const encoded = Buffer.from(JSON.stringify(data)).toString('base64');
const cmd = 'python3 /path/to/save-result.py ' + encoded;
return [{ json: { cmd, pageText: data.pageText, savedAt } }];
ノード7b — 結果保存(Execute Commandノード):
={{ $json.cmd }}ここでsave-result.pyはbase64引数を読み込み、ローカルJSONファイルに追加します。
オプションB — n8nがサポートする任意のストレージ:
n8nはほぼすべてのストレージシステムに対応するネイティブノードを提供しています。ノード7をこれらのいずれかに置き換えてください:
| ストレージ | n8nノード |
|---|---|
| Googleスプレッドシート | pageText + タイムスタンプで行を追加 |
| Airtable | レコードを作成 |
| Notion | データベースエントリを作成 |
| PostgreSQL / MySQL | テーブルにINSERT |
| AWS S3 / Cloudflare R2 | JSONファイルをアップロード |
| Slack / Telegram | チャンネルに結果を投稿 |
Edit FieldsとRespond to Webhookの間にノードを接続し、$json.pageTextとタイムスタンプを保存するように設定してください。
={{ JSON.stringify($json) }}ワークフローを構築したら、有効にしてください。webhookのパスは以下になります:
POST http://127.0.0.1:3005/webhook/openclaw/scrape
以下のJSONをコピーし、メニュー → JSONからインポートでn8nにインポートしてください。インポート後、"Solve CAPTCHA"ノードでCapSolverの資格情報を選択してください。
{
"nodes": [
{
"parameters": {
"content": "## OpenClaw CAPTCHAオートメーションパイプライン\n\n### 仕組み\n\n1. webhookトリガーでプロセスを開始します。\n2. 専門的なサービスを使用してCAPTCHAを解決しようとします。\n3. CAPTCHAトークンを検証のために送信します。\n4. トークン送信が成功したかを評価します。\n5. 結果を設定し、webhook経由で応答します。\n\n### 設定手順\n\n- [ ] 望ましいエンドポイントURLでwebhookトリガーを設定してください。\n- [ ] CAPTCHA解決サービスの資格情報を設定してください。\n- [ ] トークン送信に適したHTTPリクエストの設定を確認してください。\n- [ ] 成功および失敗の応答メッセージをカスタマイズしてください。\n\n### カスタマイズ\n\n'Success?'ノードで成功および失敗の条件と応答をカスタマイズできます。",
"width": 480,
"height": 656
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1312,
-352
],
"id": "de683912-ba9c-4879-9a8e-38190c4b236c",
"name": "スタickyノート"
},
{
"parameters": {
"content": "## 初期化とCAPTCHA解決\n\nwebhookトリガーから始まり、外部サービスを使用してCAPTCHAを解決します。",
"width": 800,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-208
],
"id": "41705a72-53ba-4c61-951b-251f7f35f422",
"name": "スタickyノート1"
},
{
"parameters": {
"content": "## トークン送信\n\n解決されたCAPTCHAトークンを検証のために送信し、結果を確認します。",
"width": 496,
"height": 304,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
160,
-224
],
"id": "260fdb86-71a7-46dc-9b41-1abd4ae08b79",
"name": "スタickyノート2"
},
{
"parameters": {
"content": "## 結果処理と応答\n\n成功および失敗の結果を処理し、webhook経由で応答を送信します。",
"width": 496,
"height": 480,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
768,
-352
],
"id": "e17032fd-3901-4c2a-aeea-4088c9f79bd4",
"name": "スタickyノート3"
},
{
"parameters": {
"httpMethod": "POST",
"path": "openclaw/scrape",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-704,
-96
],
"id": "oc-909",
"name": "Webhookトリガー",
"webhookId": "oc-909-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL || 'https://example.com/protected-page' }}",
"websiteKey": "={{ $json.body.websiteKey || 'YOUR_SITE_KEY_HERE' }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
-96
],
"id": "oc-910",
"name": "CAPTCHAを解決 [Webhook]"
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Webhook Trigger').item.json.body.targetURL || 'https://example.com/protected-page' }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "user-agent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
},
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
-96
],
"id": "oc-911",
"name": "トークンを送信 [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "if-2",
"leftValue": "={{ String($json.data || $json || '').includes($('Webhook Trigger').item.json.body.successMarker || 'recaptcha-success') }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
512,
-96
],
"id": "oc-912",
"name": "成功? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "ws1",
"name": "success",
"value": "true",
"type": "boolean"
},
{
"id": "ws2",
"name": "pageText",
"value": "={{ $json.data || $json }}",
"type": "string"
},
{
"id": "ws3",
"name": "savedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
816,
-224
],
"id": "oc-913",
"name": "Extract Result [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "wf1",
"name": "success",
"value": "false",
"type": "boolean"
},
{
"id": "wf2",
"name": "pageText",
"value": "={{ $json.data || $json }}",
"type": "string"
},
{
"id": "wf3",
"name": "error",
"value": "Response did not contain success marker",
"type": "string"
},
{
"id": "wf4",
"name": "savedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
816,
-48
],
"id": "oc-914",
"name": "Mark Failed [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1120,
-96
],
"id": "oc-917",
"name": "Respond to Webhook"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Solve CAPTCHA [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve CAPTCHA [Webhook]": {
"main": [
[
{
"node": "Submit Token [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Submit Token [Webhook]": {
"main": [
[
{
"node": "Success? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Success? [Webhook]": {
"main": [
[
{
"node": "Extract Result [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Failed [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Extract Result [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Mark Failed [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
OpenClawをこのワークフローに接続するには、トリガー スクリプトを作成し、登録します。
トリガー スクリプトの作成:
cat > ~/.openclaw/scripts/extract-data << \'EOF\'
#!/usr/bin/env bash
curl -s -X POST http://127.0.0.1:3005/webhook/openclaw/scrape
EOF
chmod +x ~/.openclaw/scripts/extract-data
これはOpenClawが実行する唯一のものです。引数も、サイトキーも、URLもありません。ワークフローが何をスクレイプするかを知っています。
OpenClawがデータを取得する方法: スクリプトはn8nが終了するのを待つ(CapSolverの解決 + フォームの送信)後、Webhookの応答で
{ pageText, savedAt }を直接受け取ります。ファイルの読み込みは関与しません。HTTP経由で同期的にデータが戻ってきます。応答の構造はこのワークフローが返すものと同じです。必要に応じて他のフィールド(例: 解析された価格、ログインステータス、構造化されたJSONオブジェクト)を取得するには、Edit FieldsとSave Resultノードを編集して、ご使用ケースに必要なものを返すようにしてください。
TOOLS.mdにコマンドを登録:
~/.openclaw/workspace/TOOLS.mdを開き、OpenClawがコマンドを認識するように以下のエントリを追加してください:
### extract-data
実行: `/root/.openclaw/scripts/extract-data`
ライブパイプラインから最新の `{ pageText, savedAt }` を返します。JSON応答の `pageText` フィールドを返します。
OpenClawからトリガーを発行します。AIエージェントにDiscord、Telegram、WhatsApp、または他のチャネル経由でこのコマンドを送信してください:
extract data
OpenClawは extract-data スクリプトを実行し、Webhookを発火して待機します。n8nはCAPTCHAを解決し、フォームを送信し、HTTP応答で { pageText, savedAt } を直接返します。OpenClawはその結果を受け取り、要約します。通常、10〜40秒程度で完了します。
ターミナルからテスト:
curl -s -X POST http://127.0.0.1:3005/webhook/openclaw/scrape
このガイドのワークフローは特定のデモサイト用に構築されています。実際のターゲットサイトでは、パイプラインのすべての部分が調整が必要になる場合があります。以下を確認してください:
すべてのサイトがreCAPTCHA v2を使用しているわけではありません。CapSolverノードのタスクタイプをターゲットに合わせて変更してください:
| サイトで表示されるもの | n8n ノードの操作 |
|---|---|
| 「私はロボットではありません」チェックボックス | reCAPTCHA v2 |
| インビジブルreCAPTCHA(自動起動) | reCAPTCHA v2 |
| reCAPTCHA v3スコア | reCAPTCHA v3 |
| Cloudflare Turnstileウィジェット | Cloudflare Turnstile |
| Cloudflareチャレンジ(5秒のページ) | Cloudflare Challenge |
| GeeTestパズル(v3) | GeeTest V3 |
| GeeTestパズル(v4) | GeeTest V4 |
| DataDomeボット保護 | DataDome |
| AWS WAF CAPTCHA | AWS WAF |
| MTCaptcha | MTCaptcha |
また、サイトURLとサイトキーをターゲットに合わせて更新してください。サイトキーはページソースで見つけることができます(data-sitekey属性を検索するか、CapSolverブラウザ拡張機能が自動検出します)。
これはサイトごとに最も大きく異なる部分です。このデモサイトは単純なフォームPOSTでトークンをボディフィールドに含めています。あなたのターゲットは異なる可能性があります:
フォームフィールドとして(最も一般的)
POST /submit
Content-Type: application/x-www-form-urlencoded
g-recaptcha-response=TOKEN&other_field=value
JSONボディとして
POST /api/login
Content-Type: application/json
{ "username": "...", "password": "...", "captchaToken": "TOKEN" }
ヘッダーとして
POST /api/action
X-Captcha-Token: TOKEN
クッキーとして
POST /submit
Cookie: cf_clearance=TOKEN
URLのクエリパラメータとして
GET /search?q=query&token=TOKEN
手動でターゲットサイトのCAPTCHAを解決するときにブラウザの開発者ツールのネットワークタブを確認してください。解決後にすぐに発生するリクエストを見つけて、トークンがどこに送信されるかを確認してください。
トークンの送信方法が分かったら、HTTPリクエストノードをそれに合わせて構成してください:
現在のワークフローでは、応答の完全なHTMLが pageText として渡されています。ご使用ケースに応じて、これを後処理する必要があります:
いくつかのターゲットでは1つのリクエストでは不十分です:
n8nで複数のHTTPリクエストノードをチェーンして処理してください。ノード間で $json 式を使用して値を渡してください。
{"success": false, "error": "n8nスクレイパーに到達できませんでした。OpenClaw CAPTCHAスクレイパーのワークフローがアクティブになっていますか?"}
確認: n8nが実行中ですか?ワークフローが有効になっていますか?n8nを開き、ワークフローがActive(緑色のトグル)になっているか確認してください。
可能性のある原因:
~/.n8n/credentials を確認してくださいpageText が空またはエラーページを含んでいるg-recaptcha-response フィールド名を確認してください — 一部のサイトでは別のフィールド名を使用していますfullResponse: true を有効にしてステータスコードを確認してください| ノード | タイプ | キー設定 |
|---|---|---|
| Webhook | n8n-nodes-base.webhook |
POST、パス: openclaw/scrape、responseMode: responseNode |
| サイトスクレイプ | n8n-nodes-capsolver.capSolver |
タスク: ReCaptchaV2TaskProxyless |
| HTTPリクエスト | n8n-nodes-base.httpRequest |
トークンをボディに含むターゲットURLへのPOST |
| If | n8n-nodes-base.if |
$json.data に "recaptcha-success" が含まれているか確認 |
| フィールド編集 | n8n-nodes-base.set |
pageText = $json.data |
| 結果を保存 | n8n-nodes-base.executeCommand または任意のストレージノード |
結果を保存(ファイル、DB、スプレッドシートなど) |
| Webhookに応答 | n8n-nodes-base.respondToWebhook |
JSON、continueOnFail: true |
| CAPTCHA | n8n ノードの操作 |
|---|---|
| reCAPTCHA v2(チェックボックス) | reCAPTCHA v2 |
| reCAPTCHA v2(インビジブル) | reCAPTCHA v2 |
| reCAPTCHA v3 | reCAPTCHA v3 |
| Cloudflare Turnstile | Cloudflare Turnstile |
| Cloudflare Challenge | Cloudflare Challenge |
| GeeTest V3 | GeeTest V3 |
| GeeTest V4 | GeeTest V4 |
| DataDome | DataDome |
| AWS WAF | AWS WAF |
| MTCaptcha | MTCaptcha |
OpenClaw + n8n + CapSolverのパイプラインは、以下のようなプロダクショングレードのデータ抽出設定を提供します:
AIエージェントは単に「"extract data"」コマンドを発行し、クリーンなページコンテンツを受け取ります。CapSolverが難しい部分を処理し、n8nがフローを調整し、OpenClawがインターフェースとして機能します。
さっそく始めたいですか?CapSolverに登録し、初回チャージでOPENCLAWというボーナスコードを使用してください!
いいえ。OpenClawは単にHTTPリクエストを発火するスクリプトを実行するだけです。n8nがすべての処理を担当します。AIエージェントはCAPTCHAについて知らされていません — ただジョブをトリガーし、結果を読み取るだけです。
はい、ただしURLだけを変更するだけではおそらくなりません。すべてのサイトはCAPTCHAトークンを異なる方法で送信します — 一部はフォームフィールド、一部はJSONボディ、一部はヘッダーまたはクッキーを使用します。上記の「ターゲットサイトにワークフローを適応させる」セクションを参照してください。
CapSolverノードのタスクタイプを AntiTurnstileTaskProxyless に変更してください。その後、ターゲットのネットワークリクエストを確認して、Turnstileトークンがどこに送信されるかを確認してください — 通常は cf-turnstile-response という名前の隠しフォームフィールドに含まれますが、一部の実装ではJSONボディ、ヘッダー、またはクッキーに含まれることもあります。
保存方法に依存します。ローカルのJSONファイルでは、必要なだけ保存できます。Googleスプレッドシートやデータベースを使用する場合、実行ごとに無限に行が追加されます。Save Resultノードを、保存の必要に応じて設定してください。
はい — Webhookエンドポイントは単なるHTTP POSTです。HTTPリクエストができるものであれば、すべてトリガーできます:
curl -s -X POST http://127.0.0.1:3005/webhook/openclaw/scrape
1回の実行で1つのCapSolverクレジットが使われます。reCAPTCHA v2は最も安価なタイプの1つです。現在の料金はcapsolver.comで確認してください。
OpenClawはオープンソースで、自己ホスト可能です。AIモデルプロバイダーのAPIクレジットとCapSolverのCAPTCHA解決用クレジットが必要です。