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
//Cách giải quyết vấn đề AWS WAF trong n8n bằng CapSolver
Mar12, 2026

Cách giải quyết vấn đề AWS WAF trong n8n bằng CapSolver

Aloísio Vítor

Aloísio Vítor

Image Processing Expert

AWS WAF (Tường lửa ứng dụng web) là hệ thống bảo vệ bot cấp doanh nghiệp của Amazon được sử dụng bởi một số trang web lớn nhất trên Internet. Không giống như các CAPTCHA truyền thống hiển thị câu đố hình ảnh hoặc hộp kiểm, AWS WAF sử dụng các thử thách vô hình và xác minh dựa trên mã thông báo — điều này khiến các công cụ tự động hóa đặc biệt khó xử lý.

Điều gì sẽ xảy ra nếu bạn có thể tự động giải quyết các thử thách AWS WAF trong quy trình làm việc n8n của mình, cho dù bạn đang xây dựng một API giải quyết có thể tái sử dụng, thu thập dữ liệu từ 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 quyết các thử thách AWS WAF 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 làm việc tự động hóa lớn hơn nào.

Bạn sẽ xây dựng gì:

API giải quyết — một đ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 quyết AWS WAF

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ụ thu thập giá và sản phẩm giải quyết AWS WAF, 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 quyết AWS WAF trước khi gửi thông tin đăng nhập

AWS WAF là gì?

AWS WAF (Tường lửa ứng dụng web) là dịch vụ giảm thiểu bot và bảo mật web của Amazon Web Services. Nó bảo vệ các trang web khỏi các cuộc tấn công web phổ biến, lưu lượng bot và lạm dụng tự động. Nhiều trang web có lưu lượng truy cập cao — đặc biệt là các nền tảng thương mại điện tử, dịch vụ tài chính và ứng dụng doanh nghiệp — sử dụng AWS WAF để hạn chế quyền truy cập đằng sau các thử thách CAPTCHA vô hình.

AWS WAF khác với reCAPTCHA và Turnstile như thế nào:

  • Không yêu cầu khóa trang web — Không giống như reCAPTCHA hoặc Turnstile, AWS WAF không hiển thị khóa trang web công khai. Bạn chỉ cần websiteURL để bắt đầu giải quyết.
  • Xác thực dựa trên Cookie — Thay vì trả về một mã thông báo mà bạn gửi trong trường biểu mẫu, AWS WAF trả về một cookie aws-waf-token phải được gửi cùng với các yêu cầu tiếp theo thông qua tiêu đề HTTP Cookie.
  • Nhiều tham số tùy chọn — AWS WAF có thể hiển thị awsKey, awsIv, awsContext, awsChallengeJS và các tham số khác tùy thuộc vào cấu hình của trang web. Đây là tùy chọn và chỉ cần thiết cho các triển khai cụ thể.
  • Thử thách vô hình — Các thử thách AWS WAF thường chạy hoàn toàn trong nền bằng JavaScript, không có tiện ích con hiển thị để người dùng tương tác.

Không giống như CloudFront. AWS WAF là lớp tường lửa nằm phía trước các ứng dụng web. CloudFront là CDN của Amazon. Một trang web có thể sử dụng CloudFront mà không cần AWS WAF, hoặc AWS WAF mà không cần CloudFront — chúng là các dịch vụ riêng biệt, mặc dù thường được sử dụng cùng nhau.


Đ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 quyết AWS WAF 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 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 tới phiên bản n8n của bạn và điều hướng đến Settings -> Credentials. Bạn sẽ thấy tất cả thông tin xác thực đã định cấu hình của mình ở đâ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. Giữ Allowed HTTP Request Domains được đặt thành 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 rằng 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 quyết 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 quyết AWS WAF của mình!


Cách xác định các tham số AWS WAF

Trước khi bạn có thể giải quyết thử thách AWS WAF, bạn cần xác nhận rằng trang web mục tiêu đang sử dụng AWS WAF và thu thập bất kỳ tham số tùy chọn nào. Cách dễ nhất là sử dụng Tiện ích mở rộng trình duyệt CapSolver kết hợp với kiểm tra thủ công.

Bước 1: Tìm các chỉ số AWS WAF

Điều hướng đến trang web mục tiêu của bạn và mở DevTools (F12). Tìm kiếm các dấu hiệu rõ ràng sau:

  • Cookies — Kiểm tra cookie aws-waf-token trong tab Ứng dụng
  • Yêu cầu mạng — Tìm kiếm các yêu cầu tới captcha.awswaf.com hoặc các URL chứa challenge.js
  • Tiêu đề phản hồi — AWS WAF thường trả về các tiêu đề x-amzn-waf-*

Bước 2: Thu thập các tham số tùy chọn (nếu cần)

Hầu hết các giải pháp AWS WAF chỉ yêu cầu websiteURL. Tuy nhiên, một số trang web hiển thị các tham số bổ sung có thể cải thiện độ chính xác của giải pháp:

Tham số Nơi tìm thấy Mô tả
awsKey Mã nguồn trang / biến JS Giá trị khóa được trả về bởi trang CAPTCHA
awsIv Mã nguồn trang / biến JS Giá trị iv được trả về bởi trang CAPTCHA
awsContext Mã nguồn trang / biến JS Giá trị ngữ cảnh được trả về bởi trang CAPTCHA
awsChallengeJS Tab Mạng URL challenge.js (ví dụ: https://captcha.awswaf.com/.../challenge.js)
awsApiJs Tab Mạng URL jsapi.js
awsProblemUrl Tab Mạng URL điểm cuối vấn đề
awsApiKey Tab Mạng Giá trị api_key của điểm cuối vấn đề
awsExistingToken Cookies Một aws-waf-token trước đó nếu làm mới

Mẹo: Đối với hầu hết các trang web, bạn chỉ cần websiteURL. Bắt đầu chỉ với tham số đó và chỉ thêm các tham số tùy chọn nếu mã thông báo không được chấp nhận.

Để biết hướng dẫn chi tiết về cách xác định các tham số CAPTCHA, hãy xem tài liệu chính thức của CapSolver.


Quy trình làm việc: API giải quyết AWS WAF

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ố AWS WAF và trả về một mã thông báo cookie đã giải quyết.

Quy trình làm việc giải quyết AWS WAF trong n8n

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ố AWS WAF
  2. AWS WAF — Gửi thử thách đến CapSolver và chờ giải pháp
  3. Lỗi CapSolver? — Nút IF phân nhánh tùy thuộc vào việc giải quyết có thất bại hay không ($json.error không trống)
  4. Phản hồi Webhook — Trả về giải pháp khi thành công, hoặc {"error": "..."} khi 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-aws-waf
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-aws-waf

2. Nút CapSolver AWS WAF

Tham số Giá trị Mô tả
Thao tác AWS WAF Phải được đặt thành AWS WAF
Loại AntiAwsWafTaskProxyLess Không cần proxy (mặc định). Sử dụng AntiAwsWafTask với proxy cho các trang web nghiêm ngặt hơn
URL trang web {{ $json.body.websiteURL }} URL của trang có thử thách AWS WAF
awsKey (Tùy chọn) Giá trị khóa được trả về bởi trang CAPTCHA
awsIv (Tùy chọn) Giá trị iv được trả về bởi trang CAPTCHA
awsContext (Tùy chọn) Giá trị ngữ cảnh được trả về bởi trang CAPTCHA
awsChallengeJS (Tùy chọn) Liên kết challenge.js
awsApiJs (Tùy chọn) Liên kết jsapi.js

Điểm khác biệt chính với Turnstile/reCAPTCHA: AWS WAF không yêu cầu websiteKey. Chỉ websiteURL là bắt buộc. Cũng chọn thông tin xác thực CapSolver của bạn trong nút này.

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

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

Điều này làm cho đường dẫn lỗi rõ ràng trên canvas. Nút CapSolver tiếp tục khi có lỗi (onError: continueRegularOutput), vì vậy các lỗi sẽ đến đây dưới dạng {"error": "..."} thay vì làm hỏng quy trình làm việc.

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

Nhánh thành công (đầu ra False 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) }}

Nhánh lỗi (đầu ra True 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({ error: $json.error }) }}

Các thông báo lỗi tuân theo một trong hai định dạng tùy thuộc vào nơi xảy ra lỗi:

Điểm lỗi Định dạng
Tạo tác vụ bị từ chối (khóa sai, không có số dư, dữ liệu không hợp lệ, v.v.) {"error": "Failed to create task: Request failed with status code 400"}
Tác vụ đã tạo nhưng CAPTCHA không thể giải quyết {"error": "Solve failed: <reason>"}
Giải quyết hết thời gian chờ sau 120 giây {"error": "Get task result timeout: unable to solve within 120000 seconds"}

Lưu ý: Các lỗi tạo tác vụ (khóa API sai, số dư bằng 0, dữ liệu tác vụ không hợp lệ) đều hiển thị dưới dạng cùng một thông báo HTTP 400 — nút n8n bắt ngoại lệ HTTP trước khi đọc nội dung lỗi của CapSolver.

Ví dụ lỗi phổ biến:

json Copy
{"error": "Failed to create task: Request failed with status code 400"}
{"error": "Solve failed: Invalid parameters"}
{"error": "Get task result timeout: unable to solve within 120000 seconds"}

Thử nghiệm

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-aws-waf \
  -H "Content-Type: application/json" \
  -d '{
    "websiteURL": "https://example.com/login"
  }'

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

json Copy
{
  "taskId": "abc123...",
  "solution": {
    "cookie": "aws-waf-token=AQAAAA..."
  },
  "status": "ready"
}

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

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

Nhấp để mở rộng toàn bộ JSON quy trình làm việc
json Copy
{
  "name": "AWS WAF Solver API",
  "nodes": [
    {
      "parameters": {
        "content": "## API giải quyết AWS WAF\n\n**Dành cho:** Các nhóm cần giải quyết các thử thách AWS WAF trong các công cụ khác.\n\n**Chức năng:** Chấp nhận các tham số AWS WAF, gửi thử thách đến CapSolver và trả về một cookie `aws-waf-token` đã giải quyết.\n\n**Cách hoạt động:**\n1. Webhook nhận các yêu cầu POST với `websiteURL` và các tham số tùy chọn.\n2. CapSolver giải quyết thử thách AWS WAF.\n3. Khi thành công, Webhook trả về phản hồi JSON chứa cookie `aws-waf-token`.\n4. Khi thất bại, Webhook trả về thông báo lỗi.\n\n**Thiết lập:**\n1. Thêm khóa API CapSolver của bạn trong **Settings → Credentials**.\n2. Kích hoạt quy trình làm việc.\n3. Ghi lại URL Webhook.\n\n**Quan trọng:**\n- AWS WAF không yêu cầu `websiteKey`. Chỉ cần `websiteURL`.\n- Giải pháp là một cookie `aws-waf-token` phải được gửi dưới dạng tiêu đề HTTP `Cookie`.",
        "height": 480,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -728,
        -400
      ],
      "id": "sticky-blog-main-1773678228095-1",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "solver-aws-waf",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -400,
        0
      ],
      "id": "aw111111-1111-1111-1111-aw1111111101",
      "name": "Webhook Trigger",
      "webhookId": "aw111111-aaaa-bbbb-cccc-aw1111111101",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "AWS WAF",
        "type": "AntiAwsWafTaskProxyLess",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "awsKey": "={{ $json.body.awsKey }}",
        "awsIv": "={{ $json.body.awsIv }}",
        "awsContext": "={{ $json.body.awsContext }}",
        "awsChallengeJS": "={{ $json.body.awsChallengeJS }}",
        "awsApiJs": "={{ $json.body.awsApiJs }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "aw111111-1111-1111-1111-aw1111111102",
      "name": "Solve AWS WAF",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "aws-if-001",
              "leftValue": "={{ $json.error }}",
              "operator": {
                "type": "string",
                "operation": "isEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        208,
        0
      ],
      "id": "aw111111-1111-1111-1111-aw1111111103",
      "name": "CapSolver Error?"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json.data) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        512,
        -80
      ],
      "id": "aw111111-1111-1111-1111-aw1111111104",
      "name": "Respond to Webhook (Success)"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        512,
        128
      ],
      "id": "aw111111-1111-1111-1111-aw1111111105",
      "name": "Respond to Webhook (Error)"
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Solve AWS WAF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve AWS WAF": {
      "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: Ví dụ trường hợp sử dụng

API giải quyết và ví dụ gửi ở trên cho thấy mô hình cốt lõi: giải quyết thử thách AWS WAF, gửi cookie, xử lý kết quả. Các quy trình làm việc sau đây mở rộng mô hình này thành các trường hợp sử dụng sẵn sàng sản xuất — mỗi trường hợp có hai trình kích hoạt (lịch trình + webhook), theo dõi trạng thái liên tục và đầu ra có cấu trúc.

Quy trình làm việc Mục đích
Thu thập AWS WAF — Chi tiết giá & sản phẩm — CapSolver + Lịch trình + Webhook Thu thập giá và tên sản phẩm cứ sau 6 giờ, so sánh với các giá trị trước đó được lưu trữ trong staticData, cảnh báo về các thay đổi
Đăng nhập tài khoản AWS WAF — CapSolver + Lịch trình + Webhook Đăng nhập vào tài khoản của riêng bạn trên một trang web được bảo vệ bằng AWS WAF bằng cách giải quyết trước, sau đó gửi thông tin đăng nhập bằng cookie

Ví dụ 1: Thu thập dữ liệu

Quy trình làm việc này thu thập 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 nó với giá trị đã lưu trữ trước đó.

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

Copy
Cứ sau 6 giờ -> Giải quyết AWS WAF -> Lấy 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

Các hành vi chính:

  • Cookie được gửi dưới dạng tiêu đề Cookie (đây là cách đúng để gửi mã thông báo AWS WAF — không phải dưới dạng trường biểu mẫu)
  • Nút HTML trích xuất giá và tên sản phẩm thông qua 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 toàn bộ JSON quy trình làm việc (17 nút)
json Copy
{
  "name": "AWS WAF Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## Thu thập AWS WAF — Giám sát giá & sản phẩm\n\n**Dành cho:** Các nhóm 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 AWS WAF.\n\n**Chức năng:** Giải quyết AWS WAF, tìm nạp trang sản phẩm, trích xuất giá và tên thông qua 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\n**Cách hoạt động:**\n1. Lịch trình (mỗi 6h) hoặc Webhook kích hoạt luồng\n2. CapSolver giải quyết thử thách AWS WAF\n3. Yêu cầu HTTP tìm nạp trang sản phẩm với mã thông báo đã giải quyết\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\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 bộ chọn CSS trong Trích xuất dữ liệu để khớp với trang mục tiêu 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-1773678228094-1",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "### Đường dẫn lịch trình\nChạy tự động 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-1773678228094-2",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "### Đường dẫn Webhook\nTrình kích hoạt theo yêu cầu — cùng logic, 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-1773678228094-3",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -400,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333301",
      "name": "Every 6 Hours"
    },
    {
      "parameters": {
        "operation": "AWS WAF",
        "type": "AntiAwsWafTaskProxyLess",
        "websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333302",
      "name": "Solve AWS WAF",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "url": "https://YOUR-TARGET-SITE.com/product-page",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "Cookie",
              "value": "={{ $json.data.solution.cookie }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333303",
      "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": "aw333333-3333-3333-3333-aw3333333304",
      "name": "Extract Data"
    },
    {
      "parameters": {
        "jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Parse numeric values for comparison\nconst parsePrice = (str) => {\n  if (!str) return null;\n  const match = str.match(/[\\d,]+\\.?\\d*/);\n  return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// Update stored price\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\n\nreturn [{\n  json: {\n    productName,\n    currentPrice,\n    previousPrice: previousPrice || 'first check',\n    changed,\n    direction,\n    diff: changed ? `$${diff}` : null,\n    checkedAt: new Date().toISOString()\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        0
      ],
      "id": "aw333333-3333-3333-3333-aw3333333305",
      "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": "aw333333-3333-3333-3333-aw3333333306",
      "name": "Data Changed?"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "alert-001",
              "name": "alert",
              "value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
              "type": "string"
            },
            {
              "id": "alert-002",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            },
            {
              "id": "alert-003",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        -80
      ],
      "id": "aw333333-3333-3333-3333-aw3333333307",
      "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": "aw333333-3333-3333-3333-aw3333333308",
      "name": "No Change"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "price-monitor-aws-waf",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -400,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333309",
      "name": "Webhook Trigger",
      "webhookId": "aw333333-aaaa-bbbb-cccc-aw3333333309",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "AWS WAF",
        "type": "AntiAwsWafTaskProxyLess",
        "websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333310",
      "name": "Solve AWS WAF [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "url": "https://YOUR-TARGET-SITE.com/product-page",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "Cookie",
              "value": "={{ $json.data.solution.cookie }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333311",
      "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": "aw333333-3333-3333-3333-aw3333333312",
      "name": "Extract Data [Webhook]"
    },
    {
      "parameters": {
        "jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Parse numeric values for comparison\nconst parsePrice = (str) => {\n  if (!str) return null;\n  const match = str.match(/[\\d,]+\\.?\\d*/);\n  return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// Update stored price\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\n\nreturn [{\n  json: {\n    productName,\n    currentPrice,\n    previousPrice: previousPrice || 'first check',\n    changed,\n    direction,\n    diff: changed ? `$${diff}` : null,\n    checkedAt: new Date().toISOString()\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333313",
      "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": "aw333333-3333-3333-3333-aw3333333314",
      "name": "Data Changed? [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "alert-004",
              "name": "alert",
              "value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
              "type": "string"
            },
            {
              "id": "alert-005",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            },
            {
              "id": "alert-006",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        340
      ],
      "id": "aw333333-3333-3333-3333-aw3333333315",
      "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": "aw333333-3333-3333-3333-aw3333333316",
      "name": "No Change [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1712,
        420
      ],
      "id": "aw333333-3333-3333-3333-aw3333333317",
      "name": "Respond to Webhook [Webhook]"
    }
  ],
  "connections": {
    "Every 6 Hours": {
      "main": [
        [
          {
            "node": "Solve AWS WAF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve AWS WAF": {
      "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 AWS WAF [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve AWS WAF [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 — Giải quyết AWS WAF và gửi thông tin đăng nhập

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 AWS WAF từ đầu đến cuối. Nó giải quyết thử thách AWS WAF 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 các yêu cầu POST đến kích hoạt tự động hóa đăng nhập
  2. Giải quyết AWS WAF — Gửi thử thách đến CapSolver và chờ giải pháp
  3. Gửi biểu mẫu đăng nhập — Thực hiện yêu cầu HTTP POST đến trang web mục tiêu, chứa thông tin đăng nhập và cookie AWS WAF đã giải quyết
  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-aws-waf
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-aws-waf

2. Giải quyết AWS WAF (CapSolver)

Tham số Giá trị
Thao tác AWS WAF
URL trang web https://YOUR-TARGET-SITE.com/login

Cũng chọn thông tin xác thực CapSolver của bạn.

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, Cookie={{ $('Solve AWS WAF').item.json.data.solution.cookie }}

Quan trọng: Đảm bảo thay thế YOUR_USERNAME và YOUR_PASSWORD bằng thông tin đăng nhập thực tế. 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 mục tiêu.

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) }}

Thử nghiệm

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-aws-waf \
  -H "Content-Type: application/json" \
  -d '{
    "websiteURL": "https://example.com/login",
    "username": "testuser",
    "password": "testpass"
  }'

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

json Copy
{
  "status": "success",
  "message": "Login successful",
  "solution": {
    "cookie": "aws-waf-token=AQAAAA..."
  }
}

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 vào n8n thông qua Menu -> Import from JSON:

Nhấp để mở rộng toàn bộ JSON quy trình làm việc
json Copy
{
  "name": "AWS WAF Account Login — CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## Tự động hóa đăng nhập tài khoản AWS WAF — 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 AWS WAF.\n\n**Chức năng:** Giải quyết thử thách AWS WAF, sau đó gửi biểu mẫu đăng nhập bằng cookie đã giải quyết 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 quyết thử thách AWS WAF.\n3. Yêu cầu HTTP gửi biểu mẫu đăng nhập bằng cookie đã giải quyết và thông tin đăng nhập của người dùng.\n4. Webhook phản hồi 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 mục tiêu 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-1773678228096-1",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "login-aws-waf",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -400,
        0
      ],
      "id": "aw444444-4444-4444-4444-aw4444444401",
      "name": "Webhook Trigger",
      "webhookId": "aw444444-aaaa-bbbb-cccc-aw4444444401",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "AWS WAF",
        "type": "AntiAwsWafTaskProxyLess",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "aw444444-4444-4444-4444-aw4444444402",
      "name": "Solve AWS WAF",
      "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"
            },
            {
              "name": "Cookie",
              "value": "={{ $('Solve AWS WAF').item.json.data.solution.cookie }}}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "username",
              "value": "={{ $json.body.username }}"
            },
            {
              "name": "password",
              "value": "={{ $json.body.password }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "aw444444-4444-4444-4444-aw4444444403",
      "name": "Submit Login Form"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        512,
        0
      ],
      "id": "aw444444-4444-4444-4444-aw4444444404",
      "name": "Respond to Webhook"
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Solve AWS WAF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve AWS WAF": {
      "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 AWS WAF"

Lỗi này có nghĩa là tài khoản hoặc gói CapSolver của bạn không bao gồm quyền truy cập AWS WAF. Vui lòng kiểm tra bảng điều khiển CapSolver của bạn để xác minh xem gói của bạn có bao gồm dịch vụ này không.

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

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

"Đăng nhập không thành công, mặc dù AWS WAF đã được giải quyết"

Nếu AWS WAF đã được giải quyết thành công nhưng đăng nhập vẫn không thành công, có thể có vấn đề với:

  • 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 AWS WAF và gửi biểu mẫu đăng nhập.
  • Các trường biểu mẫu khác: Trang web mục tiêu 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 bắt buộc nào khác.
  • Tác nhân người dùng: Một số trang web có thể từ chối yêu cầu dựa trên chuỗi tác nhân người dùng. Hãy thử đặt một tác nhân người dùng trình duyệt phổ biến trong các 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 rằng khóa API CapSolver của bạn được định cấu hình trong n8n không chính xác hoặc đã hết hạn. Vui lòng 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 mục tiêu 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ể sử dụng các nút yêu cầu HTTP để xử lý cookie.
  2. Xác thực tham số: Kiểm tra kỹ websiteURL và bất kỳ tham số tùy chọn nào như awsKey, awsIv, awsContext, awsChallengeJS và awsApiJs là chính xác. Đây là chìa khóa để giải quyết AWS WAF 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 quyết 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 tác nhân người dùng thích hợp: Đặt một chuỗi tác nhân người dùng trình duyệt phổ biến 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: Việc triển khai AWS WAF 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 nó 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ư một số loại CAPTCHA khác, việc giải quyết AWS WAF 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 tiền đầu tiên của bạn!

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

Kết luận

Bạn đã học cách xây dựng API giải quyết AWS WAF và quy trình làm việc tự động hóa đăng nhập tài khoản bằng n8n và CapSolver.

Tóm tắt:

  • Cách AWS WAF hoạt động — Nó sử dụng các thử thách vô hình và xác thực dựa trên cookie.
  • Cách xác định các tham số AWS WAF — Sử dụng tab mạng của công cụ dành cho nhà phát triển để tìm các chỉ số và tham số tùy chọn.
  • Một điểm cuối API giải quyết — Chấp nhận các tham số AWS WAF và trả về một mã thông báo cookie đã giải quyết.
  • Một quy trình làm việc tự động hóa đăng nhập tài khoản — Giải quyết AWS WAF trước khi gửi thông tin đăng nhập.
  • Mẹo khắc phục sự cố — Xử lý các lỗi phổ biến như URL không hợp lệ, đăng nhập không thành công và thông tin xác thực không hợp lệ.
  • Các phương pháp hay nhất — Duy trì phiên, xác thực tham số, xử lý lỗi và sử dụng tác nhân người dùng thích hợp.

Sự phức tạp chính của AWS WAF nằm ở các thử thách vô hình và xác thực dựa trên cookie. Bằng cách xử lý đúng cookie aws-waf-token trong các yêu cầu HTTP, bạn có thể tự động hóa việc giải quyết AWS WAF một cách hiệu quả. Sau đó, bạn có thể tích hợp liền mạch các mã thông báo đã giải quyết này vào quy trình làm việc đăng nhập hoặc thu thập dữ liệu của mình.

Mẹo: Các quy trình làm việc này sử dụng trình kích hoạt Webhook, nhưng bạn có thể thay thế nút trình kích hoạt bằng bất kỳ trình kích hoạt n8n nào khác — thủ công, sự kiện ứng dụng, gửi biểu mẫu, v.v. Sau khi AWS WAF được giải quyết, hãy sử dụng các nút tích hợp của n8n để lưu kết quả vào Google Sheets, cơ sở dữ liệu, bộ nhớ đám mây hoặc gửi cảnh báo qua Telegram/Slack/email.


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

AWS WAF là gì?

AWS WAF là tường lửa ứng dụng web cấp doanh nghiệp của Amazon bảo vệ các trang web khỏi lưu lượng bot và lạm dụng thông qua các thử thách vô hình và xác minh dựa trên mã thông báo.

AWS WAF khác với reCAPTCHA hoặc Turnstile như thế nào?

AWS WAF không yêu cầu khóa trang web, thay vào đó sử dụng xác thực dựa trên cookie và trả về một cookie aws-waf-token. Nó thường là một thử thách vô hình không có tiện ích con hiển thị để người dùng tương tác.

Giải quyết thử thách AWS WAF tốn bao nhiêu?

Giá cả khác nhau tùy theo mức sử dụng. Vui lòng kiểm tra trang giá của CapSolver để biết giá AWS WAF hiện tại. Các tác vụ giải quyết AWS WAF thường đắt hơn nhận dạng hình ảnh thành văn bản đơn giản, nhưng rẻ hơn một số loại CAPTCHA phức tạp khác.

Mất bao lâu để giải quyết thử thách AWS WAF?

Các tác vụ giải quyết AWS WAF thường mất 10-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, việc giải quyết AWS WAF liên quan đến việc tạo tác vụ và thăm dò, vì vậy nó không tức thì.

Tôi có cần proxy cho AWS WAF không?

Dịch vụ giải quyết AWS WAF 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à bất kỳ tham số tùy chọn nào.

Tại sao aws-waf-token của tôi không được chấp nhận?

Nếu aws-waf-token không được chấp nhận, vui lòng 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 AWS WAF 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 hoặc mã thông báo CSRF khác cần được gửi hay không.
  • Tác nhân người dùng: Hãy thử đặt một tác nhân người dùng trình duyệt phổ biến trong các yêu cầu HTTP của bạn.
  • Tham số tùy chọn: Nếu trang web sử dụng các tham số tùy chọn như awsKey, awsIv, v.v., hãy đảm bảo bạn đã cung cấp chúng một cách chính xác.

Điều gì sẽ xảy ra nếu AWS WAF đã được giải quyết thành công nhưng đăng nhập vẫn không thành công?

Nếu AWS WAF đã được giải quyết thành công nhưng đăng nhập vẫn không thành công, vui lòng kiểm tra những điều sau:

  • Thông tin đăng nhập: Đảm bảo bạn đã 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 hoặc mã thông báo CSRF khác cần được gửi hay không.
  • Tác nhân người dùng: Hãy thử đặt một tác nhân người dùng trình duyệt phổ biến trong các yêu cầu HTTP của bạn.

Tôi có thể sử dụng quy trình làm việc này 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 12, 2026

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

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

Sora Fujimoto
Sora Fujimoto
Blog
n8n