CAPSOLVER
ブログ
n8nでCapSolver Vision Engineを使用してビジュアルパズルを解く方法

n8nでCapSolverを使用してビジュアルパズルを解決する方法

Logo of CapSolver

Sora Fujimoto

AI Solutions Architect

18-Mar-2026

視覚パズルはあらゆる場所に存在しています: スライダーCAPTCHAで、ピースを正しい位置にドラッグする必要があるもの、画像やオブジェクトを選択するグリッド、アニメーションGIFのテキスト認識など。これらは従来のテキストベースのCAPTCHAではなく、reCAPTCHAやTurnstileなどのトークンベースのチャレンジ(フォームに送信する文字列を返すもの)でもありません。これらは画像ベースのビジュアルチャレンジであり、入力は画像で、出力は測定値(ピクセル単位の距離、度数単位の角度、座標のセット、または認識されたテキスト)です。

これが**CapSolverのビジョンエンジン**が解決するものです。AIを使用して視覚パズル画像を分析し、自動化に必要な正確な答えを返します。

このガイドでは、CapSolverコミュニティノードを通じてビジョンエンジンを**n8n**で使用する方法を学びます。ウォークスルーでは、コアのソルバーAPIワークフローと、パズル画像を取得し、base64に変換し、スライダーを解決し、ピクセル単位の距離を返す実用的なスライダーパズルソルバーがカバーされます。

重要: ビジョンエンジンは認識操作であり、トークン操作ではありません。つまり、結果は単一のAPIコールで即座に返されます—ポーリングやgetTaskResultループ、待機タイムアウトは必要ありません。画像を送信するだけで、答えが返ってきます。


ビジョンエンジンが他のCapSolver操作と異なる点

n8nでのほとんどのCapSolver操作はトークンタスクです。サイトパラメータ(URL、サイトキー、プロキシ)を送信し、CapSolverが背景でチャレンジを解決し、ワークフローが結果をポーリングします。出力は、ターゲットサイトに送信するトークン文字列です。

ビジョンエンジンは異なります:

トークン操作(reCAPTCHA、Turnstileなど) ビジョンエンジン(認識)
リソース トークン 認識
入力 ウェブサイトURL、サイトキー、プロキシ base64画像(複数)、モジュール名
処理 非同期—結果をポーリング 即時—単一のAPIコール
出力 トークン文字列 ピクセル、度数、座標、またはテキスト
プロキシ 結果として必要な場合が多い 必要なし
使用ケース チャレンジゲートを回避するためのトークンを送信 自動化のためのビジュアルパズルを解釈

ビジョンエンジンは画像からテキスト(OCR)に近いですが、単純なテキスト認識を超えています。画像から文字を読み取るOCRとは異なり、ビジョンエンジンは空間的な関係を理解します—スライダーのピースをどのくらい右にドラッグするか、画像をどの角度に回転するか、画像のどの領域が質問に一致するか、またはアニメーションGIFに隠されたテキストを認識することができるのです。


利用可能なモジュール

ビジョンエンジンは、特定の種類のビジュアルパズルに特化した複数のAIモデルをサポートしています:

モジュール 目的 入力 戻り値
slider_1 スライダーパズルの解決 image(パズルピース) + imageBackground(スロット付きの背景) ピクセル単位の距離
rotate_1 単一画像の回転 image + imageBackground 度数単位の角度
rotate_2 複数画像の回転(内側と外側) image(内側の画像) 度数単位の角度
shein オブジェクト/領域の選択 image + question(何を選択するか) rects配列—バウンディングボックス [{x1, y1, x2, y2}]
ocr_gif アニメーションGIFのテキスト認識 image(GIFのbase64) 認識されたテキスト文字列

各モジュールの使用タイミング

slider_1 — 最も一般的なビジュアルキャプチャタイプ。ユーザーはスロット付きの背景画像と別個のパズルピースを見ます。目標は、ピースを右に何ピクセルドラッグするかを決定することです。image(パズルピース)とimageBackground(スロット付きの全体の背景)の両方が必要です。

rotate_1 — 正しい方向に回転する必要がある単一の画像。imageimageBackgroundの両方が必要です。エンジンは度数単位の角度を返します。

rotate_2 — 内側と外側の2つの同心画像。内側の画像を外側に合わせて回転する必要があります。imageのみが必要です。エンジンは角度を返します。

shein — 「一致するアイテムを選択する」や「正しい領域をタップする」ようなチャレンジに使用されます。imageに加えて、何を検索するかを説明するquestionパラメータが必要です。一致する領域のバウンディングボックス座標を返します。

ocr_gif — フレームごとにテキストが表示されるアニメーションGIF。通常のOCRでは読み取れません。エンジンはアニメーションを分析し、テキストを抽出します。


前提条件

開始する前に、以下の項目を確認してください:

  1. n8nインスタンス(セルフホストまたはクラウド)
  2. CapSolverアカウント(APIキーと残高)— ここから登録
  3. n8nにインストールされたCapSolverコミュニティノードn8n-nodes-capsolver
  4. n8nに設定されたCapSolver資格情報(設定 > 資格情報 > CapSolver API)

ビジョンエンジンタスクにはプロキシは必要ありません。


ビジョンエンジン用のCapSolverノード設定

n8nのCapSolverノードで以下の設定を構成してください:

設定
リソース Recognition
操作 ビジョンエンジン
module モデル名(例: slider_1rotate_1ocr_gif
image base64エンコードされた画像文字列(data:image/...;base64,のプレフィックスなし)
imageBackground base64エンコードされた背景画像(オプション—slider_1rotate_1で必須)
question テキストの質問(オプション—sheinモジュールで必須)
websiteURL ソースページのURL(オプション—精度を向上させるために使用可能)

typeフィールドは、ビジョンエンジン操作を選択したときに自動的にVisionEngineに設定されます。

base64画像の要件

imageimageBackgroundフィールドはロウbase64文字列でなければなりません—データURIプレフィックスや改行は不要です:

  • 正しい例: /9j/4AAQSkZJRgABA...(ロウbase64)
  • 誤り例: data:image/jpeg;base64,/9j/4AAQSkZJRgABA...(プレフィックスあり)

ソース画像がURLの場合、最初に取得し、base64に変換する必要があります。すでにdata:image/...;base64,のプレフィックスが含まれている場合、CapSolverノードに渡す前にプレフィックスを削除してください。


ワークフロー1: ビジョンエンジン — Solver API

このワークフローでは、ビジョンエンジンを単純なREST APIエンドポイントとして公開します。モジュール名とbase64画像を含むPOSTリクエストを送信し、JSON形式で解決策を取得します。

ノードフロー

Copy
Solverリクエストの受信(Webhook POST)
  → 入力の検証(Code)
    → ビジュアルパズルの解決(CapSolver — Recognition — Vision Engine)
      → ビジョンエンジンエラー?(IF)
        → true: Webhookエラーに応答
        → false: Webhook(成功)に応答

仕組み

1. Solverリクエストの受信

Webhookエンドポイントは、以下のようなJSONボディを含むPOSTリクエストを受け付けます:

json Copy
{
  "module": "slider_1",
  "image": "/9j/4AAQSkZJRgABA...",
  "imageBackground": "/9j/4AAQSkZJRgABA...",
  "question": "",
  "websiteURL": ""
}

2. 入力の検証

Codeノードはimageが存在し、moduleがサポートされている値(slider_1rotate_1rotate_2sheinocr_gif)であることを確認します。検証に失敗した場合、errorフィールドが設定されます。

3. ビジュアルパズルの解決

CapSolverノードは以下のように構成されます:

  • リソース: Recognition
  • 操作: ビジョンエンジン
  • module: リクエストボディから
  • image: リクエストボディから
  • imageBackground: リクエストボディから(提供されていない場合は空文字列)
  • question: リクエストボディから(提供されていない場合は空文字列)

これは認識タスクであるため、結果は即座に返されます。

4. エラー処理

IFノードはエラーをチェックします。CapSolverノードがエラーを返した場合(不正なモジュール、無効な画像など)、エラー応答のWebhookが起動されます。それ以外の場合は、成功応答が解決策を返します。

期待されるリクエストと応答

スライダーパズルリクエスト:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
  -H "Content-Type: application/json" \
  -d '{
    "module": "slider_1",
    "image": "BASE64_PUZZLE_PIECE",
    "imageBackground": "BASE64_BACKGROUND"
  }'

成功応答:

json Copy
{
  "solution": {
    "distance": 142,
    "module": "slider_1"
  }
}

GIF OCRリクエスト:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
  -H "Content-Type: application/json" \
  -d '{
    "module": "ocr_gif",
    "image": "BASE64_GIF_DATA"
  }'

成功応答:

json Copy
{
  "solution": {
    "text": "x7Km9",
    "module": "ocr_gif"
  }
}

このワークフローをインポートする

クリックしてワークフローJSONを展開
json Copy
{
  "name": "ビジョンエンジン — Solver API",
  "nodes": [
    {
      "parameters": {
        "content": "## ビジョンエンジン — Solver API\n\n**対象者:** ビジュアルパズル(スライダー、回転、オブジェクト選択、GIF OCR)を単純なRESTエンドポイントで解決する必要がある開発者および自動化チーム。\n\n**機能:** base64エンコードされた画像とモジュール名を受け取り、CapSolverのビジョンエンジンに送信し、即座に解決策を返します。\n\n**仕組み:**\n1. Webhookが`module`、`image`、およびオプションの`imageBackground`/`question`を含むPOSTを受信\n2. Codeノードが入力を検証(画像が存在し、モジュールが有効)\n3. CapSolver認識ノードがビジュアルパズルを解決\n4. 解決策またはエラーをJSONで返します\n\n**設定:**\n1. **設定 → 資格情報**でCapSolver APIキーを追加\n2. ワークフローを有効化\n3. 画像データを`/webhook/vision-engine-solver`にPOST",
        "height": 560,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-920, -380],
      "id": "sticky-ve-main-001",
      "name": "スタickyノート"
    },
    {
      "parameters": {
        "content": "### 入力検証\n`image`が存在し、`module`が`slider_1`、`rotate_1`、`rotate_2`、`shein`、`ocr_gif`のいずれかであることを確認",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-100, -280],
      "id": "sticky-ve-section-002",
      "name": "スタickyノート1"
    },
    {
      "parameters": {
        "content": "### CapSolverビジョンエンジン\n認識リソース—即時結果、ポーリングなし。モジュールに応じて距離、角度、座標、またはテキストを返します。",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [380, -280],
      "id": "sticky-ve-section-003",
      "name": "スタickyノート2"
    },
    {
      "parameters": {
        "content": "### エラー処理\nCapSolverのエラー(無効な画像、サポートされていないモジュールなど)をチェックし、構造化されたエラー応答を返します。",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [860, -280],
      "id": "sticky-ve-section-004",
      "name": "スタickyノート3"
    },
    {
      "parameters": {
        "content": "### Webhookトリガー\n`module`、`image`、およびオプションの`imageBackground`/`question`を含むJSONボディで`/webhook/vision-engine-solver`にPOST。",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-580, -280],
      "id": "sticky-ve-section-005",
      "name": "スタickyノート4"
    },
    {
      "parameters": {
        "content": "### 成功応答\nCapSolverからの完全な解決オブジェクトを返します—モジュールタイプによって内容が異なります。",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [1340, -280],
      "id": "sticky-ve-section-006",
      "name": "スタickyノート5"
    },
    {
      "parameters": {
        "content": "### エラー応答\nCapSolverまたは入力検証からのエラーメッセージを返します。",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [1340, 240],
      "id": "sticky-ve-section-007",
      "name": "スタickyノート6"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "vision-engine-solver",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [-540, 0],
      "id": "ve-api-11111111-1111-1111-1111-111111111101",
      "name": "Solverリクエストの受信",
      "webhookId": "ve-api-11111111-aaaa-bbbb-cccc-111111111101"
    },
    {
      "parameters": {
        "jsCode": "const body = $input.first().json.body || {};\nconst validModules = ['slider_1', 'rotate_1', 'rotate_2', 'shein', 'ocr_gif'];\n\nconst module = (body.module || '').trim();\nconst image = (body.image || '').trim();\nconst imageBackground = (body.imageBackground || '').trim();\nconst question = (body.question || '').trim();\nconst websiteURL = (body.websiteURL || '').trim();\n\n// 必須フィールドの検証\nif (!image) {\n  return [{ json: { error: '必須フィールドが不足しています: image (base64エンコード)' } }];\n}\n\nif (!module) {\n  return [{ json: { error: '必須フィールドが不足しています: module' } }];\n}\n\nif (!validModules.includes(module)) {\n  return [{ json: { error: `無効なモジュール: ${module}. 有効なモジュール: ${validModules.join(', ')}` } }];\n}\n\n// モジュール固有の検証\nif ((module === 'slider_1' || module === 'rotate_2') && !imageBackground) {\n  return [{ json: { error: `モジュール ${module} には imageBackground が必要です` } }];\n}\n\nif (module === 'shein' && !question) {\n  return [{ json: { error: 'モジュール shein には question パラメータが必要です' } }];\n}\n\nreturn [{ json: {\n  module,\n  image,\n  imageBackground,\n  question,\n  websiteURL,\n  validated: true\n} }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [-60, 0],
      "id": "ve-api-11111111-1111-1111-1111-111111111102",
      "name": "入力の検証"
    },
    {
      "parameters": {
        "resource": "Recognition",
        "operation": "Vision Engine",
        "module": "={{ $json.module }}",
        "image": "={{ $json.image }}",
        "imageBackground": "={{ $json.imageBackground || '' }}",
        "question": "={{ $json.question || '' }}",
        "websiteURL": "={{ $json.websiteURL || '' }}"
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [420, 0],
      "id": "ve-api-11111111-1111-1111-1111-111111111103",
      "name": "ビジュアルパズルの解決",
      "onError": "continueRegularOutput",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolverアカウント"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
"caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 2
          },
          "conditions": [
            {
              "id": "ve-err-001",
              "leftValue": "={{ $json.error }}",
              "operator": {
                "type": "string",
                "operation": "isNotEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [900, 0],
      "id": "ve-api-11111111-1111-1111-1111-111111111104",
      "name": "ビジョンエンジンエラー?"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json.data) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [1380, -80],
      "id": "ve-api-11111111-1111-1111-1111-111111111105",
      "name": "Webhookに応答"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
        "options": {
          "responseCode": 400
        }
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [1380, 120],
      "id": "ve-api-11111111-1111-1111-1111-111111111106",
      "name": "Webhookエラーに応答"
    }
  ],
  "connections": {
    "Receive Solver Request": {
      "main": [
        [
          {
            "node": "Validate Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate Input": {
      "main": [
        [
          {
            "node": "Solve Visual Puzzle",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Visual Puzzle": {
      "main": [
        [
          {
            "node": "Vision Engine Error?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Vision Engine Error?": {
      "main": [
        [
          {
            "node": "Respond to Webhook Error",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

ワークフロー 2: スライダー パズル ソルバー — 取得と解決

このワークフローは、実用的なエンドツーエンドのスライダー パズル ソルバーの例を示しています。このワークフローは、URLからパズルのピース画像と背景画像を取得し、それらをベース64に変換して、slider_1モジュールでビジョンエンジンに送信し、スライダーを完成させるために必要なピクセル距離を返します。

これは、スライダー CAPTCHA の解決をより大きな自動化に統合する際のパターンです。返される距離は、ブラウザ自動化(Puppeteer、Playwright、Selenium)にスライダーのハンドルを正確にどれだけドラッグするかを伝えます。

ノードフロー

Copy
スケジュール トリガー (毎時間1回) ─┐
                                 ├→ パズル設定を設定 → パズル画像を取得 → 背景画像を取得
Webhook トリガー (POST) ──────────┘    → 画像をベース64に変換 → スライダーを解決
                                        → スライダー エラー? → 解決結果をフォーマット → 結果を返す
                                                        → エラーをフォーマット → エラーを返す

動作方法

1. デュアル トリガー

  • スケジュール トリガー: 自動テストや定期的なパズル解決のため毎時間1回実行
  • Webhook トリガー: 他のワークフローまたは外部サービスからオンデマンドで起動

2. パズル設定を設定

パズルピース画像と背景画像のURLを定義し、必要に応じてwebsiteURLを追加します。実際の統合では、これらのURLはターゲットサイトのCAPTCHAチャレンジ応答から取得されます。

3. パズル画像を取得 + 背景画像を取得

2つのHTTPリクエストノードが、パズルピースと背景画像をバイナリデータとしてダウンロードします。

4. 画像をベース64に変換

コードノードが両方のバイナリ画像をローカルのベース64文字列に変換し、data:image/...;base64,プレフィックスを削除します。

5. スライダーを解決

CapSolverノードで:

  • リソース: Recognition
  • 操作: Vision Engine
  • module: slider_1
  • image: ベース64のパズルピース
  • imageBackground: ベース64の背景

即座にピクセル単位の距離を返します。

6. 結果を確認して応答

IFノードがエラーをチェックします。成功時は解決結果がフォーマットされ返されます。エラー時はエラーメッセージが返されます。

期待される応答

成功時:

json Copy
{
  "success": true,
  "module": "slider_1",
  "distance": 142,
  "unit": "pixels",
  "solvedAt": "2026-03-16T10:00:00.000Z"
}

エラー時:

json Copy
{
  "success": false,
  "error": "ERROR_INVALID_IMAGE",
  "solvedAt": "2026-03-16T10:00:00.000Z"
}

このワークフローをインポート

クリックしてワークフローのJSONを展開
json Copy
{
  "name": "Slider Puzzle Solver — Fetch & Solve — Vision Engine",
  "nodes": [
    {
      "parameters": {
        "content": "## スライダー パズル ソルバー — 取得と解決\n\n**対象:** ブラウザ自動化やスクレイピングパイプラインでスライダーCAPTCHAを解決する自動化チーム。\n\n**機能:** スライダー パズル画像とその背景をURLから取得し、両方をベース64に変換して、CapSolver Vision Engine (slider_1モジュール)に送信し、スライダーをドラッグするための正確なピクセル距離を返します。\n\n**動作方法:**\n1. スケジュール (毎時間1回) または Webhook トリガーがフローを起動\n2. 設定ノードでパズル画像のURLを設定\n3. 2つのHTTPリクエストノードで画像を取得\n4. コードノードで画像をベース64に変換\n5. CapSolver Vision Engineでスライダー パズルを解決\n6. 自動化に使用するためのピクセル単位の距離を返します\n\n**設定:**\n1. **設定 → 資格情報**でCapSolver APIキーを追加\n2. Set Puzzle Configのプレースホルダー画像URLを置き換え\n3. アクティブ化してテスト",
        "height": 560,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-1200, -380],
      "id": "sticky-slider-main-001",
      "name": "スタicky ノート"
    },
    {
      "parameters": {
        "content": "### トリガー\n毎時間1回のスケジュールまたはWebhook — 両方とも同じパズル解決パイプラインにフィードされます。",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-860, -280],
      "id": "sticky-slider-section-002",
      "name": "スタicky ノート1"
    },
    {
      "parameters": {
        "content": "### パズル設定\nパズルピースと背景画像のURLを設定します。本番環境では、ターゲットサイトのチャレンジ応答からこれらのURLを抽出します。",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-380, -280],
      "id": "sticky-slider-section-003",
      "name": "スタicky ノート2"
    },
    {
      "parameters": {
        "content": "### 画像取得\n両方の画像をバイナリでダウンロードします。パズルピースはimageに、背景(スロット付き)はimageBackgroundに送ります。",
        "height": 480,
        "width": 920,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [100, -280],
      "id": "sticky-slider-section-004",
      "name": "スタicky ノート3"
    },
    {
      "parameters": {
        "content": "### ベース64変換\nバイナリ画像データをローカルのベース64文字列に変換します(データURIプレフィックスなし)。CapSolver APIに両方の画像をローカルのベース64で送信する必要があります。",
        "height": 480,
        "width": 440,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [1060, -280],
      "id": "sticky-slider-section-005",
      "name": "スタicky ノート4"
    },
    {
      "parameters": {
        "content": "### ビジョンエンジン解決 + 結果処理\nCapSolverはスライダーの距離を即座に返します。結果はWebhook経由でフォーマットされ返されるか、後続の処理に保存されます。",
        "height": 480,
        "width": 1400,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [1540, -280],
      "id": "sticky-slider-section-006",
      "name": "スタicky ノート5"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 1
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [-820, -60],
      "id": "ve-slider-22222222-2222-2222-2222-222222222201",
      "name": "毎時間1回"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "slider-puzzle-solver",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [-820, 140],
      "id": "ve-slider-22222222-2222-2222-2222-222222222202",
      "name": "Webhook トリガー",
      "webhookId": "ve-slider-22222222-aaaa-bbbb-cccc-222222222202",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cfg-001",
              "name": "puzzleImageURL",
              "value": "={{ $json.body?.puzzleImageURL || 'https://example.com/captcha/puzzle-piece.png' }}",
              "type": "string"
            },
            {
              "id": "cfg-002",
              "name": "backgroundImageURL",
              "value": "={{ $json.body?.backgroundImageURL || 'https://example.com/captcha/background.png' }}",
              "type": "string"
            },
            {
              "id": "cfg-003",
              "name": "websiteURL",
              "value": "={{ $json.body?.websiteURL || '' }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [-340, 0],
      "id": "ve-slider-22222222-2222-2222-2222-222222222203",
      "name": "パズル設定を設定"
    },
    {
      "parameters": {
        "url": "={{ $json.puzzleImageURL }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [140, -60],
      "id": "ve-slider-22222222-2222-2222-2222-222222222204",
      "name": "パズル画像を取得"
    },
    {
      "parameters": {
        "url": "={{ $('Set Puzzle Config').first().json.backgroundImageURL }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [540, -60],
      "id": "ve-slider-22222222-2222-2222-2222-222222222205",
      "name": "背景画像を取得"
    },
    {
      "parameters": {
        "jsCode": "// 両方の画像取得からバイナリデータを取得\nconst puzzleBinary = $input.first().binary;\nconst config = $('Set Puzzle Config').first().json;\n\nif (!puzzleBinary || !puzzleBinary.data) {\n  return [{ json: { error: 'パズル画像の取得に失敗しました — バイナリデータが返されませんでした' } }];\n}\n\n// パズルピースをベース64に変換\nconst puzzleBuffer = await this.helpers.getBinaryDataBuffer(0, 'data');\nconst puzzleBase64 = puzzleBuffer.toString('base64');\n\n// 背景画像のバイナリデータを現在のノード入力から取得\n// 背景画像は前のノードで取得されました\nlet backgroundBase64 = '';\ntry {\n  const bgBinary = $input.first().binary;\n  if (bgBinary && bgBinary.data) {\n    const bgBuffer = await this.helpers.getBinaryDataBuffer(0, 'data');\n    backgroundBase64 = bgBuffer.toString('base64');\n  }\n} catch (e) {\n  // 背景が取得できなかった場合\n}\n\nreturn [{ json: {\n  image: puzzleBase64,\n  imageBackground: backgroundBase64,\n  websiteURL: config.websiteURL || '',\n  module: 'slider_1'\n} }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [1100, 0],
      "id": "ve-slider-22222222-2222-2222-2222-222222222206",
      "name": "画像をベース64に変換"
    },
    {
      "parameters": {
        "resource": "Recognition",
        "operation": "Vision Engine",
        "module": "={{ $json.module }}",
        "image": "={{ $json.image }}",
        "imageBackground": "={{ $json.imageBackground }}",
        "websiteURL": "={{ $json.websiteURL || '' }}"
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [1580, 0],
      "id": "ve-slider-22222222-2222-2222-2222-222222222207",
      "name": "スライダーを解決",
      "onError": "continueRegularOutput",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver アカウント"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 2
          },
          "conditions": [
            {
              "id": "slider-err-001",
              "leftValue": "={{ $json.error }}",
              "operator": {
                "type": "string",
                "operation": "isNotEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [1900, 0],
      "id": "ve-slider-22222222-2222-2222-2222-222222222208",
      "name": "スライダー エラー?"
    },
    {
      "parameters": {
        "jsCode": "const solution = $input.first().json.data?.solution || $input.first().json.data || {};\nconst distance = solution.distance || solution.slide_distance || null;\n\nreturn [{ json: {\n  success: true,\n  module: 'slider_1',\n  distance: distance,\n  unit: 'pixels',\n  rawSolution: solution,\n  solvedAt: new Date().toISOString()\n} }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [2200, -80],
      "id": "ve-slider-22222222-2222-2222-2222-222222222209",
      "name": "解決結果をフォーマット"
    },
    {
      "parameters": {
        "jsCode": "return [{ json: {\n  success: false,\n  error: $input.first().json.error || '不明なビジョンエンジンエラー',\n  solvedAt: new Date().toISOString()\n} }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [2200, 120],
      "id": "ve-slider-22222222-2222-2222-2222-222222222210",
{
  "name": "フォーマットエラー"
  },
  {
    "parameters": {
      "respondWith": "json",
      "responseBody": "={{ JSON.stringify($json) }}",
      "options": {}
    },
    "type": "n8n-nodes-base.respondToWebhook",
    "typeVersion": 1.5,
    "position": [2500, -80],
    "id": "ve-slider-22222222-2222-2222-2222-222222222211",
    "name": "結果を返す"
  },
  {
    "parameters": {
      "respondWith": "json",
      "responseBody": "={{ JSON.stringify($json) }}",
      "options": {
        "responseCode": 400
      }
    },
    "type": "n8n-nodes-base.respondToWebhook",
    "typeVersion": 1.5,
    "position": [2500, 120],
    "id": "ve-slider-22222222-2222-2222-2222-222222222212",
    "name": "エラーを返す"
  }
],
"connections": {
  "Every 1 Hour": {
    "main": [
      [
        {
          "node": "パズル設定を設定",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "Webhook Trigger": {
    "main": [
      [
        {
          "node": "パズル設定を設定",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "パズル設定を設定": {
    "main": [
      [
        {
          "node": "パズル画像を取得",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "パズル画像を取得": {
    "main": [
      [
        {
          "node": "背景画像を取得",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "背景画像を取得": {
    "main": [
      [
        {
          "node": "画像をBase64に変換",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "画像をBase64に変換": {
    "main": [
      [
        {
          "node": "スライダーパズルを解く",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "スライダーパズルを解く": {
    "main": [
      [
        {
          "node": "スライダーエラー?",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "スライダーエラー?": {
    "main": [
      [
        {
          "node": "フォーマットエラー",
          "type": "main",
          "index": 0
        }
      ],
      [
        {
          "node": "解をフォーマット",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "解をフォーマット": {
    "main": [
      [
        {
          "node": "結果を返す",
          "type": "main",
          "index": 0
        }
      ]
    ]
  },
  "フォーマットエラー": {
    "main": [
      [
        {
          "node": "エラーを返す",
          "type": "main",
          "index": 0
        }
      ]
    ]
  }
},
"active": false,
"settings": {
  "executionOrder": "v1"
}
}
``

---

## テスト

### Solver APIのテスト

CapSolverの資格情報を設定し、ワークフローを有効にした後、Solver APIをテストしてください:

**スライダーパズル:**

```bash
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
  -H "Content-Type: application/json" \
  -d '{
    "module": "slider_1",
    "image": "BASE64_PUZZLE_PIECE_HERE",
    "imageBackground": "BASE64_BACKGROUND_HERE"
  }'

回転パズル:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
  -H "Content-Type: application/json" \
  -d '{
    "module": "rotate_1",
    "image": "BASE64_IMAGE_TO_ROTATE"
  }'

オブジェクト選択(shein):

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
  -H "Content-Type: application/json" \
  -d '{
    "module": "shein",
    "image": "BASE64_IMAGE",
    "question": "すべての靴を選択"
  }'

GIF OCR:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/vision-engine-solver \
  -H "Content-Type: application/json" \
  -d '{
    "module": "ocr_gif",
    "image": "BASE64_GIF_DATA"
  }'

スライダーパズルソルバーのテスト

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/slider-puzzle-solver \
  -H "Content-Type: application/json" \
  -d '{
    "puzzleImageURL": "https://example.com/captcha/puzzle-piece.png",
    "backgroundImageURL": "https://example.com/captcha/background.png",
    "websiteURL": "https://example.com"
  }'

数値のdistance値が返された場合、パイプラインが正常に動作したことを示します。画像が取得され、Base64に変換され、Vision Engineがスライダーを解決し、ピクセルの距離が返されたことを意味します。


応答の理解

Vision Engineはモジュールに応じて異なる形式の解決結果を返します。

slider_1

json Copy
{
  "solution": {
    "distance": 142
  }
}

distanceはピクセル単位で、スライダーのハンドルを右にドラッグする必要がある距離を示します。

rotate_1 / rotate_2

json Copy
{
  "solution": {
    "angle": 73
  }
}

angleは度数単位で、画像を正しい方向に回転させる必要がある角度を示します。

shein

json Copy
{
  "solution": {
    "rects": [
      { "x1": 45, "y1": 120, "x2": 180, "y2": 250 },
      { "x1": 300, "y1": 90, "x2": 420, "y2": 210 }
    ]
  }
}

rect配列内の各項目は、画像内の一致領域のバウンディングボックス(左上と右下の座標)を示します。

ocr_gif

json Copy
{
  "solution": {
    "text": "x7Km9"
  }
}

textはアニメーションGIFから認識された文字列を示します。


他のモジュールタイプへの適応

Solver APIワークフローは、リクエストボディですべての5つのモジュールをサポートしています。別のモジュール、例えばrotate_1用の専用ワークフローを構築するには、変更は最小限で済みます。

  1. 設定ノード: puzzleImageURL / backgroundImageURLを、回転画像のURLに置き換えます
  2. 取得ノード: 1つのHTTPリクエストが必要です(rotate_1には背景画像は不要です)
  3. CapSolverノード: modulerotate_1に変更します
  4. 解をフォーマット: distanceではなくangleを抽出します

sheinの場合、questionパラメータを設定ノードに追加し、CapSolverノードに渡します。


トラブルシューティング

"ERROR_INVALID_IMAGE"

Base64文字列が不正または空です。以下の点を確認してください:

  • 画像が正常に取得された(HTTP 200)
  • バイナリからBase64への変換で空の文字列が生成されなかった
  • data:image/...;base64,のプレフィックスが削除された
  • Base64文字列に改行やスペースが含まれていない

"ERROR_INVALID_MODULE"

module値がサポートされているモデルと一致していません。以下のいずれかを使用してください:slider_1rotate_1rotate_2sheinocr_gif

距離が0またはnullになる

画像が有効なスライダーパズルのペアではない可能性があります。以下の点を確認してください:

  • imageパズルピース(小さなドラッグ可能なフラグメント)である
  • imageBackground全体の背景で、欠けたスロットが見える
  • 両方の画像は同じチャレンジインスタンスから取得されている
  • 画像が破損していなかったり、小さすぎない

CapSolverノードに「Vision Engine」オプションがない

n8n-nodes-capsolverバージョン1.x以上がインストールされていることを確認してください。Vision Engine操作は最近のバージョンで追加されました。必要に応じてコミュニティノードを更新してください:

  1. 設定 > コミュニティノードに移動
  2. n8n-nodes-capsolverを検索
  3. 最新版に更新
  4. n8nを再起動

Webhookが404を返す

ワークフローが有効でなければ、Webhookは動作しません。ワークフローをインポートし、資格情報を設定した後、n8nでワークフローを有効にしてください。


ベストプラクティス

  1. RAW Base64文字列を使用する — CapSolverノードに画像を渡す前に、data:image/...;base64,プレフィックスを削除してください。

  2. モジュールに合った画像を使用するslider_1にはimageimageBackgroundが必要です。rotate_1にはimageのみが必要です。sheinにはimageに加えてquestionが必要です。間違った組み合わせを使用すると、失敗または不正確な結果になります。

  3. 画像を最新のもので取得する — ビジュアルパズルの画像は通常一度限りで、すぐに期限切れになります。解決時の直前に取得してください。

  4. Vision Engineは即時 — タイクアウト操作では結果をポーリングする必要があるのに対し、認識操作は即時に結果を返します。ワークフローにリトライロジックやポーリングの遅延は必要ありません。

  5. プロキシは必要ない — Vision Engineは画像をサーバー側で分析します。ターゲットサイトとのブラウザの相互作用はなく、プロキシは必要ありません。

  6. 解決前に検証する — 画像データが存在し、モジュール名が有効であることを確認してください。これにより、失敗するリクエストでAPIクレジットを無駄にすることを防げます。

  7. 利用可能な場合、websiteURLを使用する — オプションですが、一部のパズルタイプで精度向上に役立ちます。

  8. モジュール固有の応答を処理する — 異なるモジュールは異なるフィールド(distanceanglerectstext)を返します。下流のロジックは使用されたモジュールを確認し、正しいフィールドを抽出する必要があります。

開始する準備はできましたか? CapSolverに登録し、ボーナスコード n8n を使用して最初の充電で8%のボーナスを取得してください!

CapSolverボーナスコードバナー

結論

Vision EngineはCapSolverのToken操作とは異なる役割を果たします。reCAPTCHA、Turnstile、Cloudflare Challengeの解決はゲートをバイパスするトークンを返しますが、Vision Engineは自動化が視覚的なパズルと対話するために使用する測定値を返します — スライダーをドラッグ、画像を回転、オブジェクトを選択、またはアニメーションGIFのテキストを読み取る。

覚えておくべき主な違いは以下の通りです:

  • 認識リソース、トークンではない — 即時結果、ポーリングなし
  • Base64画像を入力、測定値を出力 — ピクセル、度数、座標、テキスト
  • プロキシは必要ない — AIが画像をサーバー側で分析
  • 5つのモジュール — 各々が特定の視覚的パズルタイプに設計されています

本記事の2つのワークフローは、2つの最も一般的な統合パターンをカバーしています:

  1. Solver API — 任意のモジュールを受け入れ、解決結果を返す汎用のWebhookエンドポイント
  2. スライダーパズルソルバー — スライダーCAPTCHA用の完全なフェッチ-変換-解決パイプライン

どちらも非アクティブでインポートされます。CapSolverの資格情報を設定し、プレースホルダーの値を置き換え、ワークフローを有効にしてテストしてください。


よくある質問

Vision EngineはImage To Text(OCR)とどう違いますか?

Image To Textは静的な画像内の文字を認識する標準的なOCRです。Vision Engineはさらに進んで、視覚的パズル内の空間的関係を理解します。スライダーの距離、回転角度、オブジェクトのバウンディングボックス、アニメーションGIFのテキストの読み取りが可能です。どちらも認識操作(即時結果、ポーリングなし)ですが、解決する問題の種類が異なります。

Vision Engineにはプロキシが必要ですか?

いいえ。Vision Engineは提供された画像をサーバー側で分析します。ブラウザセッションやクッキー、ターゲットサイトとの相互作用はなく、プロキシは必要ありません。CapSolverノードはVision Engineタスクにプロキシパラメータを受付ません。

1回のワークフロー実行で複数のパズルを解決できますか?

はい。CapSolverノードは1つずつ処理しますが、n8nのアイテムベースの実行により、複数のアイテムをノードに渡すことができます。各アイテムは独自の認識呼び出しを行い、独自の解決結果を返します。バッチ分割ノードまたはコードノードから複数のアイテムを供給してください。

どの画像形式がサポートされていますか?

imageimageBackgroundフィールドは、Base64エンコードされたJPEG、PNG、GIF、WebPをサポートしています。Base64文字列はRAWでなければなりません — data:image/...;base64,プレフィックスや改行は含めないでください。

実際のサイトからパズル画像をどうやって取得しますか?

実際のスライダーキャプチャ統合では、ターゲットサイトがキャプチャ画像をチャレンジ応答として提供します。通常、以下の手順を実行します:

  1. ページをロード(HTTPリクエストまたはブラウザ自動化経由)
  2. キャプチャウィジェットのDOMまたはネットワークリクエストから画像URLを抽出
  3. 画像を取得
  4. Base64に変換
  5. Vision Engineに送信

スライダーパズルソルバーのワークフローは3〜5のステップを示しています。1〜2のステップは特定のターゲットサイトに依存します。

questionパラメータは何をしますか?

questionパラメータはsheinモジュールでのみ使用されます。AIに何を探すべきかを伝えます — 例えば「すべての靴を選択」や「一致する項目をタップ」など。他のすべてのモジュールでは空にしてください。

hCaptchaの画像チャレンジにVision Engineを使用できますか?

Vision Engineのモジュール(slider_1rotate_1rotate_2sheinocr_gif)は特定の視覚的パズルタイプに設計されています。hCaptchaの画像分類チャレンジは別のアプローチを使用します。hCaptcha固有の解決策についてはCapSolverドキュメントを参照してください。

Vision Engineはどれくらい速いですか?

Vision Engineは認識操作であり、結果は単一のAPIコールで返されます — 通常2秒未満です。ポーリングループやgetTaskResultコール、タイムアウト待機は必要ありません。これはトークン操作よりもはるかに高速です。トークン操作は10〜30秒かかることがあります。

画像が小さすぎたり大きすぎたりするとどうなりますか?

非常に小さな画像は正確な分析に必要な詳細が不足する可能性があります。非常に大きな画像はBase64ペイロードサイズが増加し、リクエストが遅くなる可能性があります。最適な結果を得るには、キャプチャチャレンジから提供された元の解像度を使用してください。画像のリサイズは行わないでください。

Vision Engineをブラウザ自動化と連携できますか?

はい、これはほとんどの現実的なアプリケーションでの意図された使用ケースです。一般的なフローは以下の通りです:

  1. ブラウザ自動化(Puppeteer/Playwright経由のn8n)がページをロード
  2. キャプチャチャレンジが表示され、パズル画像が表示
  3. ワークフローが画像URLを抽出し、取得
  4. Vision Engineが解決結果を返す(距離、角度など)
  5. ブラウザ自動化が解決結果を使用してチャレンジを完了(スライダーをドラッグ、画像を回転、座標をクリック)

Vision Engineワークフローはステップ3〜4を処理します。ステップ1〜2と5はブラウザ自動化ノードで処理されます。

コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。

もっと見る