Sản phẩmTích hợpTài nguyênTài liệuGiá cả
Bắt đầu ngay

© 2026 CapSolver. All rights reserved.

Liên hệ chúng tôi

Slack: lola@capsolver.com

Sản phẩm

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Tiện ích trình duyệt
  • Thêm nhiều loại CAPTCHA

Tích hợp

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Đối tác
  • Xem tất cả tích hợp

Tài nguyên

  • Chương trình giới thiệu
  • Tài liệu
  • Tham chiếu API
  • Blog
  • Câu hỏi thường gặp
  • Thuật ngữ
  • Trạng thái

Pháp lý

  • Điều khoản dịch vụ
  • Chính sách bảo mật
  • Chính sách hoàn tiền
  • Không bán thông tin cá nhân của tôi
Blog/n8n/Cách giải GeeTest V4 trong n8n với CapSolver: Hướng dẫn tích hợp hoàn chỉnh
Mar12, 2026

Cách giải GeeTest V4 trong n8n với CapSolver: Hướng dẫn tích hợp hoàn chỉnh

Sora Fujimoto

Sora Fujimoto

AI Solutions Architect

GeeTest V4 là thế hệ mới nhất của hệ thống CAPTCHA hành vi của GeeTest, được sử dụng bởi ngày càng nhiều trang web để bảo vệ các biểu mẫu đăng nhập, trang đăng ký và điểm cuối dữ liệu. Không giống như các hệ thống CAPTCHA cũ hơn dựa vào các câu đố hình ảnh, GeeTest V4 sử dụng các thử thách thích ứng và phân tích hành vi — khiến nó trở thành một trong những biện pháp bảo vệ tinh vi hơn mà bạn sẽ gặp trong các quy trình tự động hóa.

Điều gì sẽ xảy ra nếu bạn có thể tự động giải GeeTest V4 trong các quy trình n8n của mình — cho dù bạn đang xây dựng một API giải pháp có thể tái sử dụng, cạo một trang web được bảo vệ bằng captcha hay tự động hóa một biểu mẫu đăng nhập — tất cả mà không cần viết một dòng mã truyền thống nào?

Trong hướng dẫn này, bạn sẽ học cách kết hợp n8n (một công cụ tự động hóa quy trình làm việc trực quan) với CapSolver (một dịch vụ giải captcha được hỗ trợ bởi AI) để giải các thử thách GeeTest V4 theo yêu cầu — dưới dạng một điểm cuối API độc lập hoặc là một bước trong bất kỳ quy trình tự động hóa nào.

Những gì bạn sẽ xây dựng:

API giải pháp — các điểm cuối có thể tái sử dụng mà các công cụ khác của bạn có thể gọi:

  • Một API giải GeeTest V4

Quy trình làm việc sử dụng trực tiếp — CapSolver được nhúng như một bước trong các tự động hóa lớn hơn:

  • Một công cụ cạo giá và sản phẩm giải GeeTest V4, tìm nạp các trang được bảo vệ và cảnh báo về thay đổi giá
  • Một tự động hóa đăng nhập tài khoản giải GeeTest V4 trước khi gửi thông tin đăng nhập

GeeTest V4 là gì?

GeeTest V4 là phiên bản mới nhất của nền tảng CAPTCHA của GeeTest. Nó thay thế hệ thống V3 cũ hơn bằng một mô hình tích hợp đơn giản hóa và phát hiện hành vi nâng cao. Từ góc độ giải pháp, V4 đơn giản hơn về cấu trúc so với V3 — nó chỉ yêu cầu một tham số tĩnh (captchaId) thay vì luồng thử thách động mà V3 cần.

Sự khác biệt chính so với GeeTest V3:

Tính năng GeeTest V3 GeeTest V4
Tham số chính gt + challenge động captchaId (tĩnh)
Tìm nạp thử thách Bắt buộc — phải gọi API GeeTest trước Không cần — captchaId là tĩnh
Trường giải pháp 3 (challenge, validate, seccode) 5 (captcha_id, lot_number, pass_token, gen_time, captcha_output)
Tập lệnh widget gt.js gcaptcha4.js
Loại tác vụ GeeTestTask / GeeTestTaskProxyLess Chỉ GeeTestTaskProxyLess

Ưu điểm chính của V4: captchaId được nhúng trong mã nguồn trang và không bao giờ thay đổi — tìm thấy một lần, sử dụng mãi mãi. Không cần tìm nạp thử thách động có nghĩa là ít nút hơn trong quy trình làm việc của bạn.


Điều kiện tiên quyết

Trước khi bắt đầu, hãy đảm bảo bạn có những điều sau:

  1. Một phiên bản n8n — Tự lưu trữ hoặc n8n Cloud
  2. Một tài khoản CapSolver — Đăng ký tại đây và lấy khóa API của bạn
  3. Nút CapSolver n8n — Đã có sẵn dưới dạng nút chính thức trong n8n (không cần cài đặt)

Quan trọng: Đảm bảo bạn có đủ số dư trong tài khoản CapSolver của mình. Các tác vụ giải GeeTest V4 tiêu thụ tín dụng dựa trên mức sử dụng.


Thiết lập CapSolver trong n8n

CapSolver có sẵn dưới dạng tích hợp chính thức trong n8n — không cần cài đặt nút cộng đồng. Bạn có thể tìm thấy nó trực tiếp trong bảng nút khi xây dựng quy trình làm việc của mình.

Vì đây là một tích hợp chính thức, bạn cần tạo một thông tin xác thực trong n8n để nút CapSolver có thể xác thực với tài khoản của bạn.

Bước 1: Mở trang thông tin xác thực

Điều hướng đến phiên bản n8n của bạn và đi tới Settings > Credentials. Bạn sẽ thấy tất cả các thông tin xác thực đã cấu hình của mình tại đây.

Trang thông tin xác thực n8n hiển thị tài khoản CapSolver

Bước 2: Tạo thông tin xác thực CapSolver

  1. Nhấp vào Create credential (góc trên bên phải)
  2. Tìm kiếm "CapSolver" và chọn CapSolver API
  3. Nhập Khóa API của bạn — sao chép trực tiếp từ Bảng điều khiển CapSolver
  4. Để Allowed HTTP Request Domains là All (mặc định)
  5. Nhấp vào Save

n8n sẽ tự động kiểm tra kết nối. Bạn sẽ thấy một biểu ngữ màu xanh lá cây "Connection tested successfully" xác nhận khóa API của bạn hợp lệ.

Cấu hình thông tin xác thực CapSolver với kiểm tra kết nối thành công

Quan trọng: Mỗi nút CapSolver trong quy trình làm việc của bạn sẽ tham chiếu thông tin xác thực này. Bạn chỉ cần tạo nó một lần — tất cả các quy trình làm việc giải pháp của bạn sẽ chia sẻ cùng một thông tin xác thực.

Bây giờ bạn đã sẵn sàng xây dựng quy trình làm việc giải GeeTest V4 của mình!


Cách xác định các tham số GeeTest V4

Trước khi bạn có thể giải CAPTCHA GeeTest V4, bạn cần tìm captchaId của nó — tham số bắt buộc duy nhất. Không giống như GeeTest V3 (yêu cầu tìm nạp challenge động), captchaId của V4 là tĩnh và được nhúng trực tiếp vào mã nguồn trang.

Phương pháp 1: Kiểm tra mã nguồn trang

  1. Mở Xem mã nguồn (Ctrl+U) hoặc sử dụng tab Elements của DevTools
  2. Tìm kiếm captcha_id hoặc captchaId trong mã nguồn trang
  3. Tìm các tham chiếu đến gcaptcha4.js — tập lệnh widget GeeTest V4
  4. captchaId thường được truyền dưới dạng tham số cấu hình khi khởi tạo widget
html Copy
<!-- Ví dụ: Khởi tạo GeeTest V4 trong mã nguồn trang -->
<script>
  initGeetest4({
    captchaId: 'e392e1d7fd421dc63325744d5a2b9c73',
    product: 'bind'
  });
</script>

Phương pháp 2: Tab Mạng của DevTools

  1. Mở DevTools (F12) > tab Network
  2. Lọc các yêu cầu theo gcaptcha4 hoặc geetest
  3. Tìm các yêu cầu đến gcaptcha4.geetest.com — tham số captcha_id sẽ nằm trong chuỗi truy vấn

Ưu điểm chính của V4: captchaId là tĩnh — một khi bạn tìm thấy nó, bạn có thể sử dụng nó vô thời hạn mà không cần tìm nạp thử thách mới mỗi lần. Điều này làm cho các quy trình làm việc V4 có cấu trúc giống hệt với các quy trình làm việc Turnstile.


Quy trình làm việc: API giải GeeTest V4

Quy trình làm việc này tạo một điểm cuối API POST chấp nhận các tham số GeeTest V4 và trả về một tập hợp mã thông báo đã giải.

Cách hoạt động

Quy trình làm việc bao gồm bốn nút:

  1. Webhook — Nhận các yêu cầu POST đến với các tham số GeeTest V4
  2. GeeTest V4 — Gửi thử thách đến CapSolver và chờ giải pháp
  3. Lỗi CapSolver? — Nút IF phân nhánh dựa trên việc giải pháp có thất bại hay không (tức là $json.error không trống)
  4. Phản hồi Webhook — Trả về giải pháp nếu thành công, hoặc {"error": "..."} nếu thất bại

Cấu hình nút

1. Nút Webhook

Cài đặt Giá trị
Phương thức HTTP POST
Đường dẫn solver-geetest-v4
Phản hồi Response Node

Điều này tạo một điểm cuối tại: https://your-n8n-instance.com/webhook/solver-geetest-v4

2. Nút CapSolver GeeTest V4

Tham số Giá trị Mô tả
Thao tác GeeTest V4 Phải được đặt thành GeeTest V4
Loại GeeTestTaskProxyLess Đây là loại tác vụ duy nhất có sẵn (không có biến thể proxy)
URL trang web {{ $json.body.websiteURL }} URL của trang có widget GeeTest V4
ID Captcha {{ $json.body.captchaId }} ID captcha GeeTest V4 tĩnh
Tên miền phụ máy chủ API GeeTest (Tùy chọn) Máy chủ API GeeTest tùy chỉnh nếu trang web sử dụng một cái

Chọn thông tin xác thực CapSolver của bạn trong nút này. Tham số geetestApiServerSubdomain tùy chọn hiếm khi cần thiết — chỉ thêm nó nếu máy chủ GeeTest mặc định không hoạt động cho trang web mục tiêu của bạn.

3. Nút Lỗi CapSolver? (IF)

Cài đặt Giá trị
Điều kiện ={{ $json.error }} không trống
Nhánh đúng Chuyển đến nút Webhook phản hồi Lỗi
Nhánh sai Chuyển đến nút Webhook phản hồi Thành công

4. Nút Phản hồi Webhook

Nhánh thành công (đầu ra sai của Lỗi CapSolver?):

Cài đặt Giá trị
Phản hồi bằng JSON
Nội dung phản hồi ={{ JSON.stringify($json.data) }}

Kiểm tra

Gửi yêu cầu POST đến điểm cuối Webhook của bạn:

bash Copy
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"
  }'

Phản hồi dự kiến:

json Copy
{
  "taskId": "abc123...",
  "solution": {
    "captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
    "lot_number": "7c18c041a6ed4e...",
    "pass_token": "d88ce40c0a5c5a18...",
    "gen_time": "1709123456",
    "captcha_output": "dGVzdF9jYXB0Y2hh..."
  },
  "status": "ready"
}

Nhập quy trình làm việc này

Sao chép JSON bên dưới và nhập nó vào n8n thông qua Menu > Import from JSON:

Nhấp để mở rộng JSON quy trình làm việc
json Copy
{
  "name": "GeeTest V4 — Solver API",
  "nodes": [
    {
      "parameters": {
        "content": "## GeeTest V4 — API giải pháp\n\n**Dành cho:** Các nhà phát triển cần giải các thử thách GeeTest V4 thông qua một điểm cuối POST đơn giản.\n\n**Chức năng:** Hiển thị một webhook chấp nhận các tham số captcha, giải thử thách bằng CapSolver và trả về mã thông báo hoặc lỗi dưới dạng JSON.\n\n**Cách hoạt động:**\n1. Webhook nhận POST với URL đích, khóa trang web và các tham số tùy chọn\n2. Nút CapSolver giải thử thách GeeTest V4\n3. Nút IF kiểm tra lỗi → trả về mã thông báo thành công hoặc JSON lỗi\n\n**Thiết lập:**\n1. Thêm khóa API CapSolver của bạn trong **Settings → Credentials → CapSolver API**\n2. Kích hoạt quy trình làm việc\n3. POST đến URL webhook với các tham số captcha của bạn",
        "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"
  }
}

Quy trình làm việc: Cạo GeeTest V4 — Chi tiết giá & sản phẩm — CapSolver + Lịch trình + Webhook

Quy trình làm việc này cạo một trang sản phẩm cứ sau 6 giờ (lịch trình) hoặc theo yêu cầu (webhook), trích xuất giá bằng nút HTML và so sánh chúng với các giá trị đã lưu trữ trước đó.

Đường dẫn lịch trình:

Copy
Cứ sau 6 giờ -> Giải GeeTest V4 -> Tìm nạp trang sản phẩm -> Trích xuất dữ liệu
  -> So sánh dữ liệu -> Dữ liệu đã thay đổi? -> Xây dựng cảnh báo / Không thay đổi

Hành vi chính:

  • Các trường giải captcha được gửi dưới dạng trường biểu mẫu (đây là cách đúng để gửi mã thông báo GeeTest V4)
  • Nút HTML trích xuất giá và tên sản phẩm thông qua các bộ chọn CSS (.product-price, h1)
  • $workflow.staticData.lastPrice duy trì giá trước đó giữa các lần thực thi
  • So sánh giá phát hiện cả giảm (mức độ nghiêm trọng: deal) và tăng (mức độ nghiêm trọng: info)
Nhấp để mở rộng JSON quy trình làm việc đầy đủ (17 nút)
json Copy
{
  "name": "GeeTest V4 Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## Cạo GeeTest V4 — Màn hình giá & sản phẩm\n\n**Dành cho:** Các nhóm cần giám sát giá hoặc dữ liệu sản phẩm trên các trang web được bảo vệ bằng GeeTest V4.\n\n**Chức năng:** Giải GeeTest V4, tìm nạp trang sản phẩm, trích xuất giá và tên thông qua các bộ chọn CSS, so sánh với các giá trị đã lưu trữ và cảnh báo về các thay đổi nếu có.\n\n**Cách hoạt động:**\n1. Lịch trình (cứ sau 6 giờ) hoặc Webhook kích hoạt luồng.\n2. CapSolver giải thử thách GeeTest V4.\n3. Yêu cầu HTTP tìm nạp trang sản phẩm bằng mã thông báo đã giải.\n4. Nút HTML trích xuất giá và tên sản phẩm.\n5. Nút mã so sánh giá hiện tại với giá đã lưu trữ → cảnh báo về các thay đổi nếu có.\n\n**Thiết lập:**\n1. Thêm khóa API CapSolver của bạn trong **Settings → Credentials**.\n2. Thay thế URL giữ chỗ và khóa trang web.\n3. Cập nhật các bộ chọn CSS trong \"Trích xuất dữ liệu\" để khớp với trang đích của bạn.\n4. Kết nối đầu ra của \"Xây dựng cảnh báo\" với kênh thông báo của bạn.",
        "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": "### Đường dẫn lịch trình\nTự động chạy cứ sau 6 giờ.\nKết quả được lưu trữ trong dữ liệu tĩnh của quy trình làm việc để so sánh giữa các lần thực thi.",
        "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": "### Đường dẫn Webhook\nKích hoạt theo yêu cầu — logic tương tự, trả về kết quả dưới dạng phản hồi 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": "// Lấy giá hiện tại và trước đó từ dữ liệu tĩnh của quy trình làm việc\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Phân tích các giá trị số để so sánh\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// Cập nhật giá đã lưu trữ\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": "=Giá {{ $json.direction }} cho {{ $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": "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": "// Lấy giá hiện tại và trước đó từ dữ liệu tĩnh của quy trình làm việc\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Phân tích các giá trị số để so sánh\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// Cập nhật giá đã lưu trữ\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": "=Giá {{ $json.direction }} cho {{ $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": "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
          }
        ]
      ]
    }
  ],
  "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"
  }
}

Quy trình làm việc: Tự động hóa đăng nhập tài khoản GeeTest V4 — CapSolver + Lịch trình + Webhook

Quy trình làm việc này tự động hóa việc gửi biểu mẫu đăng nhập được bảo vệ bằng GeeTest V4 từ đầu đến cuối. Nó giải thử thách GeeTest V4 trước khi gửi thông tin đăng nhập.

Cách hoạt động

Quy trình làm việc này bao gồm năm nút:

  1. Webhook — Nhận yêu cầu POST đến kích hoạt tự động hóa đăng nhập
  2. Giải GeeTest V4 — Gửi thử thách đến CapSolver và chờ giải pháp
  3. Gửi biểu mẫu đăng nhập — Gửi yêu cầu HTTP POST đến trang web đích với thông tin đăng nhập và mã thông báo GeeTest V4 đã giải
  4. Phản hồi Webhook — Trả về kết quả đăng nhập

Cấu hình nút

1. Nút Webhook

Cài đặt Giá trị
Phương thức HTTP POST
Đường dẫn login-geetest-v4
Phản hồi Response Node

Điều này tạo một điểm cuối tại: https://your-n8n-instance.com/webhook/login-geetest-v4

2. Giải GeeTest V4 (CapSolver)

Tham số Giá trị
Thao tác GeeTest V4
URL trang web https://YOUR-TARGET-SITE.com/login
ID Captcha YOUR_CAPTCHA_ID_HERE

Đảm bảo bạn cũng chọn thông tin xác thực CapSolver của mình.

3. Gửi biểu mẫu đăng nhập (Yêu cầu HTTP)

Cài đặt Giá trị
Phương thức POST
URL https://YOUR-TARGET-SITE.com/login
Loại nội dung form-urlencoded
Tham số nội dung 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 }}

Quan trọng: Thay thế YOUR_USERNAME và YOUR_PASSWORD bằng thông tin đăng nhập thực của bạn. Ngoài ra, bạn có thể cần điều chỉnh tên trường biểu mẫu để khớp với HTML của trang web đích của bạn.

4. Phản hồi Webhook (Thành công/Thất bại)

Cài đặt Giá trị
Phản hồi bằng JSON
Nội dung phản hồi ={{ JSON.stringify($json) }}

Kiểm tra

Gửi yêu cầu POST đến điểm cuối Webhook của bạn:

bash Copy
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"
  }'

Phản hồi dự kiến (Thành công):

json Copy
{
  "status": "success",
  "message": "Login successful",
  "solution": {
    "captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
    "lot_number": "7c18c041a6ed4e...",
    "pass_token": "d88ce40c0a5c5a18...",
    "gen_time": "1709123456",
    "captcha_output": "dGVzdF9jYXB0Y2hh..."
  }
}

Phản hồi dự kiến (Thất bại):

json Copy
{
  "status": "failed",
  "message": "Login failed: Invalid credentials or captcha",
  "error": "..."
}

Nhập quy trình làm việc này

Sao chép JSON bên dưới và nhập nó vào n8n thông qua Menu > Import from JSON:

Nhấp để mở rộng JSON quy trình làm việc đầy đủ
json Copy
{
  "name": "GeeTest V4 Account Login — CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## Tự động hóa đăng nhập tài khoản GeeTest V4 — CapSolver + Lịch trình + Webhook\n\n**Dành cho:** Các nhóm cần tự động hóa việc đăng nhập vào các tài khoản được bảo vệ bằng GeeTest V4.\n\n**Chức năng:** Giải thử thách GeeTest V4 và gửi biểu mẫu đăng nhập bằng mã thông báo đã giải và thông tin đăng nhập của người dùng.\n\n**Cách hoạt động:**\n1. Webhook kích hoạt luồng.\n2. CapSolver giải thử thách GeeTest V4.\n3. Yêu cầu HTTP gửi biểu mẫu đăng nhập bằng mã thông báo đã giải và thông tin đăng nhập của người dùng.\n4. Webhook trả về kết quả đăng nhập.\n\n**Thiết lập:**\n1. Thêm khóa API CapSolver của bạn trong **Settings → Credentials**.\n2. Thay thế URL giữ chỗ và thông tin đăng nhập.\n3. Điều chỉnh tên trường biểu mẫu để khớp với trang web đích của bạn.\n4. Kích hoạt quy trình làm việc.",
        "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"
  }
}

Khắc phục sự cố

"Không tìm thấy quyền truy cập GeeTest V4"

Lỗi này cho biết tài khoản hoặc gói CapSolver của bạn không bao gồm quyền truy cập GeeTest V4. Kiểm tra Bảng điều khiển CapSolver của bạn để xác nhận xem dịch vụ này có được bao gồm trong gói của bạn hay không.

"URL trang web không hợp lệ"

Lỗi này cho biết tham số websiteURL bạn cung cấp trong nút CapSolver không chính xác. Kiểm tra lại tab mạng của công cụ dành cho nhà phát triển của trang web đích để đảm bảo bạn đang sử dụng giá trị chính xác.

"Đăng nhập thất bại ngay cả khi GeeTest V4 đã được giải"

Nếu đăng nhập thất bại ngay cả khi GeeTest V4 đã được giải thành công, vấn đề có thể nằm ở các điểm sau:

  • Thông tin đăng nhập không chính xác: Kiểm tra lại tên người dùng và mật khẩu bạn đã gửi trong biểu mẫu đăng nhập.
  • Không khớp phiên: Nếu quá trình đăng nhập liên quan đến phiên hoặc cookie, hãy đảm bảo bạn duy trì cùng một phiên giữa việc lấy thử thách GeeTest V4 và gửi biểu mẫu đăng nhập.
  • Các trường biểu mẫu khác: Trang web đích có thể yêu cầu các trường ẩn bổ sung, mã thông báo CSRF hoặc các tham số khác để đăng nhập thành công. Kiểm tra HTML của biểu mẫu để xác định bất kỳ trường nào khác cần thiết.
  • User-Agent: Một số trang web có thể từ chối các yêu cầu dựa trên chuỗi user-agent. Thử đặt user-agent trình duyệt thông thường trong yêu cầu HTTP của bạn.

"Thông tin xác thực CapSolver không hợp lệ"

Lỗi này cho biết khóa API CapSolver bạn đã cấu hình trong n8n không chính xác hoặc đã hết hạn. Kiểm tra Bảng điều khiển CapSolver của bạn và cập nhật thông tin xác thực trong n8n.


Các phương pháp hay nhất

  1. Duy trì phiên: Nếu trang web đích sử dụng phiên hoặc cookie, hãy đảm bảo bạn duy trì cùng một phiên giữa việc lấy thử thách và gửi biểu mẫu. Trong n8n, bạn có thể xử lý cookie bằng nút Yêu cầu HTTP.
  2. Xác thực tham số: Kiểm tra lại xem websiteURL và bất kỳ tham số tùy chọn nào như captchaId và geetestApiServerSubdomain có chính xác không. Đây là những yếu tố quan trọng để giải GeeTest V4 thành công.
  3. Xử lý lỗi: Bao gồm logic xử lý lỗi trong quy trình làm việc của bạn để xử lý các lỗi giải pháp hoặc đăng nhập một cách duyên dáng. Điều này có thể bao gồm các cơ chế thử lại hoặc thông báo.
  4. Sử dụng User-Agent thích hợp: Đặt một chuỗi user-agent trình duyệt thông thường trong tất cả các yêu cầu HTTP của bạn để tránh bị trang web chặn.
  5. Kiểm tra và lặp lại: Các triển khai GeeTest V4 có thể khác nhau giữa các trang web. Bắt đầu nhỏ, kiểm tra quy trình làm việc của bạn và lặp lại khi cần thiết để đảm bảo chúng hoạt động đáng tin cậy trên mục tiêu cụ thể của bạn.
  6. Không cần proxy: Không giống như các loại CAPTCHA khác, giải pháp GeeTest V4 thường không yêu cầu bạn cung cấp proxy. CapSolver xử lý các yêu cầu proxy nội bộ.

Sẵn sàng bắt đầu? Đăng ký CapSolver và sử dụng mã thưởng n8n để nhận thêm 8% tiền thưởng cho lần nạp đầu tiên của bạn!

Biểu ngữ mã thưởng CapSolver

Câu hỏi thường gặp

GeeTest V4 là gì?

GeeTest V4 là thế hệ mới nhất của hệ thống CAPTCHA hành vi của GeeTest, sử dụng các thử thách thích ứng và phân tích hành vi để bảo vệ các trang web.

GeeTest V4 khác GeeTest V3 như thế nào?

GeeTest V4 đơn giản hơn về cấu trúc so với V3, nó chỉ yêu cầu một tham số captchaId tĩnh thay vì luồng thử thách động mà V3 cần. Nó cũng sử dụng tập lệnh gcaptcha4.js và trả về 5 trường giải pháp.

Giải thử thách GeeTest V4 tốn bao nhiêu?

Giá cả khác nhau tùy theo mức sử dụng. Kiểm tra trang giá của CapSolver để biết giá GeeTest V4 hiện tại. Các tác vụ giải GeeTest V4 đắt hơn so với nhận dạng hình ảnh thành văn bản đơn giản, nhưng rẻ hơn so với các loại CAPTCHA phức tạp khác.

Mất bao lâu để giải thử thách GeeTest V4?

Các tác vụ giải GeeTest V4 thường mất từ 10 đến 30 giây, tùy thuộc vào độ phức tạp của thử thách và tải máy chủ CapSolver. Không giống như ImageToTextTask, giải GeeTest V4 liên quan đến việc tạo và thăm dò tác vụ, vì vậy nó không tức thì.

Tôi có cần proxy cho GeeTest V4 không?

Dịch vụ giải GeeTest V4 của CapSolver thường không yêu cầu bạn cung cấp proxy. CapSolver xử lý các yêu cầu proxy nội bộ. Bạn chỉ cần cung cấp websiteURL và captchaId.

Tại sao mã thông báo GeeTest V4 của tôi không được chấp nhận?

Nếu mã thông báo GeeTest V4 của bạn không được chấp nhận, hãy kiểm tra những điều sau:

  • Không khớp phiên: Đảm bảo bạn duy trì cùng một phiên và cookie giữa việc lấy thử thách GeeTest V4 và gửi biểu mẫu.
  • Các trường biểu mẫu khác: Kiểm tra HTML của biểu mẫu để xem có các trường ẩn bổ sung hoặc mã thông báo CSRF nào bạn cần gửi không.
  • User-Agent: Thử đặt user-agent trình duyệt thông thường trong yêu cầu HTTP của bạn.
  • Tham số: Đảm bảo các tham số websiteURL và captchaId chính xác.

Tại sao đăng nhập thất bại ngay cả khi GeeTest V4 đã được giải?

Nếu đăng nhập thất bại ngay cả khi GeeTest V4 đã được giải thành công, hãy kiểm tra những điều sau:

  • Thông tin đăng nhập: Đảm bảo bạn đang gửi đúng tên người dùng và mật khẩu.
  • Phiên/Cookie: Đảm bảo bạn duy trì cùng một phiên và cookie giữa việc lấy thử thách và gửi biểu mẫu đăng nhập.
  • Các trường biểu mẫu khác: Kiểm tra HTML của biểu mẫu để xem có các trường ẩn bổ sung hoặc mã thông báo CSRF nào bạn cần gửi không.
  • User-Agent: Thử đặt user-agent trình duyệt thông thường trong yêu cầu HTTP của bạn.

Quy trình làm việc này có thể được sử dụng với n8n Cloud không?

Có. Quy trình làm việc này hoạt động với cả n8n tự lưu trữ và n8n Cloud. Nút CapSolver đã có sẵn dưới dạng tích hợp chính thức. Bạn chỉ cần thêm thông tin xác thực API của mình.

Xem thêm

n8nMar 09, 2026

Cách Giải reCAPTCHA v2/v3 Sử Dụng CapSolver và n8n

Xây dựng API giải eCAPTCHA v2/v3 bằng CapSolver và n8n. Tìm hiểu cách tự động hóa việc giải token, gửi token đến website và trích xuất dữ liệu được bảo vệ mà không cần lập trình.

Anh Tuan
Anh Tuan
n8nMar 12, 2026

Cách giải quyết GeeTest V3 trong n8n với CapSolver: Hướng dẫn tích hợp đầy đủ

Hãy tìm hiểu cách tích hợp CapSolver với n8n để giải quyết bài toán GeeTest V3 và xây dựng các quy trình tự động hóa đáng tin cậy.

Nội dung

Emma Foster
Emma Foster
n8nMar 16, 2026

Cách giải bài toán ImageToText bằng CapSolver và n8n

Chuyển đổi ảnh thành văn bản, giải mã captcha, captcha OCR, capsolver, n8n, quy trình làm việc n8n, tự động hóa, API OCR, tự động hóa captcha, ảnh base64, nhận dạng hình ảnh, OCR AI, webhook, quy trình làm việc theo lịch trình, tự động hóa biểu mẫu, bỏ qua captcha, xử lý phiên, captcha không cần proxy, OCR tức thời, nhận dạng văn bản

Sora Fujimoto
Sora Fujimoto
n8nMar 17, 2026

Cách sử dụng CapSolver trong n8n: Hướng dẫn toàn diện để giải CAPTCHA trong các quy trình làm việc của bạn

Học cách tích hợp CapSolver với n8n để giải CAPTCHAs và xây dựng các quy trình tự động đáng tin cậy một cách dễ dàng.

Anh Tuan
Anh Tuan