
Sora Fujimoto
AI Solutions Architect

GeeTest V3は、ウェブ上で最も広く展開されている行動型CAPTCHAの1つです。単純なチェックボックスチャレンジとは異なり、GeeTest V3はインタラクティブなパズル(スライドして検証、アイコン選択、単語マッチング)を使用して、人間とボットを区別します。アジアのログインページ、登録フォーム、データ量の多いサイトでよく見られ、世界中でますます普及しています。
再利用可能な解決APIを構築している場合でも、CAPTCHAで保護されたサイトからデータをスクレイピングしている場合でも、ログインフォームを自動化している場合でも、従来のコードを1行も書かずに、n8nワークフロー内でGeeTest V3を自動的に解決できたらどうでしょうか?
このガイドでは、n8n(ビジュアルワークフロー自動化ツール)と**CapSolver**(AIを活用したCAPTCHA解決サービス)を組み合わせて、GeeTest V3チャレンジをオンデマンドで解決する方法を学びます。これは、スタンドアロンのAPIエンドポイントとして、またはより大きな自動化ワークフロー内のステップとして機能します。
構築するもの:
解決API — 他のツールが呼び出すことができる再利用可能なエンドポイント:
直接使用ワークフロー — より大きな自動化にステップとして埋め込まれたCapSolver:
GeeTest V3は、インタラクティブなタスクを通じてユーザーを検証するチャレンジ応答CAPTCHAシステムです。reCAPTCHA(単一のトークンを使用)やCloudflare Turnstile(目に見えない形で実行)とは異なり、GeeTest V3はユーザーの操作を必要とする目に見えるパズルを提示します。
解決の観点から見ると、GeeTest V3には2つの重要なパラメーターがあります。
gt — サイトごとの識別子(サイトキーのようなもの)。これは静的です。セッション間で変更されません。challenge — セッションごとのトークン。これは動的です。毎回変更され、約60〜120秒で期限切れになります。この動的なchallengeパラメーターは、他のCAPTCHAタイプとの重要な違いです。GeeTest V3を解決するすべてのワークフローには、CapSolverに送信する前に新しいチャレンジを取得するための追加のステップが必要です。
解決形式: 単一のトークンを返すreCAPTCHAやTurnstileとは異なり、GeeTest V3は3つの個別の値を返します。
challenge — 解決されたチャレンジ文字列validate — 検証ハッシュseccode — セキュリティコードこれらは、geetest_challenge、geetest_validate、geetest_seccodeの3つのフォームフィールドとして送信されます。

GeeTest V3 vs V4: GeeTest V4は異なるAPI構造(
gtの代わりにcaptcha_id、個別のchallenge取得なし)を使用します。このガイドはGeeTest V3に特化しています。ページソースにcaptcha_idが表示されている場合は、V4を扱っています。
始める前に、次のものがあることを確認してください。
重要: CapSolverアカウントに十分な残高があることを確認してください。GeeTest V3解決タスクは使用量に基づいてクレジットを消費します。
CapSolverはn8nの公式統合として利用可能であり、コミュニティノードのインストールは不要です。ワークフローを構築する際に、ノードパネルで直接見つけることができます。
公式統合であるため、CapSolverノードがアカウントで認証できるように、n8nで資格情報を作成する必要があります。
n8nインスタンスに移動し、Settings -> Credentialsに移動します。ここに設定されているすべての資格情報が表示されます。

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

重要: ワークフロー内のすべてのCapSolverノードは、この資格情報を参照します。一度作成するだけで済みます。すべての解決ワークフローは同じ資格情報を共有します。
これで、GeeTest V3解決ワークフローを構築する準備が整いました!
GeeTest V3チャレンジを解決する前に、**gtパラメーター、チャレンジAPIエンドポイント、およびchallenge**値が動的に取得される方法の3つを見つける必要があります。
F12)-> ネットワークタブを開きますgt=を含むリクエスト、または"gt"と"challenge"フィールドを含むレスポンスを探します/api/geetest/register/gt/register-slide/captcha?gt=...{
"gt": "81dc9bdb52d04dc20036dbd8313ed055",
"challenge": "4a8a08f09d37b73795649038408b5f33ab",
"success": 1,
"new_captcha": true
}
これはGeeTest V3自動化にとって最も重要な概念です。
gt**値はサイトごとに静的です。セッション間で同じままですchallenge**値は動的です。毎回変更され、約60〜120秒で期限切れになりますchallengeを取得する必要がありますhttps://example.com/api/geetest/register)これは、すべてのGeeTest V3ワークフローが、新しいチャレンジを取得するためにCapSolverノードの前に追加のHTTPリクエストノードを必要とすることを意味します。これは、reCAPTCHAまたはTurnstileワークフローとの主要な構造上の違いです。
ヒント: キャッシュを防ぎ、常に新しいチャレンジを取得するために、
?t={{ Date.now() }}をチャレンジAPI URLにパラメーターとして追加します。
CAPTCHAパラメーターを特定する方法の詳細なガイドについては、CapSolver公式ドキュメントを参照してください。
このワークフローは、GeeTest V3パラメーターを受け入れ、解決されたチャレンジを返すPOSTエンドポイントを作成します。reCAPTCHAまたはTurnstileソルバーとは異なり、呼び出し元はgtおよびwebsiteURLとともに(新しく取得した)challenge値を提供する必要があります。

ワークフローは4つのノードで構成されています。
$json.errorが空ではない)に基づいて分岐するIFノード{"error": "..."}を返します| 設定 | 値 |
|---|---|
| HTTPメソッド | POST |
| パス | solver-geetest-v3 |
| 応答 | Response Node |
これにより、https://your-n8n-instance.com/webhook/solver-geetest-v3にエンドポイントが作成されます。
| パラメーター | 値 | 説明 |
|---|---|---|
| 操作 | GeeTest V3 |
GeeTest V3に設定する必要があります |
| タイプ | GeeTestTaskProxyLess |
利用可能な唯一のオプション — プロキシなしのバリアント |
| ウェブサイトURL | ={{ $json.body.websiteURL }} |
GeeTestチャレンジがあるページのURL |
| GT | ={{ $json.body.gt }} |
サイトごとのGeeTest識別子 |
| チャレンジ | ={{ $json.body.challenge }} |
セッションごとの動的なチャレンジ(新しいものである必要があります) |
| GeeTest APIサーバーサブドメイン | (オプション) | サイトがカスタムGeeTest APIサーバーを使用している場合 |
ノードでCapSolver資格情報も選択します。
| 設定 | 値 |
|---|---|
| 条件 | ={{ $json.error }} が空ではない |
| Trueブランチ | エラー Webhookに応答ノードにルーティングします |
| Falseブランチ | 成功 Webhookに応答ノードにルーティングします |
これにより、エラーパスがキャンバス上で明示的になります。CapSolverノードはエラーが発生しても続行するため(onError: continueRegularOutput)、失敗はワークフローをクラッシュさせるのではなく、{ "error": "..." }としてここに到達します。
成功ブランチ(CapSolverエラー?のFalse出力):
| 設定 | 値 |
|---|---|
| 応答形式 | JSON |
| 応答本文 | ={{ JSON.stringify($json.data) }} |
WebhookエンドポイントにPOSTリクエストを送信します。
curl -X POST https://your-n8n-instance.com/webhook/solver-geetest-v3 \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"gt": "81dc9bdb52d04dc20036dbd8313ed055",
"challenge": "4a8a08f09d37b73795649038408b5f33ab"
}'
期待される応答:
{
"taskId": "abc123...",
"solution": {
"challenge": "4a8a08f09d37b73795649038408b5f33",
"validate": "68f0c05d0c8a8b2b1e2f3a4b5c6d7e8f",
"seccode": "68f0c05d0c8a8b2b1e2f3a4b5c6d7e8f|jordan"
},
"status": "ready"
}
重要: リクエスト本文の
challengeは新しく取得されたものである必要があります。期限切れのチャレンジを送信すると、CapSolverはそれを解決できません。チャレンジは通常60〜120秒で期限切れになります。
以下のJSONをコピーし、Menu -> Import from JSONからn8nにインポートします。
{
"name": "GeeTest V3 Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## GeeTest V3スクレイピング — 価格と製品の詳細 — CapSolver + スケジュール + Webhook\n\n**対象者:** GeeTest V3で保護されたサイトの価格や製品データを監視するチーム。\n\n**機能:** GeeTest V3を解決し、製品ページを取得し、CSSセレクターを介して価格と名前を抽出し、保存された値と比較して変更を警告します。\n\n**仕組み:**\n1. スケジューラー(6時間ごと)またはWebhookがフローをトリガーします\n2. CapSolverがGeeTest V3チャレンジを解決します\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": [
-1220,
-380
],
"id": "sticky-blog-main-1773678228108-1",
"name": "Sticky Note"
},
{
"parameters": {
"content": "### スケジュールパス\n6時間ごとに自動的に実行されます。\n結果は、実行間の比較のためにワークフローの静的データに保存されます。",
"height": 480,
"width": 2200,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-740,
-280
],
"id": "sticky-blog-section-1773678228108-2",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "### Webhookパス\nオンデマンドトリガー — 同じロジックで、結果をJSON応答として返します。",
"height": 480,
"width": 2200,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-740,
140
],
"id": "sticky-blog-section-1773678228108-3",
"name": "Sticky Note2"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-700,
0
],
"id": "88888888-8888-8888-8888-888888888801",
"name": "Every 6 Hours"
},
{
"parameters": {
"url": "https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }}",
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-400,
0
],
"id": "88888888-8888-8888-8888-888888888802",
"name": "Fetch GeeTest Challenge"
},
{
"parameters": {
"operation": "GeeTest V3",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"gt": "={{ $json.gt }}",
"challenge": "={{ $json.challenge }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "88888888-8888-8888-8888-888888888803",
"name": "Solve GeeTest V3",
"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"
},
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "geetest_challenge",
"value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.challenge }}"
},
{
"name": "geetest_validate",
"value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.validate }}"
},
{
"name": "geetest_seccode",
"value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.seccode }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "88888888-8888-8888-8888-888888888804",
"name": "Fetch Product Page"
},
{
"parameters": {
"operation": "extractHtmlContent",
"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": "88888888-8888-8888-8888-888888888805",
"name": "Extract Data"
},
{
"parameters": {
"jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || \'Product\';\n\n// Parse numeric values for comparison\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// Update stored price\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": "88888888-8888-8888-8888-888888888806",
"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": "88888888-8888-8888-8888-888888888807",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-001",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === \'dropped\' ? \'-\' : \'+\' }}{{ $json.diff }})",
"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": "88888888-8888-8888-8888-888888888808",
"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": "88888888-8888-8888-8888-888888888809",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-geetest-v3",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-700,
420
],
"id": "88888888-8888-8888-8888-888888888810",
"name": "Webhook Trigger",
"webhookId": "88888888-aaaa-bbbb-cccc-888888888810",
"onError": "continueRegularOutput"
},
{
"parameters": {
"url": "https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }}",
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-400,
420
],
"id": "88888888-8888-8888-8888-888888888811",
"name": "Fetch GeeTest Challenge [Webhook]"
},
{
"parameters": {
"operation": "GeeTest V3",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"gt": "={{ $json.gt }}",
"challenge": "={{ $json.challenge }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
420
],
"id": "88888888-8888-8888-8888-888888888812",
"name": "Solve GeeTest V3 [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"
},
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "geetest_challenge",
"value": "={{ $(\'Solve GeeTest V3 [Webhook]\').item.json.data.solution.challenge }}"
},
{
"name": "geetest_validate",
"value": "={{ $(\'Solve GeeTest V3 [Webhook]\').item.json.data.solution.validate }}"
},
{
"name": "geetest_seccode",
"value": "={{ $(\'Solve GeeTest V3 [Webhook]\').item.json.data.solution.seccode }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
420
],
"id": "88888888-8888-8888-8888-888888888813",
"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": "88888888-8888-8888-8888-888888888814",
"name": "Extract Data [Webhook]"
},
{
"parameters": {
"jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || \'Product\';\n\n// Parse numeric values for comparison\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// Update stored price\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": "88888888-8888-8888-8888-888888888815",
"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": "88888888-8888-8888-8888-888888888816",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-004",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === \'dropped\' ? \'-\' : \'+\' }}{{ $json.diff }})",
"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": "88888888-8888-8888-8888-888888888817",
"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": "88888888-8888-8888-8888-888888888818",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1712,
420
],
"id": "88888888-8888-8888-8888-888888888819",
"name": "Respond to Webhook [Webhook]"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Fetch GeeTest Challenge",
"type": "main",
"index": 0
}
]
]
},
"Fetch GeeTest Challenge": {
"main": [
[
{
"node": "Solve GeeTest V3",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V3": {
"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": "Fetch GeeTest Challenge [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Fetch GeeTest Challenge [Webhook]": {
"main": [
[
{
"node": "Solve GeeTest V3 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V3 [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 V3で保護されたログインフォームの送信を最初から最後まで自動化します。資格情報を送信する前にGeeTest V3チャレンジを解決します。
このワークフローは5つのノードで構成されています。
challenge値を取得しますgt、challenge、websiteURLをCapSolverに送信します| 設定 | 値 |
|---|---|
| HTTPメソッド | POST |
| パス | login-geetest-v3 |
| 応答 | Response Node |
これにより、https://your-n8n-instance.com/webhook/login-geetest-v3にエンドポイントが作成されます。
| 設定 | 値 |
|---|---|
| URL | https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }} |
| オプション | Full Response = false |
これにより、gtとchallengeの値を含むJSON応答が返されます。
| パラメーター | 値 |
|---|---|
| 操作 | GeeTest V3 |
| ウェブサイトURL | https://YOUR-TARGET-SITE.com/login |
| GT | ={{ $json.gt }} |
| チャレンジ | ={{ $json.challenge }} |
CapSolver資格情報も選択します。
| 設定 | 値 |
|---|---|
| メソッド | POST |
| URL | https://YOUR-TARGET-SITE.com/login |
| コンテンツタイプ | form-urlencoded |
| 本文パラメーター | username=YOUR_USERNAME、password=YOUR_PASSWORD、geetest_challenge={{ $(\'Solve GeeTest V3\').item.json.data.solution.challenge }}、geetest_validate={{ $(\'Solve GeeTest V3\').item.json.data.solution.validate }}、geetest_seccode={{ $(\'Solve GeeTest V3\').item.json.data.solution.seccode }} |
重要:
YOUR_USERNAMEとYOUR_PASSWORDを実際の資格情報に置き換えてください。また、ターゲットサイトのHTMLに合わせてフォームフィールド名を調整する必要がある場合があります。
| 設定 | 値 |
|---|---|
| 応答形式 | JSON |
| 応答本文 | ={{ JSON.stringify($json) }} |
WebhookエンドポイントにPOSTリクエストを送信します。
curl -X POST https://your-n8n-instance.com/webhook/login-geetest-v3 \
-H "Content-Type: application/json" \
-d ''
期待される応答(成功):
{
"status": "success",
"message": "Login successful",
"solution": {
"challenge": "...",
"validate": "...",
"seccode": "..."
}
}
期待される応答(失敗):
{
"status": "failed",
"message": "Login failed: Invalid credentials or captcha",
"error": "..."
}
以下のJSONをコピーし、Menu -> Import from JSONからn8nにインポートします。
{
"name": "Account Login Automation — Solve GeeTest V3 & Submit Credentials",
"nodes": [
{
"parameters": {
"content": "## アカウントログイン自動化 — GeeTest V3を解決して資格情報を送信\n\n**対象者:** GeeTest V3で保護されたアカウントへのログインを自動化する必要があるチーム。\n\n**機能:** GeeTest V3チャレンジを取得し、CapSolverで解決し、解決されたトークンとユーザー資格情報でログインフォームを送信します。\n\n**仕組み:**\n1. Webhookがフローをトリガーします\n2. HTTPリクエストが新しいGeeTest V3チャレンジを取得します\n3. CapSolverがチャレンジを解決します\n4. HTTPリクエストが、解決されたGeeTest V3トークンとユーザー資格情報を含むログインフォームを送信します\n5. 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": [
-1020,
-280
],
"id": "sticky-login-main-1773678228108-1",
"name": "Sticky Note"
},
{
"parameters": {
"httpMethod": "POST",
"path": "login-geetest-v3",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-700,
0
],
"id": "99999999-9999-9999-9999-999999999901",
"name": "Webhook Trigger",
"webhookId": "99999999-aaaa-bbbb-cccc-999999999901",
"onError": "continueRegularOutput"
},
{
"parameters": {
"url": "https://YOUR-TARGET-SITE.com/api/geetest/register?t={{ Date.now() }}",
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-400,
0
],
"id": "99999999-9999-9999-9999-999999999902",
"name": "Fetch GeeTest Challenge"
},
{
"parameters": {
"operation": "GeeTest V3",
"websiteURL": "https://YOUR-TARGET-SITE.com/login",
"gt": "={{ $json.gt }}",
"challenge": "={{ $json.challenge }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "99999999-9999-9999-9999-999999999903",
"name": "Solve GeeTest V3",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://YOUR-TARGET-SITE.com/login",
"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": "YOUR_USERNAME"
},
{
"name": "password",
"value": "YOUR_PASSWORD"
},
{
"name": "geetest_challenge",
"value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.challenge }}"
},
{
"name": "geetest_validate",
"value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.validate }}"
},
{
"name": "geetest_seccode",
"value": "={{ $(\'Solve GeeTest V3\').item.json.data.solution.seccode }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "99999999-9999-9999-9999-999999999904",
"name": "Submit Login Form"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
512,
0
],
"id": "99999999-9999-9999-9999-999999999905",
"name": "Respond to Webhook"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Fetch GeeTest Challenge",
"type": "main",
"index": 0
}
]
]
},
"Fetch GeeTest Challenge": {
"main": [
[
{
"node": "Solve GeeTest V3",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V3": {
"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 V3へのアクセスが含まれていないことを意味します。プランにこのサービスが含まれているかどうかを確認するには、CapSolverダッシュボードを確認してください。
GeeTest V3のchallenge値は動的であり、すぐに期限切れになります(通常60〜120秒以内)。CapSolverに解決リクエストを送信する直前に、新しいchallengeを取得する必要があります。ワークフローが、解決の試行ごとに最新のchallengeを取得していることを確認してください。
これらのエラーは、CapSolverノードで提供したwebsiteURLまたはgtパラメーターが正しくないことを示しています。ターゲットサイトの開発者ツールのネットワークタブを再確認して、正しい値を使用していることを確認してください。
GeeTest V3が正常に解決されたにもかかわらずログインに失敗する場合は、次の問題が考えられます。
このエラーは、n8nで設定したCapSolver APIキーが正しくないか、期限切れになっていることを示しています。CapSolverダッシュボードを確認し、n8nの資格情報を更新してください。
challenge値を取得します。チャレンジはすぐに期限切れになります。gt、websiteURL、challengeパラメーターが正しいことを再確認してください。これらはGeeTest V3解決の成功の鍵となります。始める準備はできましたか? CapSolverに登録し、ボーナスコードn8nを使用して、最初のチャージで8%の追加ボーナスを獲得してください。

n8nとCapSolverを使用して、GeeTest V3解決APIとアカウントログイン自動化ワークフローを構築する方法を学びました。
まとめ:
gtパラメーターと動的なchallengeパラメーターに依存します。gtとチャレンジAPIエンドポイントを見つけます。challenge値を取得する必要があります。GeeTest V3の主な複雑さは、その動的なchallengeパラメーターと3部構成の解決形式にあります。CapSolverノードの前にHTTPリクエストノードを追加して新しいチャレンジを取得することで、GeeTest V3の解決を効果的に自動化できます。その後、これらの解決されたトークンをログインまたはスクレイピングワークフローにシームレスに統合できます。
ヒント: これらのワークフローはWebhookトリガーを使用しますが、トリガーノードを他のn8nトリガー(手動、アプリケーションイベント、フォーム送信など)と交換できます。GeeTest V3が解決されたら、n8nの組み込みノードを使用して、結果をGoogleスプレッドシート、データベース、クラウドストレージに保存したり、Telegram/Slack/メールでアラートを送信したりできます。
GeeTest V3は、インタラクティブなパズル(スライドパズル、アイコンクリック、単語マッチングなど)を通じてユーザーを検証する行動型CAPTCHAシステムです。静的なgtパラメーターと、すぐに期限切れになる動的なchallengeパラメーターを使用します。
GeeTest V4は、gtの代わりにcaptcha_idを使用するなど、異なるAPI構造を使用し、個別のchallenge取得は必要ありません。このガイドはGeeTest V3に特化しています。ページソースにcaptcha_idが表示されている場合は、V4を扱っています。
価格は使用量によって異なります。GeeTest V3の現在の価格については、CapSolverの価格ページを確認してください。GeeTest V3解決タスクは、単純な画像からテキストへの認識よりも高価ですが、他の複雑なCAPTCHAタイプよりも安価です。
GeeTest V3解決タスクは、チャレンジの複雑さとCapSolverサーバーの負荷に応じて、通常10〜30秒かかります。ImageToTextTaskとは異なり、GeeTest V3解決にはタスクの作成とポーリングが含まれるため、即座には返されません。
CapSolverのGeeTest V3解決サービスは、通常、プロキシを提供する必要はありません。CapSolverはプロキシ要件を内部的に処理します。websiteURL、gt、challengeパラメーターを提供するだけで済みます。
challenge値は常に期限切れになるのですか?GeeTest V3のchallenge値は動的であり、すぐに期限切れになります(通常60〜120秒以内)。CapSolverに解決リクエストを送信する直前に、新しいchallengeを取得する必要があります。ワークフローが、解決の試行ごとに最新のchallengeを取得するためにHTTPリクエストノードを含んでいることを確認してください。
GeeTest V3が正常に解決されたにもかかわらずログインに失敗した場合は、次の点を確認してください。
はい。このワークフローは、セルフホスト型n8nとn8n Cloudの両方で機能します。CapSolverノードはすでに公式統合として利用可能です。API資格情報を追加するだけで済みます。
CapSolverとn8nを使用してeCAPTCHA v2/v3ソルバーAPIを構築します。トークンの自動取得、ウェブサイトへの送信、保護されたデータの抽出をノーコードで自動化する方法を学びます。

画像からテキストへの変換、CAPTCHAソルバー、OCR CAPTCHA、CAPTSOVER、N8N、N8Nワークフロー、自動化、OCR API、CAPTCHA 自動化、Base64 画像、画像認識、AI OCR、Webhook、スケジュール済みワークフロー、フォーム自動化、CAPTCHAバイパス、セッション処理、プロキシなしCAPTCHA、インスタントOCR、テキスト認識
