
Sora Fujimoto
AI Solutions Architect

ウェブ操作を自動化しようとしたことがあるなら、ほぼ確実に reCAPTCHA に遭遇したことがあるでしょう。これは Google のチャレンジシステムで、ボットがウェブサイトにアクセスするのを防ぎます。スクレイパーの構築、ウェブアプリケーションのテスト、繰り返し作業の自動化など、reCAPTCHA はあなたのワークフロー全体を停止させることがあります。
もし、n8n のワークフロー内で reCAPTCHA を自動的に解決できるとしたらどうでしょうか?再利用可能な solver API を作成したり、キャプチャ保護されたサイトをスクレイピングしたり、ログインフォームを自動化したりする場合でも、従来のコードを一行も書かずに実現できます。
このガイドでは、n8n(ビジュアルワークフロー自動化ツール)と CapSolver(AI搭載のキャプチャ解決サービス)を組み合わせて、reCAPTCHA v2、v2 Invisible、v3 のチャレンジをオンデマンドで解決する方法を学びます。単独の API エンドポイントとしても、任意の自動化ワークフローのステップとしても利用可能です。
作成するもの:
Solver API — 他のツールが呼び出せる再利用可能なエンドポイント:
直接利用ワークフロー — 大きな自動化の中に組み込まれた CapSolver ステップ:
reCAPTCHA は Google のボット検出システムで、数百万のウェブサイトで使われています。主に以下の3つのバージョンがあります:
reCAPTCHA v2 — チェックボックス(「私はロボットではありません」)+画像チャレンジ
reCAPTCHA v2 Invisible — 目に見えるチェックボックスなし、バックグラウンドで自動的にトリガーされる
reCAPTCHA v3 — 完全に目に見えず、行動に基づいてスコア(0.0〜1.0)を割り当てる
どのバージョンが使われているかを理解することは重要です。解決時に少し異なるパラメータが必要になります。
始める前に、以下を用意してください:
重要: CapSolver アカウントに十分な残高があることを確認してください。reCAPTCHA 解決タスクはキャプチャの種類に応じてクレジットを消費します。
CapSolver は n8n の 公式統合 として利用可能で、コミュニティノードのインストールは不要です。ワークフロー作成時のノードパネルで直接見つけられます。
公式統合なので、CapSolver ノードがアカウント認証できるように、n8n で 認証情報(Credential) を作成する必要があります。
n8n インスタンスで 設定 → 認証情報 に移動します。ここに設定済みの認証情報が一覧表示されます。

All のままにするn8n が自動的に接続テストを行います。緑色の 「接続テスト成功」 バナーが表示されれば API キーが有効です。

重要: ワークフロー内のすべての CapSolver ノードはこの認証情報を参照します。一度作成すれば、すべてのソルバー用ワークフローで共有できます。
これで reCAPTCHA ソルワーフローの構築準備が整いました!
reCAPTCHA を解決するには、パラメータ、特に websiteURL と websiteKey(サイトキー)が必要です。これらを見つける最も簡単な方法は、CapSolver ブラウザ拡張機能を使うことです。
Chrome ウェブストア または Firefox アドオンから CapSolver 拡張機能をダウンロードしてインストールします。

検出ツールパネルを開いたまま、ページ上で操作して reCAPTCHA をトリガーします。拡張機能が自動的に関連パラメータを検出して表示します:
recaptcha.net)
ヒント: 拡張機能は、解決リクエスト用にこれらのパラメータをどのようにフォーマットするかを示す JSON 出力を生成します。これにより、ページソースを手動で調査する手間が省けます。
キャプチャパラメータの特定に関する詳細ガイドは、公式 CapSolver ドキュメントをご覧ください。
このワークフローは、reCAPTCHA パラメータを受け取り、解決済みトークンを返す POST エンドポイントを作成します。同じ4ノード構成で すべての reCAPTCHA タイプ に対応可能です — CapSolver ノードの Operation を変更するだけです。

$json.error が空でない場合){"error": "..."} を返す| タイプ | 選択する Operation | 追加パラメータ |
|---|---|---|
| v2 標準 | reCAPTCHA v2 |
— |
| v2 Invisible | reCAPTCHA v2 |
ノード内の Is Invisible を true に設定 |
| v3 | reCAPTCHA v3 |
pageAction を追加 — 対象サイトの設定アクション(例:login、submit)と一致させる必要あり |
以下のワークフローはデフォルトで reCAPTCHA v2 を使用しています。CapSolver ノードを開き、Operation ドロップダウンでタイプを切り替えてください。他の構造変更は不要です。
| 設定 | 値 |
|---|---|
| HTTP メソッド | POST |
| パス | solver-recaptcha |
| 応答 | Response Node |
この設定により、以下のエンドポイントが作成されます:
https://your-n8n-instance.com/webhook/solver-recaptcha
| パラメータ | 値 | 説明 |
|---|---|---|
| Operation | reCAPTCHA v2 |
v3 用には reCAPTCHA v3 に変更。v2 Invisible は reCAPTCHA v2 のまま Is Invisible を true に設定 |
| Website URL | ={{ $json.body.websiteURL }} |
キャプチャがあるページの URL |
| Website Key | ={{ $json.body.websiteKey }} |
reCAPTCHA のサイトキー |
| Page Action | ={{ $json.body.pageAction || '' }} |
v3 で必須 — サイトの設定アクションと一致させる必要あり |
| Is Invisible | ={{ $json.body.isInvisible || false }} |
v2 Invisible の場合は true に設定 |
| API Domain | ={{ $json.body.apiDomain || '' }} |
任意 — カスタム API ドメイン(例:recaptcha.net) |
| Enterprise Payload | ={{ $json.body.enterprisePayload || '' }} |
任意 — reCAPTCHA Enterprise 用追加ペイロード |
| Is Session | ={{ $json.body.isSession || false }} |
任意 — セッションベースの解決を有効化 |
| Task Type | ={{ $json.body.taskType || 'ReCaptchaV2TaskProxyLess' }} |
CapSolver タスクタイプ — 下記参照。デフォルトは ReCaptchaV2TaskProxyLess |
| Proxy | ={{ $json.body.proxy || '' }} |
選択されたタスクタイプがプロキシを必要とする場合のみ使用(ProxyLess タイプ以外)。空または省略可能。形式:ip:port:user:pass |
ノード内で CapSolver 認証情報 も選択してください。
reCAPTCHA タスクタイプ参照:
| タスクタイプ | プロキシ必要か | 備考 |
|---|---|---|
ReCaptchaV2TaskProxyLess |
いいえ | v2 デフォルト |
ReCaptchaV2Task |
はい | v2 プロキシ使用 |
ReCaptchaV2EnterpriseTaskProxyLess |
いいえ | Enterprise v2、プロキシ不要 |
ReCaptchaV2EnterpriseTask |
はい | Enterprise v2、プロキシ必須 |
ReCaptchaV3TaskProxyLess |
いいえ | v3 デフォルト |
ReCaptchaV3Task |
はい | v3 プロキシ使用 |
ReCaptchaV3EnterpriseTaskProxyLess |
いいえ | Enterprise v3、プロキシ不要 |
ReCaptchaV3EnterpriseTask |
はい | Enterprise v3、プロキシ必須 |
プロキシについて:
ProxyLessでないタスクタイプ(例:ReCaptchaV2Task、ReCaptchaV3EnterpriseTask)でのみ適用されます。ProxyLessタスクタイプを使う場合、プロキシフィールドは無視され、CapSolver のインフラを利用します。非ProxyLessタスクタイプの場合は、必ずプロキシを指定してください。
| 設定 | 値 |
|---|---|
| 条件 | ={{ $json.error }} が空でない |
| True ブランチ | Error の Respond to Webhook ノードへルーティング |
| False ブランチ | Success の Respond to Webhook ノードへルーティング |
これにより、キャンバス上でエラーパスが明示的になります。CapSolver ノードはエラー時も処理を継続(onError: continueRegularOutput)するため、失敗はワークフローのクラッシュではなく { "error": "..." } としてここに届きます。True ブランチにはログ記録、アラート、リトライなどのノードを追加可能で、成功パスには影響しません。
成功ブランチ(CapSolver Error? の false 出力):
| 設定 | 値 |
|---|---|
| 応答形式 | JSON |
| レスポンス本文 | ={{ JSON.stringify($json.data) }} |
Webhook エンドポイントに POST リクエストを送信してください:
curl -X POST https://your-n8n-instance.com/webhook/solver-recaptcha \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"taskType": "ReCaptchaV2TaskProxyLess"
}'
```> **タスクタイプはノードのOperationと一致する必要があります。** 各デプロイされたワークフローは、CapSolverノードの**Operation**フィールド(`reCAPTCHA v2`または`reCAPTCHA v3`)を通じて特定のreCAPTCHAバージョンに設定されています。そのバージョンに対応するタスクタイプのみが有効です — v3のタスクタイプをv2のワークフローに送信する(またはその逆)と動作しません。注意:v2 Invisibleは標準のv2と同じ`reCAPTCHA v2`のOperationを使用します — 違いはOperationではなく`isInvisible`パラメータです。
**reCAPTCHA v3**の場合は、リクエストボディに`"pageAction": "login"`(またはサイトが使用するアクション)を追加し、v3のタスクタイプ(例:`"taskType": "ReCaptchaV3TaskProxyLess"`)を使用してください。
**期待されるレスポンス:**```json
{
"taskId": "abc123...",
"solution": {
"gRecaptchaResponse": "03AGdBq24PBCb..."
},
"status": "ready"
}
```### このワークフローをインポートする
以下のJSONをコピーし、n8nの**メニュー** → **JSONからインポート**からインポートしてください。その後、CapSolverノードの**Operation**を目的のreCAPTCHAタイプに変更します。
<details>
<summary>ワークフローJSONを展開(reCAPTCHA v2 — 他のタイプの場合はOperationを変更してください)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Solver API\n\n### How it works\n\n1. A webhook receives the reCAPTCHA solver request.\n2. The request is passed to the solver node to resolve the reCAPTCHA.\n3. The system checks if the solver encountered an error.\n4. If an error occurred, a response is sent indicating the failure.\n5. If successful, a response is sent with the result.\n\n### Setup steps\n\n- [ ] Configure webhook endpoint to receive solver requests.\n- [ ] Set up CapSolver credentials if necessary.\n\n### Customization\n\nAdjust the solver node settings depending on reCAPTCHA type or difficulty.",
"width": 480,
"height": 592
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-800,
-240
],
"id": "497d295f-4668-48ff-8eaa-97773cfd1c89",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Receive request and solve\n\nHandles incoming requests and solves reCAPTCHA.",
"width": 496,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-240,
-112
],
"id": "cb4b7a54-ae67-458e-bbef-18e3f6d242bb",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Evaluate and respond\n\nChecks for errors and sends appropriate webhook responses.",
"width": 560,
"height": 432,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
-240
],
"id": "fc9430f0-b899-45ce-b5cf-de9a1b10fbe2",
"name": "Sticky Note2"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"id": "rc-api-001",
"name": "Receive Solver Request",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-192,
0
],
"webhookId": "solver-recaptcha"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"id": "rc-api-002",
"name": "Solve reCAPTCHA",
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
0
],
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
},
"continueOnFail": true
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "1",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
},
"leftValue": "={{ $json.error }}",
"rightValue": ""
}
]
},
"options": {}
},
"id": "rc-api-003",
"name": "CapSolver Error?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
512,
-32
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"id": "rc-api-004",
"name": "Respond to Webhook (Error)",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
880,
-128
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"id": "rc-api-005",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
880,
32
]
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "Solve reCAPTCHA",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA": {
"main": [
[
{
"node": "CapSolver Error?",
"type": "main",
"index": 0
}
]
]
},
"CapSolver Error?": {
"main": [
[
{
"node": "Respond to Webhook (Error)",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
---
## ワークフロー:トークンをウェブサイトに送信する
これまでのAPIワークフローは、解決済みのキャプチャトークンを**取得する**方法を示してきました。しかし、実際にそれを**どう使う**のでしょうか?
実際の自動化では、キャプチャを解くことは仕事の半分に過ぎません。キャプチャの背後にあるデータやアクションを解除するために、ブラウザと同じように**トークンをターゲットのウェブサイトに送信する**必要があります。
一般的なパターンは以下の通りです:
1. **キャプチャを解く** → CapSolverから`gRecaptchaResponse`トークンを取得する
2. **トークンを送信する** → HTTPリクエストを通じてターゲットのウェブサイトに送信する(通常は`g-recaptcha-response`のフォームフィールドやURLパラメータとして)
3. **レスポンスを検証する** → ウェブサイトがトークンを受け入れ、期待されるデータを返したか確認する
4. **結果を処理する** → 必要なデータを抽出する
### 例:reCAPTCHA v2の解決と送信
**例:** [example.com](https://example.com)

#### ワークフローフロー```
Manual Trigger → CapSolver reCAPTCHA v2 → HTTP POST Request → IF (check success) → Valid / Invalid
```#### 仕組み
1. **手動トリガー** — ワークフローを手動で開始します(「Execute workflow」をクリック)。これを任意のトリガー(Webhook、スケジュール、アプリイベントなど)に置き換えることができます。
2. **CapSolver reCAPTCHA v2** — デモページのキャプチャを解決します:
- Website URL: `https://example.com`
- Website Key: `YOUR_SITE_KEY`
3. **HTTP POSTリクエスト** — 解決したトークンを同じURLにフォームPOSTとして送信します:
- トークンは `g-recaptcha-response` フォームフィールドに送信されます
- これはブラウザがキャプチャを解決して「Submit」をクリックしたときに行うのとまったく同じ動作です
4. **IFノード** — レスポンスのHTMLに `"recaptcha-success"` が含まれているかをチェックし、キャプチャが承認されたかを判定します
5. **Valid / Invalid** — IFノードは成功時に **Valid** ブランチへルーティングします(ここで必要なデータを抽出します。例:商品リストやフォーム結果のための **HTMLノード** など)、失敗時は **Invalid** ブランチへルーティングし、エラー処理を行います
> **重要なポイント:** 各ウェブサイトはトークンの送信方法が異なります。このデモではトークンをPOSTの `g-recaptcha-response` フォームフィールドに送信していますが、他のサイトではURLパラメータ、JSONボディ、またはまったく異なるエンドポイントを期待する場合があります。必ずサイトの実際のフォーム送信(DevToolsのNetworkタブを使用)を確認し、トークンをどのように送信する必要があるかを正確に把握してください。
<details>
<summary>ワークフローJSONを展開するにはクリック</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA v2 \u2014 All Triggers\n\n### How it works\n\n1. Receives solver requests through a webhook.\n2. Processes these requests using CapSolver and returns the results.\n3. Regularly triggers checks every hour using a schedule.\n4. Executes the scheduled process and checks the status of tasks.\n5. Allows manual testing of CapSolver through a manual trigger.\n\n### Setup steps\n\n- [ ] Set up webhook credentials for 'Receive Solver Request'.\n- [ ] Configure CapSolver with necessary keys for all CapSolver nodes.\n- [ ] Assign necessary permissions for HTTP request to reCAPTCHA endpoint.\n- [ ] Review and adjust the schedule in 'Schedule Trigger'.\n- [ ] Test manual execution with 'Manual Trigger'.\n",
"width": 480,
"height": 896
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-816,
-128
],
"id": "68e8c344-ce45-4e9f-859b-ca005db7c73e",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Receive and handle requests\n\nStarts with receiving a solver request via webhook, processes it, and returns the solver result.",
"width": 800,
"height": 304,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
-128
],
"id": "c26741c7-e0e6-4a4e-9fbf-2a623df014c8",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled recurrent process\n\nInitiates the process on an hourly schedule, sets target parameters, and sends them to CapSolver.",
"width": 800,
"height": 304,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
224
],
"id": "4b879cbf-e269-4260-9596-740b95df628a",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Process and validate token\n\nPosts to the reCAPTCHA validation endpoint and checks results, branching into pass or fail paths.",
"width": 736,
"height": 464,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
656,
96
],
"id": "7c860b53-f4a7-4d0b-8537-5253eec5a043",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Manual testing process\n\nAllows manual trigger testing with CapSolver and formats the result for review.",
"width": 800,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
576
],
"id": "8936a2df-c5b5-4c63-a0d5-afd190553a57",
"name": "Sticky Note4"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solve-recaptcha-v2",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-208,
0
],
"id": "11111111-1111-1111-1111-111111111101",
"name": "Receive Solver Request",
"webhookId": "a1b2c3d4-e5f6-7890-abcd-ef1234567801",
"onError": "continueRegularOutput"
},
{
"parameters": {
"type": "={{ $json.body.taskType || 'ReCaptchaV2TaskProxyLess' }}",
"proxy": "={{ $json.body.proxy || '' }}",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {
"pageAction": "={{ $json.body.pageAction || '' }}",
"isInvisible": "={{ $json.body.isInvisible || false }}",
"apiDomain": "={{ $json.body.apiDomain || '' }}",
"enterprisePayload": "={{ $json.body.enterprisePayload || '' }}",
"isSession": "={{ $json.body.isSession || false }}"
}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
0
],
"id": "11111111-1111-1111-1111-111111111102",
"name": "CapSolver [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
400,
0
],
"id": "11111111-1111-1111-1111-111111111103",
"name": "Return Solver Result"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-208,
352
],
"id": "11111111-1111-1111-1111-111111111104",
"name": "Schedule Trigger (Every 1h)"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sa-001",
"name": "websiteURL",
"value": "https://www.google.com/recaptcha/api2/demo",
"type": "string"
},
{
"id": "sa-002",
"name": "websiteKey",
"value": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
112,
352
],
"id": "11111111-1111-1111-1111-111111111105",
"name": "Set Target Params"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
400,
352
],
"id": "11111111-1111-1111-1111-111111111106",
"name": "CapSolver [Schedule]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://www.google.com/recaptcha/api2/demo",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"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"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
704,
352
],
"id": "11111111-1111-1111-1111-111111111107",
"name": "Submit Token"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-001",
"leftValue": "={{ $json.data }}",
"rightValue": "recaptcha-success",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1008,
352
],
"id": "11111111-1111-1111-1111-111111111108",
"name": "Check Result"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sp-001",
"name": "status",
"value": "passed",
"type": "string"
},
{
"id": "sp-002",
"name": "message",
"value": "reCAPTCHA v2 monitor passed successfully",
"type": "string"
},
{
"id": "sp-003",
"name": "timestamp",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1248,
224
],
"id": "11111111-1111-1111-1111-111111111109",
"name": "Monitor Passed"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sf-001",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "sf-002",
"name": "message",
"value": "reCAPTCHA v2 monitor FAILED \u2014 token rejected",
"type": "string"
},
{
"id": "sf-003",
"name": "timestamp",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1248,
384
],
"id": "11111111-1111-1111-1111-111111111110",
"name": "Monitor Failed"
},
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-208,
688
],
"id": "11111111-1111-1111-1111-111111111111",
"name": "Manual Trigger (Test)"
},
{
"parameters": {
"websiteURL": "https://www.google.com/recaptcha/api2/demo",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
688
],
"id": "11111111-1111-1111-1111-111111111112",
"name": "CapSolver [Manual]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "mr-001",
"name": "token",
"value": "={{ $json.data.solution.gRecaptchaResponse }}",
"type": "string"
},
{
"id": "mr-002",
"name": "taskId",
"value": "={{ $json.data.taskId }}",
"type": "string"
},
{
"id": "mr-003",
"name": "status",
"value": "solved",
"type": "string"
},
{
"id": "mr-004",
"name": "solvedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
400,
688
],
"id": "11111111-1111-1111-1111-111111111113",
"name": "Format Result"
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "CapSolver [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Webhook]": {
"main": [
[
{
"node": "Return Solver Result",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger (Every 1h)": {
"main": [
[
{
"node": "Set Target Params",
"type": "main",
"index": 0
}
]
]
},
"Set Target Params": {
"main": [
[
{
"node": "CapSolver [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Schedule]": {
"main": [
[
{
"node": "Submit Token",
"type": "main",
"index": 0
}
]
]
},
"Submit Token": {
"main": [
[
{
"node": "Check Result",
"type": "main",
"index": 0
}
]
]
},
"Check Result": {
"main": [
[
{
"node": "Monitor Passed",
"type": "main",
"index": 0
}
],
[
{
"node": "Monitor Failed",
"type": "main",
"index": 0
}
]
]
},
"Manual Trigger (Test)": {
"main": [
[
{
"node": "CapSolver [Manual]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Manual]": {
"main": [
[
{
"node": "Format Result",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
> **他のreCAPTCHAタイプへの適応:** この同じパターンは **v2 Invisible** と **v3** でも機能します。v2 Invisibleの場合は、CapSolverノードで `isInvisible: true` を設定します。v3の場合は、Operationを `reCAPTCHA v3` に変更し、`pageAction` パラメータを追加します。HTTPリクエストの送信ステップはサイトごとに異なるため、常にDevToolsで実際のフォーム送信を確認してください。
---
## ワークフロー:ユースケース例
上記のソルバーAPIとスクレイピングの例は基本パターンを示しています:キャプチャを解き、トークンを送信し、結果を処理する。以下のワークフローはこのパターンを **本番対応のユースケース** に拡張したもので、各ワークフローは二重トリガー(スケジュール+Webhook)、永続的な状態追跡、構造化された出力を備えています。
| ワークフロー | 目的 |
|---|---|
| `reCAPTCHA Scraping — Price & Product Details — CapSolver + Schedule + Webhook` | 6時間ごとに価格と商品名をスクレイピングし、`staticData` に保存された前回値と比較、変化があればアラートを出す |
| `reCAPTCHA Account Login — CapSolver + Schedule + Webhook` | キャプチャ保護されたサイトで、まず解いてからトークン付きで認証情報をPOSTし、自分のアカウントにログインする |
### 例1:スクレイピング — 価格と商品詳細
このワークフローは商品ページを6時間ごと(スケジュール)または要求時(Webhook)にスクレイピングし、HTMLノードで価格を抽出し、前回保存した値と比較します。
**スケジュールパス:**```
Every 6 Hours → Solve reCAPTCHA v3 → Fetch Product Page → Extract Data
→ Compare Data → Data Changed? → Build Alert / No Change
```> **エラーハンドリング:** CapSolverが失敗した場合、実行は停止しn8nで失敗としてマークされます。エラーを確認するには**Executions**をチェックするか、n8nの[エラーワークフロー](https://docs.n8n.io/flow-logic/error-handling/)を設定して自動通知を受け取ってください。
主な動作:
- `pageAction`パラメータ(設定可能)を使用した**reCAPTCHA v3**
- トークンは`x-recaptcha-token`ヘッダーとして送信される(サイトの期待する形式に合わせて調整可能)
- **HTMLノード**はCSSセレクター(`.product-price`、`h1`)を使って価格と商品名を抽出
- `$workflow.staticData.lastPrice`は前回の価格を実行間で保持
- 価格比較は**値下がり**(重大度: `deal`)と**値上がり**(重大度: `info`)の両方を検出
- タスクタイプは`ReCaptchaV3TaskProxyLess`(ハードコード)— タスクタイプやプロキシを変更するにはSolve reCAPTCHA v3ノードを直接編集
<details>
<summary>クリックして完全なワークフローJSONを展開(17ノード)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Scraping \u2014 Price & Product Monitor\n\n### How it works\n\n1. Triggers the workflow every 6 hours or via webhook.\n2. Configures target website URL and key for scraping.\n3. Solves reCAPTCHA to access the webpage.\n4. Fetches and extracts product data from the webpage.\n5. Compares current data with previous data to check for changes.\n6. Builds alert or updates status based on data changes.\n\n### Setup steps\n\n- [ ] Configure the 'Every 6 Hours' trigger to set the appropriate time schedule.\n- [ ] Set up the target website URL and key parameters in the 'Set Target Config [Schedule]' node.\n- [ ] Ensure the 'Solve reCAPTCHA' and 'Solve reCAPTCHA [Webhook]' nodes are configured with the correct CAPTCHA services.\n- [ ] Set up webhook endpoint in the 'Webhook Trigger' node.\n- [ ] Configure the 'Respond to Webhook' node for handling webhook responses.\n\n### Customization\n\nAdjust the 'Compare Data' and 'Compare Data [Webhook]' code to fit specific data comparison logic or data formats.",
"height": 896,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1312,
-352
],
"id": "871c5a60-20b4-4cc0-a357-d5cecb8a322a",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled trigger setup\n\nTriggers every 6 hours and sets the target config for scraping.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-128
],
"id": "43acb039-cfcd-47c3-892e-e13da011b721",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled CAPTCHA solving and page fetch\n\nSolves the CAPTCHA and fetches the product page based on schedule.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
-128
],
"id": "68fc53a6-181e-4ca8-bf7d-f3f8e9b12f9d",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Scheduled data extraction and comparison\n\nExtracts and compares data from the fetched page.",
"height": 272,
"width": 784,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
-112
],
"id": "155fc92b-721a-40bf-80e6-6dd2082b126a",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Scheduled alert or status update\n\nHandles response based on data comparison for scheduled runs.",
"height": 560,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1296,
-352
],
"id": "ee2c8c8e-d21d-42aa-b261-49a6fffb3d11",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "## Webhook trigger setup\n\nInitiates the workflow via a webhook request.",
"height": 368,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
304
],
"id": "6957473e-81a0-4afd-a0ea-e6f61c3be715",
"name": "Sticky Note5"
},
{
"parameters": {
"content": "## Webhook CAPTCHA solving and page fetch\n\nSolves the CAPTCHA and fetches the product page via webhook.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
304
],
"id": "48990176-a5b5-48db-ac09-bcc207318f0a",
"name": "Sticky Note6"
},
{
"parameters": {
"content": "## Webhook data extraction and comparison\n\nProcesses data fetched from the page and checks for changes via webhook.",
"height": 272,
"width": 784,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
320
],
"id": "844166d1-75f7-4192-8bfb-3a1381fb6235",
"name": "Sticky Note7"
},
{
"parameters": {
"content": "## Webhook alert or status update\n\nResponds to webhook trigger with alert or status update.",
"height": 544,
"width": 384,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1328,
240
],
"id": "c1926a60-dfb3-4520-a530-82aa40c6341c",
"name": "Sticky Note8"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
0
],
"id": "rc-s-901",
"name": "Every 6 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "websiteURL",
"value": "https://YOUR-TARGET-SITE.com/product-page",
"type": "string"
},
{
"id": "cfg-002",
"name": "websiteKey",
"value": "YOUR_SITE_KEY_HERE",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-400,
0
],
"id": "rc-s-900",
"name": "Set Target Config [Schedule]"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "rc-s-902",
"name": "Solve reCAPTCHA",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Set Target Config [Schedule]').first().json.websiteURL }}",
"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"
}
]
},
"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,
0
],
"id": "rc-s-903",
"name": "Fetch Product Page"
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price"
},
{
"key": "productName",
"cssSelector": "h1, .product-title"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
0
],
"id": "rc-s-904",
"name": "Extract Data"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'first check', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
0
],
"id": "rc-s-905",
"name": "Compare Data"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-1",
"leftValue": "={{ $json.changed }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
0
],
"id": "rc-s-906",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a2",
"name": "severity",
"value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
"type": "string"
},
{
"id": "a3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1344,
-160
],
"id": "rc-s-907",
"name": "Build Alert"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n1",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "n2",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1344,
48
],
"id": "rc-s-908",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-704,
480
],
"id": "rc-s-909",
"name": "Webhook Trigger",
"webhookId": "rc-s-909-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
432
],
"id": "rc-s-910",
"name": "Solve reCAPTCHA [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Webhook Trigger').item.json.body.websiteURL }}",
"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"
}
]
},
"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,
432
],
"id": "rc-s-911",
"name": "Fetch Product Page [Webhook]"
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price"
},
{
"key": "productName",
"cssSelector": "h1, .product-title"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
432
],
"id": "rc-s-912",
"name": "Extract Data [Webhook]"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'first check', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
432
],
"id": "rc-s-913",
"name": "Compare Data [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-2",
"leftValue": "={{ $json.changed }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
432
],
"id": "rc-s-914",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a4",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a5",
"name": "severity",
"value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
"type": "string"
},
{
"id": "a6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1376,
368
],
"id": "rc-s-915",
"name": "Build Alert [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n4",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "n5",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1392,
608
],
"id": "rc-s-916",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1568,
512
],
"id": "rc-s-917",
"name": "Respond to Webhook"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Set Target Config [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Set Target Config [Schedule]": {
"main": [
[
{
"node": "Solve reCAPTCHA",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA": {
"main": [
[
{
"node": "Fetch Product Page",
"type": "main",
"index": 0
}
]
]
},
"Fetch Product Page": {
"main": [
[
{
"node": "Extract Data",
"type": "main",
"index": 0
}
]
]
},
"Extract Data": {
"main": [
[
{
"node": "Compare Data",
"type": "main",
"index": 0
}
]
]
},
"Compare Data": {
"main": [
[
{
"node": "Data Changed?",
"type": "main",
"index": 0
}
]
]
},
"Data Changed?": {
"main": [
[
{
"node": "Build Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "No Change",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Solve reCAPTCHA [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA [Webhook]": {
"main": [
[
{
"node": "Fetch Product Page [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Fetch Product Page [Webhook]": {
"main": [
[
{
"node": "Extract Data [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Extract Data [Webhook]": {
"main": [
[
{
"node": "Compare Data [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Compare Data [Webhook]": {
"main": [
[
{
"node": "Data Changed? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Data Changed? [Webhook]": {
"main": [
[
{
"node": "Build Alert [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "No Change [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Build Alert [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"No Change [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
### 例 2: アカウントログイン
このワークフローは、キャプチャ保護されたサイトへのログインを自動化します。**Set Login Config** ノードはすべてのパラメータを一元管理しており、スケジュールパスには **[Schedule]**、オンデマンドのWebhookパスには **[Webhook]** を使用します。各パスの設定は該当する設定ノードを編集して行います。
**スケジュールパス:**```
Every 24 Hours → Set Login Config → Solve Captcha → Submit Login
→ Login Successful? → Mark Login Success / Mark Login Failed
```> **エラーハンドリング:** CapSolverが失敗した場合、実行は停止しn8nで失敗としてマークされます。エラーを確認するには**Executions**をチェックするか、n8nの[エラーワークフロー](https://docs.n8n.io/flow-logic/error-handling/)を設定して自動通知を受け取るようにしてください。
主な動作:
- デフォルトは**reCAPTCHA v2** (`ReCaptchaV2TaskProxyLess`) — 対応するパスのために**Set Login Config [Schedule]**または**Set Login Config [Webhook]**内の`taskType`を変更; v2とv3の切り替えはSolve Captchaノードの`Operation`を変更
- フォームフィールドは`email`、`password`、`g-recaptcha-response`にハードコードされています — 対象サイトのフィールド名に合わせて**Submit Login**ノードを直接編集してください
- **Login Successful?**のチェックは`statusCode < 400`とレスポンスボディ内の設定可能な`successMarker`の存在を評価
- **Webhookパス**は同じハードコードされたプレースホルダー値を使う**Set Login Config [Webhook]**を使用 — そのノードを編集してオンデマンドのWebhookパスを設定
- Webhookパスは**Respond to Webhook**を介して結果をJSONで返す
<details>
<summary>クリックして完全なワークフローJSONを展開(15ノード)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Account Login\n\n### How it works\n\n1. The workflow triggers every 24 hours to initiate a login process.\n2. It solves reCAPTCHA challenges for login attempts.\n3. Submits login credentials via HTTP requests.\n4. Checks if login is successful and records the outcome.\n5. A webhook can trigger the login process manually.\n6. Responds to webhook calls with login status.\n\n### Setup steps\n\n- [ ] Configure the schedule trigger for desired intervals.\n- [ ] Set up the webhook URL for manual login attempts.\n- [ ] Ensure that credentials for solving reCAPTCHA are valid.\n- [ ] Configure the HTTP request nodes with the correct login endpoint.\n- [ ] Confirm that response nodes are set with the correct output format.\n\n### Customization\n\nCustomizable time intervals for automated login attempts and custom webhook endpoints can be configured.",
"width": 480,
"height": 896
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1248,
-352
],
"id": "b76c0299-05e6-4d65-ba90-63a8148242af",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled login initialization\n\nTriggers login attempts every 24 hours and configures necessary parameters.",
"width": 1408,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-688,
-112
],
"id": "0610b8c8-fce5-4efd-b3d2-1eeeb6eba648",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled login results\n\nDetermines and marks the results of scheduled login attempts.",
"width": 240,
"height": 528,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
816,
-352
],
"id": "73eec9f0-dbe8-43a5-bff7-2308b4cac998",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Webhook login initialization\n\nManual login attempts triggered by webhook, solving reCAPTCHA.",
"width": 1408,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-688,
320
],
"id": "0680f603-0a47-429f-81cb-69ff7741a9bd",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Webhook login results and response\n\nRecords results of webhook login attempts and sends response.",
"width": 512,
"height": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
816,
208
],
"id": "4f244d27-03e3-4670-8e6f-67ed6264ac8d",
"name": "Sticky Note4"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-640,
0
],
"id": "rc-l-921",
"name": "Every 24 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "l1",
"name": "websiteURL",
"value": "https://YOUR-LOGIN-PAGE.com",
"type": "string"
},
{
"id": "l2",
"name": "websiteKey",
"value": "YOUR_SITE_KEY_HERE",
"type": "string"
},
{
"id": "l3",
"name": "successMarker",
"value": "account-dashboard",
"type": "string"
},
{
"id": "l4",
"name": "userAgent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-336,
0
],
"id": "rc-l-922",
"name": "Set Login Config [Schedule]"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-32,
0
],
"id": "rc-l-923",
"name": "Solve Captcha [Schedule]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Set Login Config [Schedule]').item.json.websiteURL }}/login",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $('Set Login Config [Schedule]').item.json.userAgent }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "email",
"value": "your-email@example.com"
},
{
"name": "password",
"value": "YOUR_ACCOUNT_PASSWORD"
},
{
"name": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
272,
0
],
"id": "rc-l-924",
"name": "Submit Login [Schedule]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "lif1",
"leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || '').includes($('Set Login Config [Schedule]').item.json.successMarker) }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
576,
0
],
"id": "rc-l-925",
"name": "Login Successful? [Schedule]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "s1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "s2",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "s3",
"name": "message",
"value": "Configured account login flow succeeded",
"type": "string"
},
{
"id": "s4",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
864,
-192
],
"id": "rc-l-926",
"name": "Mark Login Success [Schedule]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "f1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "f2",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "f3",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "f4",
"name": "message",
"value": "Login response did not match the configured success marker",
"type": "string"
},
{
"id": "f5",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
864,
16
],
"id": "rc-l-927",
"name": "Mark Login Failed [Schedule]"
},
{
"parameters": {
"httpMethod": "POST",
"path": "account-login-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-640,
432
],
"id": "rc-l-928",
"name": "Webhook Trigger",
"webhookId": "rc-l-928-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-32,
432
],
"id": "rc-l-929",
"name": "Solve Captcha [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Webhook Trigger').item.json.body.loginActionURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $('Webhook Trigger').item.json.body.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "={{ $('Webhook Trigger').item.json.body.usernameField || 'email' }}",
"value": "={{ $('Webhook Trigger').item.json.body.usernameValue }}"
},
{
"name": "={{ $('Webhook Trigger').item.json.body.passwordField || 'password' }}",
"value": "={{ $('Webhook Trigger').item.json.body.passwordValue }}"
},
{
"name": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
272,
432
],
"id": "rc-l-930",
"name": "Submit Login [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "lif2",
"leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || '').includes($('Webhook Trigger').item.json.body.successMarker) }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
576,
432
],
"id": "rc-l-931",
"name": "Login Successful? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "ws1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "ws2",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "ws3",
"name": "message",
"value": "Configured account login flow succeeded",
"type": "string"
},
{
"id": "ws4",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
864,
336
],
"id": "rc-l-932",
"name": "Mark Login Success [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "wf1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "wf2",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "wf3",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "wf4",
"name": "message",
"value": "Login response did not match the configured success marker",
"type": "string"
},
{
"id": "wf5",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
880,
528
],
"id": "rc-l-933",
"name": "Mark Login Failed [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1184,
496
],
"id": "rc-l-934",
"name": "Respond to Webhook"
}
],
"connections": {
"Every 24 Hours": {
"main": [
[
{
"node": "Set Login Config [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Set Login Config [Schedule]": {
"main": [
[
{
"node": "Solve Captcha [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Solve Captcha [Schedule]": {
"main": [
[
{
"node": "Submit Login [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Schedule]": {
"main": [
[
{
"node": "Login Successful? [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Login Successful? [Schedule]": {
"main": [
[
{
"node": "Mark Login Success [Schedule]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Login Failed [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Solve Captcha [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve Captcha [Webhook]": {
"main": [
[
{
"node": "Submit Login [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Webhook]": {
"main": [
[
{
"node": "Login Successful? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Login Successful? [Webhook]": {
"main": [
[
{
"node": "Mark Login Success [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Login Failed [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Mark Login Success [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Mark Login Failed [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
n8n と CapSolver を使って、reCAPTCHA 解決 API と 本番環境対応のスクレイピングワークフロー を構築する方法を学びました — 従来のコーディングは不要です。
このガイドで扱った内容:
重要なポイント:キャプチャを解くことは仕事の半分に過ぎません — 保護されたデータを取得するには、トークンを対象ウェブサイトに送信する 必要があります。
ヒント: これらのワークフローは Schedule + Webhook トリガーを使っていますが、トリガーノードは任意の n8n トリガー(手動、アプリイベント、フォーム送信など)に切り替え可能です。データ取得後は、n8n の組み込みノードを使って結果を Google Sheets、データベース、クラウドストレージに保存したり、Telegram/Slack/Email で通知を送ったりできます。
始める準備はできましたか? CapSolver にサインアップして、ボーナスコード n8n を使うと初回チャージ時に追加で 8% ボーナスがもらえます!

料金はキャプチャの種類によって異なります。reCAPTCHA v2 は通常 1,000 回の解決あたり $1〜3 程度です。最新の料金は CapSolver の料金ページ をご確認ください。
ほとんどの reCAPTCHA v2 チャレンジは 5〜20 秒 で解決されます。reCAPTCHA v3 は画像チャレンジがないため、通常はより高速です。
はい!これらのワークフローはセルフホストの n8n と n8n Cloud の両方で動作します。CapSolver ノードは公式統合として既に利用可能なので、API 認証情報を追加するだけです。
最も簡単なのは CapSolver ブラウザ拡張機能 を使う方法です — DevTools を開き、「CapSolver Captcha Detector」タブに切り替えてキャプチャをトリガーすると、拡張機能がすべてのパラメータを自動で表示します。あるいは、ページソースで data-sitekey や reCAPTCHA スクリプト URL の render= を検索する方法もあります。
どちらも同じ技術を使っていますが、v2 は目に見えるチェックボックス(「私はロボットではありません」)を表示し、v2 Invisible は目に見えるウィジェットなしでバックグラウンドで動作します。解決時の違いは isInvisible: true を設定するかどうかだけです。
いくつかの原因が考えられます。まず、トークンはすぐに期限切れになるので、すぐに送信してください。次に、トークンを正しい場所に送信しているか確認してください:フォーム送信時の実際のネットワークリクエスト(DevTools → Network タブ)を調べて、フィールド名、リクエストメソッド、エンドポイントが n8n で設定したものと一致しているか確認します。さらに、一部のサイトでは enterprisePayload や特定のクッキー・ヘッダーなどの追加パラメータが必要な場合があります — CapSolver 拡張機能で該当するか確認してください。それでもトークンが拒否される場合は、CapSolver サポート にお問い合わせください。サイト固有のサポートを受けられます。
スケーラブルなRustウェブスクレイピングアーキテクチャを学びましょう。リクエスト、スクレイパー、非同期スクレイピング、ヘッドレスブラウザスクレイピング、プロキシローテーション、およびコンプライアンス対応のCAPTCHA処理で。

2026年のデータ・アズ・ア・サービス(DaaS)を理解する。その利点、ユースケース、およびリアルタイムの洞察と拡張性を通じて企業を変革する方法について探る。
