
Nikolai Smirnov
Software Development Lead

GeeTest V4は、GeeTestの行動CAPTCHAシステムの最新世代であり、ログインフォーム、登録ページ、データエンドポイントを保護するために、ますます多くのウェブサイトで使用されています。画像パズルに依存する古いCAPTCHAシステムとは異なり、GeeTest V4は適応型チャレンジと行動分析を使用しており、自動化ワークフローで遭遇するより洗練された保護の1つとなっています。
再利用可能なソリューションAPIを構築している場合でも、CAPTCHAで保護されたサイトからデータをスクレイピングしている場合でも、ログインフォームを自動化している場合でも、従来のコードを1行も書かずにn8nワークフロー内でGeeTest V4を自動的に解決できたらどうでしょうか?
このガイドでは、n8n(ビジュアルワークフロー自動化ツール)と**CapSolver**(AIを活用したCAPTCHA解決サービス)を組み合わせて、GeeTest V4チャレンジをオンデマンドで解決する方法を学びます。これは、スタンドアロンのAPIエンドポイントとして、またはより大きな自動化ワークフロー内のステップとして機能します。
構築するもの:
ソリューションAPI — 他のツールが呼び出すことができる再利用可能なエンドポイント:
直接使用ワークフロー — CapSolverをより大きな自動化内のステップとして埋め込む:
GeeTest V4は、GeeTestのCAPTCHAプラットフォームの最新バージョンです。これは、簡素化された統合モデルと強化された行動検出により、以前のV3システムを置き換えます。解決の観点から見ると、V4はV3よりも構造的にシンプルです。V3が必要とする動的なチャレンジフローではなく、静的なcaptchaIdパラメーターのみを必要とします。

GeeTest V3との主な違い:
| 機能 | GeeTest V3 | GeeTest V4 |
|---|---|---|
| 主要パラメーター | gt + 動的challenge |
captchaId(静的) |
| チャレンジの取得 | 必須 — 最初にGeeTest APIを呼び出す必要がある | 不要 — captchaIdは静的 |
| ソリューションフィールド | 3 (challenge, validate, seccode) |
5 (captcha_id, lot_number, pass_token, gen_time, captcha_output) |
| ウィジェットスクリプト | gt.js |
gcaptcha4.js |
| タスクタイプ | GeeTestTask / GeeTestTaskProxyLess |
GeeTestTaskProxyLessのみ |
V4の主な利点:
captchaIdはページソースコードに埋め込まれており、変更されることはありません。一度見つければ、永久に使用できます。動的なチャレンジ取得がないということは、ワークフローのノードが少ないことを意味します。
始める前に、以下があることを確認してください。
重要: CapSolverアカウントに十分な残高があることを確認してください。GeeTest V4解決タスクは使用量に基づいてクレジットを消費します。
CapSolverはn8nの公式統合として利用可能であり、コミュニティノードのインストールは不要です。ワークフローを構築する際に、ノードパネルで直接見つけることができます。
公式統合であるため、CapSolverノードがアカウントで認証できるように、n8nで資格情報を作成する必要があります。
n8nインスタンスに移動し、Settings > Credentialsに移動します。ここに設定されているすべての資格情報が表示されます。

All(デフォルト)のままにしますn8nは自動的に接続をテストします。APIキーが有効であることを確認する緑色の**「Connection tested successfully」**バナーが表示されるはずです。

重要: ワークフロー内の各CapSolverノードは、この資格情報を参照します。一度作成するだけで済みます。すべてのソリューションワークフローは同じ資格情報を共有します。
これで、GeeTest V4ソリューションワークフローを構築する準備が整いました!
GeeTest V4 CAPTCHAを解決する前に、その**captchaId(唯一の必須パラメーター)を見つける必要があります。GeeTest V3(動的なchallengeの取得が必要)とは異なり、V4のcaptchaIdは静的**であり、ページソースコードに直接埋め込まれています。
captcha_idまたはcaptchaIdを検索しますgcaptcha4.jsへの参照を探しますcaptchaIdは通常、ウィジェットの初期化時に構成パラメーターとして渡されます<!-- 例:ページソースコードでのGeeTest V4の初期化 -->
<script>
initGeetest4({
captchaId: 'e392e1d7fd421dc63325744d5a2b9c73',
product: 'bind'
});
</script>
gcaptcha4またはgeetestでリクエストをフィルタリングしますgcaptcha4.geetest.comへのリクエストを探します。captcha_idパラメーターはクエリ文字列にありますV4の主な利点:
captchaIdは静的です。一度見つければ、毎回新しいチャレンジを取得する必要なく、無期限に使用できます。これにより、V4ワークフローはTurnstileワークフローと構造的に同一になります。
このワークフローは、GeeTest V4パラメーターを受け入れ、解決されたトークンのセットを返すPOST APIエンドポイントを作成します。

ワークフローは4つのノードで構成されています。
$json.errorが空ではないかどうか)に基づいて分岐するIFノード{"error": "..."}を返します| 設定 | 値 |
|---|---|
| HTTPメソッド | POST |
| パス | solver-geetest-v4 |
| 応答 | Response Node |
これにより、https://your-n8n-instance.com/webhook/solver-geetest-v4にエンドポイントが作成されます。
| パラメーター | 値 | 説明 |
|---|---|---|
| 操作 | GeeTest V4 |
GeeTest V4に設定する必要があります |
| タイプ | GeeTestTaskProxyLess |
利用可能な唯一のタスクタイプ(プロキシバリアントなし) |
| ウェブサイトURL | {{ $json.body.websiteURL }} |
GeeTest V4ウィジェットがあるページのURL |
| Captcha ID | {{ $json.body.captchaId }} |
静的なGeeTest V4 captcha ID |
| GeeTest APIサーバーサブドメイン | (オプション) | サイトが使用している場合はカスタムGeeTest APIサーバー |
このノードでCapSolver資格情報を選択してください。オプションの
geetestApiServerSubdomainパラメーターはめったに必要ありません。ターゲットサイトでデフォルトのGeeTestサーバーが機能しない場合にのみ追加してください。
| 設定 | 値 |
|---|---|
| 条件 | ={{ $json.error }}が空ではない |
| Trueブランチ | エラー応答Webhookノードにルーティングします |
| Falseブランチ | 成功応答Webhookノードにルーティングします |
成功ブランチ(CapSolverエラー?のFalse出力):
| 設定 | 値 |
|---|---|
| 応答形式 | JSON |
| 応答本文 | ={{ JSON.stringify($json.data) }} |
WebhookエンドポイントにPOSTリクエストを送信します。
curl -X POST https://your-n8n-instance.com/webhook/solver-geetest-v4 \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"captchaId": "e392e1d7fd421dc63325744d5a2b9c73"
}'
期待される応答:
{
"taskId": "abc123...",
"solution": {
"captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
"lot_number": "7c18c041a6ed4e...",
"pass_token": "d88ce40c0a5c5a18...",
"gen_time": "1709123456",
"captcha_output": "dGVzdF9jYXB0Y2hh..."
},
"status": "ready"
}
以下のJSONをコピーし、Menu > Import from JSONからn8nにインポートします。
{
"name": "GeeTest V4 — Solver API",
"nodes": [
{
"parameters": {
"content": "## GeeTest V4 — ソルバーAPI\n\n**対象者:** GeeTest V4チャレンジをシンプルなPOSTエンドポイント経由で解決する必要がある開発者。\n\n**機能:** captchaパラメーターを受け入れ、CapSolverでチャレンジを解決し、トークンまたはエラーをJSONとして返すwebhookを公開します。\n\n**仕組み:**\n1. Webhookは、ターゲットURL、サイトキー、およびオプションパラメーターを含むPOSTを受け取ります。\n2. CapSolverノードはGeeTest V4チャレンジを解決します。\n3. IFノードはエラーをチェックし、成功トークンまたはエラーJSONを返します。\n\n**セットアップ:**\n1. **Settings → Credentials → CapSolver API**にCapSolver APIキーを追加します。\n2. ワークフローをアクティブ化します。\n3. captchaパラメーターを使用してwebhook URLにPOSTします。",
"height": 494,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-712,
-400
],
"id": "sticky-blog-main-1773678228112-1",
"name": "Sticky Note"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-192,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40001",
"name": "Webhook Trigger",
"webhookId": "a1b2c3d4-aaaa-bbbb-cccc-a1b2c3d40001",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "={{ $json.body.websiteURL }}",
"captchaId": "={{ $json.body.captchaId }}",
"geetestApiServerSubdomain": "={{ $json.body.geetestApiServerSubdomain }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
104,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40002",
"name": "Solve GeeTest V4",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "geetest-if-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
408,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40003",
"name": "CapSolver Error?"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
712,
-80
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40004",
"name": "Respond to Webhook (Success)"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
712,
128
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40005",
"name": "Respond to Webhook (Error)"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Solve GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4": {
"main": [
[
{
"node": "CapSolver Error?",
"type": "main",
"index": 0
}
]
]
},
"CapSolver Error?": {
"main": [
[
{
"node": "Respond to Webhook (Success)",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook (Error)",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
このワークフローは、6時間ごと(スケジュール)またはオンデマンド(webhook)で製品ページをスクレイピングし、HTMLノードを使用して価格を抽出し、以前に保存された値と比較します。
スケジュールパス:
6時間ごと -> GeeTest V4を解決 -> 製品ページを取得 -> データを抽出
-> データを比較 -> データが変更されたか? -> アラートを構築 / 変更なし
主な動作:
.product-price、h1)を介して価格と製品名を抽出します$workflow.staticData.lastPriceは、実行間で以前の価格を保持しますdeal)と上昇(重大度:info)の両方を検出します{
"name": "GeeTest V4 Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## GeeTest V4スクレイピング — 価格と製品モニター\n\n**対象者:** GeeTest V4で保護されたサイトの価格や製品データを監視する必要があるチーム。\n\n**機能:** GeeTest V4を解決し、製品ページを取得し、CSSセレクターを介して価格と名前を抽出し、保存された値と比較し、変更があればアラートを発します。\n\n**仕組み:**\n1. スケジュール(6時間ごと)またはWebhookがフローをトリガーします。\n2. CapSolverがGeeTest V4チャレンジを解決します。\n3. HTTPリクエストが解決されたトークンで製品ページを取得します。\n4. HTMLノードが価格と製品名を抽出します。\n5. コードノードが現在の価格と保存された価格を比較し、変更があればアラートを発します。\n\n**セットアップ:**\n1. **Settings → Credentials**にCapSolver APIキーを追加します。\n2. プレースホルダーURLとサイトキーを置き換えます。\n3. ターゲットページに合わせて「Extract Data」のCSSセレクターを更新します。\n4. 「Build Alert」の出力を通知チャネルに接続します。",
"height": 560,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-920,
-380
],
"id": "sticky-blog-main-1773678228112-1",
"name": "Sticky Note"
},
{
"parameters": {
"content": "### スケジュールパス\n6時間ごとに自動的に実行されます。\n結果は、実行間の比較のためにワークフローの静的データに保存されます。",
"height": 480,
"width": 1900,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-440,
-280
],
"id": "sticky-blog-section-1773678228112-2",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "### Webhookパス\nオンデマンドトリガー — 同じロジックで、結果をJSON応答として返します。",
"height": 480,
"width": 1900,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-440,
140
],
"id": "sticky-blog-section-1773678228112-3",
"name": "Sticky Note2"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-400,
0
],
"id": "99999999-9999-9999-9999-999999999901",
"name": "Every 6 Hours"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"captchaId": "YOUR_CAPTCHA_ID_HERE",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "99999999-9999-9999-9999-999999999902",
"name": "Solve GeeTest V4",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://YOUR-TARGET-SITE.com/product-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"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "captcha_id",
"value": "={{ $json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "99999999-9999-9999-9999-999999999903",
"name": "Fetch Product Page"
},
{
"parameters": {
"operation": "extractHtmlContent",
"sourceData": "json",
"dataPropertyName": "data",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price",
"returnValue": "text",
"returnArray": false
},
{
"key": "productName",
"cssSelector": "h1, .product-title",
"returnValue": "text",
"returnArray": false
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
0
],
"id": "99999999-9999-9999-9999-999999999904",
"name": "Extract Data"
},
{
"parameters": {
"jsCode": "// ワークフローの静的データから現在および以前の価格を取得\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// 比較のために数値に解析\nconst parsePrice = (str) => {\n if (!str) return null;\n const match = str.match(/[\\d,]+\\.?\\d*/);\n return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// 保存された価格を更新\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\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';\n\nreturn [{\n json: {\n productName,\n currentPrice,\n previousPrice: previousPrice || 'first check',\n changed,\n direction,\n diff: changed ? `$${diff}` : null,\n checkedAt: new Date().toISOString()\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
0
],
"id": "99999999-9999-9999-9999-999999999905",
"name": "Compare Data"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "price-if-001",
"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": "99999999-9999-9999-9999-999999999906",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-001",
"name": "alert",
"value": "={{ $json.productName }}の価格が{{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})に{{ $json.direction === 'dropped' ? '下落' : '上昇' }}しました",
"type": "string"
},
{
"id": "alert-002",
"name": "severity",
"value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
"type": "string"
},
{
"id": "alert-003",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
-80
],
"id": "99999999-9999-9999-9999-999999999907",
"name": "Build Alert"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "nc-001",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "nc-002",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "nc-003",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
128
],
"id": "99999999-9999-9999-9999-999999999908",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-400,
420
],
"id": "99999999-9999-9999-9999-999999999909",
"name": "Webhook Trigger",
"webhookId": "99999999-aaaa-bbbb-cccc-999999999909",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"captchaId": "YOUR_CAPTCHA_ID_HERE",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
420
],
"id": "99999999-9999-9999-9999-999999999910",
"name": "Solve GeeTest V4 [Webhook]",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://YOUR-TARGET-SITE.com/product-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"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "captcha_id",
"value": "={{ $json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
420
],
"id": "99999999-9999-9999-9999-999999999911",
"name": "Fetch Product Page [Webhook]"
},
{
"parameters": {
"operation": "extractHtmlContent",
"sourceData": "json",
"dataPropertyName": "data",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price",
"returnValue": "text",
"returnArray": false
},
{
"key": "productName",
"cssSelector": "h1, .product-title",
"returnValue": "text",
"returnArray": false
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
420
],
"id": "99999999-9999-9999-9999-999999999912",
"name": "Extract Data [Webhook]"
},
{
"parameters": {
"jsCode": "// ワークフローの静的データから現在および以前の価格を取得\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// 比較のために数値に解析\nconst parsePrice = (str) => {\n if (!str) return null;\n const match = str.match(/[\\d,]+\\.?\\d*/);\n return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// 保存された価格を更新\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\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';\n\nreturn [{\n json: {\n productName,\n currentPrice,\n previousPrice: previousPrice || 'first check',\n changed,\n direction,\n diff: changed ? `$${diff}` : null,\n checkedAt: new Date().toISOString()\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
420
],
"id": "99999999-9999-9999-9999-999999999913",
"name": "Compare Data [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "price-if-002",
"leftValue": "={{ $json.changed }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
420
],
"id": "99999999-9999-9999-9999-999999999914",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-004",
"name": "alert",
"value": "={{ $json.productName }}の価格が{{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})に{{ $json.direction === 'dropped' ? '下落' : '上昇' }}しました",
"type": "string"
},
{
"id": "alert-005",
"name": "severity",
"value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
"type": "string"
},
{
"id": "alert-006",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
340
],
"id": "99999999-9999-9999-9999-999999999915",
"name": "Build Alert [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "nc-004",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "nc-005",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "nc-006",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
548
],
"id": "99999999-9999-9999-9999-999999999916",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1712,
420
],
"id": "99999999-9999-9999-9999-999999999917",
"name": "Respond to Webhook [Webhook]"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Solve GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4": {
"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 GeeTest V4 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4 [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 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"No Change [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook [Webhook]",
"type": "main",
"index": 0
}
]
]
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Solve GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4": {
"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 GeeTest V4 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4 [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 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"No Change [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook [Webhook]",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
このワークフローは、GeeTest V4で保護されたログインフォームの送信を最初から最後まで自動化します。資格情報を送信する前にGeeTest V4チャレンジを解決します。
このワークフローは5つのノードで構成されています。
| 設定 | 値 |
|---|---|
| HTTPメソッド | POST |
| パス | login-geetest-v4 |
| 応答 | Response Node |
これにより、https://your-n8n-instance.com/webhook/login-geetest-v4にエンドポイントが作成されます。
| パラメーター | 値 |
|---|---|
| 操作 | GeeTest V4 |
| ウェブサイトURL | https://YOUR-TARGET-SITE.com/login |
| Captcha ID | YOUR_CAPTCHA_ID_HERE |
CapSolver資格情報も選択してください。
| 設定 | 値 |
|---|---|
| メソッド | POST |
| URL | https://YOUR-TARGET-SITE.com/login |
| コンテンツタイプ | form-urlencoded |
| 本文パラメーター | username=YOUR_USERNAME、password=YOUR_PASSWORD、captcha_id={{ $('Solve GeeTest V4').item.json.data.solution.captcha_id }}、lot_number={{ $('Solve GeeTest V4').item.json.data.solution.lot_number }}、pass_token={{ $('Solve GeeTest V4').item.json.data.solution.pass_token }}、gen_time={{ $('Solve GeeTest V4').item.json.data.solution.gen_time }}、captcha_output={{ $('Solve GeeTest V4').item.json.data.solution.captcha_output }} |
重要:
YOUR_USERNAMEとYOUR_PASSWORDを実際の資格情報に置き換えてください。また、ターゲットサイトのHTMLに合わせてフォームフィールド名を調整する必要がある場合があります。
| 設定 | 値 |
|---|---|
| 応答形式 | JSON |
| 応答本文 | ={{ JSON.stringify($json) }} |
WebhookエンドポイントにPOSTリクエストを送信します。
curl -X POST https://your-n8n-instance.com/webhook/login-geetest-v4 \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"captchaId": "e392e1d7fd421dc63325744d5a2b9c73",
"username": "testuser",
"password": "testpass"
}'
期待される応答(成功):
{
"status": "success",
"message": "Login successful",
"solution": {
"captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
"lot_number": "7c18c041a6ed4e...",
"pass_token": "d88ce40c0a5c5a18...",
"gen_time": "1709123456",
"captcha_output": "dGVzdF9jYXB0Y2hh..."
}
}
期待される応答(失敗):
{
"status": "failed",
"message": "Login failed: Invalid credentials or captcha",
"error": "..."
}
以下のJSONをコピーし、Menu > Import from JSONからn8nにインポートします。
{
"name": "GeeTest V4 Account Login — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## GeeTest V4アカウントログイン自動化 — CapSolver + スケジュール + Webhook\n\n**対象者:** GeeTest V4で保護されたアカウントへのログインを自動化する必要があるチーム。\n\n**機能:** GeeTest V4チャレンジを解決し、解決されたトークンとユーザー資格情報を使用してログインフォームを送信します。\n\n**仕組み:**\n1. Webhookがフローをトリガーします。\n2. CapSolverがGeeTest V4チャレンジを解決します。\n3. HTTPリクエストが解決されたトークンとユーザー資格情報を使用してログインフォームを送信します。\n4. Webhookがログイン結果を返します。\n\n**セットアップ:**\n1. **Settings → Credentials**にCapSolver APIキーを追加します。\n2. プレースホルダーURLと資格情報を置き換えます。\n3. ターゲットサイトに合わせてフォームフィールド名を調整します。\n4. ワークフローをアクティブ化します。",
"height": 480,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-728,
-400
],
"id": "sticky-blog-main-1773678228112-1",
"name": "Sticky Note"
},
{
"parameters": {
"httpMethod": "POST",
"path": "login-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-400,
0
],
"id": "a2b3c4d5-0001-0001-0001-a2b3c4d50001",
"name": "Webhook Trigger",
"webhookId": "a2b3c4d5-aaaa-bbbb-cccc-a2b3c4d50001",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "={{ $json.body.websiteURL }}",
"captchaId": "={{ $json.body.captchaId }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "a2b3c4d5-0001-0001-0001-a2b3c4d50002",
"name": "Solve GeeTest V4",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $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"
},
{
"name": "Content-Type",
"value": "application/x-www-form-urlencoded"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "username",
"value": "={{ $json.body.username }}"
},
{
"name": "password",
"value": "={{ $json.body.password }}"
},
{
"name": "captcha_id",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $('Solve GeeTest V4').item.json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "a2b3c4d5-0001-0001-0001-a2b3c4d50003",
"name": "Submit Login Form"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
512,
0
],
"id": "a2b3c4d5-0001-0001-0001-a2b3c4d50004",
"name": "Respond to Webhook"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Solve GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4": {
"main": [
[
{
"node": "Submit Login Form",
"type": "main",
"index": 0
}
]
]
},
"Submit Login Form": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
このエラーは、CapSolverアカウントまたはプランにGeeTest V4へのアクセスが含まれていないことを示します。このサービスがプランに含まれているかどうかは、CapSolverダッシュボードで確認してください。
このエラーは、CapSolverノードで指定したwebsiteURLパラメーターが正しくないことを示します。ターゲットサイトの開発者ツールのネットワークタブを再確認して、正しい値を使用していることを確認してください。
GeeTest V4が正常に解決されてもログインに失敗する場合、問題は次の点にある可能性があります。
このエラーは、n8nで設定したCapSolver APIキーが正しくないか、期限切れになっていることを示します。CapSolverダッシュボードを確認し、n8nの資格情報を更新してください。
websiteURLやcaptchaId、geetestApiServerSubdomainなどのオプションパラメーターが正しいことを再確認してください。これらはGeeTest V4の解決を成功させるために重要です。始める準備はできましたか? CapSolverにサインアップし、ボーナスコードn8nを使用して、最初のチャージで追加の8%ボーナスを獲得してください!

GeeTest V4は、GeeTestの行動CAPTCHAシステムの最新世代であり、適応型チャレンジと行動分析を使用してウェブサイトを保護します。
GeeTest V4はV3よりも構造的にシンプルで、V3が必要とする動的なチャレンジフローではなく、静的なcaptchaIdパラメーターのみを必要とします。また、gcaptcha4.jsスクリプトを使用し、5つのソリューションフィールドを返します。
価格は使用量によって異なります。GeeTest V4の現在の価格については、CapSolverの価格ページを参照してください。GeeTest V4解決タスクは、単純な画像からテキストへの認識よりも高価ですが、他の複雑なCAPTCHAタイプよりも安価です。
GeeTest V4解決タスクは通常、チャレンジの複雑さとCapSolverサーバーの負荷に応じて10〜30秒かかります。ImageToTextTaskとは異なり、GeeTest V4の解決にはタスクの作成とポーリングが含まれるため、即座ではありません。
CapSolverのGeeTest V4解決サービスでは通常、プロキシを提供する必要はありません。CapSolverは内部的にプロキシ要件を処理します。websiteURLとcaptchaIdを提供するだけで済みます。
GeeTest V4トークンが受け入れられない場合は、次の点を確認してください。
websiteURLとcaptchaIdパラメーターが正しいことを確認してください。GeeTest V4が正常に解決されてもログインに失敗する場合、次の点を確認してください。
はい。このワークフローは、セルフホスト型n8nとn8n Cloudの両方で機能します。CapSolverノードはすでに公式統合として利用可能です。API資格情報を追加するだけで済みます。