
Anh Tuan
Data Science Expert

Nếu bạn từng cố gắng trích xuất giá cả, dữ liệu sản phẩm hoặc nội dung trang được bảo vệ, bạn đã biết phần khó không chỉ là tải URL. Quy trình cũng phải giải quyết các CAPTCHA của trang, gửi token đã giải theo cách mà trang mong đợi, sau đó trích xuất dữ liệu đúng từ phản hồi được bảo vệ.
Đó là lý do tại sao các ví dụ đơn giản "giải CAPTCHA và xong" không đủ cho tự động hóa thực tế. Một trang có thể mong đợi token trong tiêu đề, nội dung biểu mẫu, dữ liệu JSON, tham số truy vấn, cookie hoặc trường cụ thể của ứng dụng khác. Nó có thể sử dụng reCAPTCHA, Turnstile hoặc một loại CAPTCHA hoàn toàn khác. Và khi phản hồi được bảo vệ trở lại, các bộ chọn và logic đầu ra vẫn cần khớp với mục tiêu của bạn.
Trong hướng dẫn này, bạn sẽ học cách xây dựng các trình trích xuất cho các trang có CAPTCHA trong n8n bằng cách sử dụng CapSolver. Hướng dẫn chính dựa trên quy trình kho lưu trữ Scraping — Price & Product Details — CapSolver + Schedule + Webhook, nhưng mẫu tương tự có thể được điều chỉnh cho:
Bài viết này liên quan đến tự động hóa thực tế, được phép trên các mục tiêu bạn sở hữu, quản lý hoặc được phép kiểm tra.
Lưu ý quan trọng: Các quy trình này là các ví dụ và mẫu ban đầu, không phải công thức chung. Bạn nên kỳ vọng phải thay đổi cài đặt CAPTCHA, phương pháp gửi token, dữ liệu yêu cầu, tiêu đề, cookie, bộ chọn và logic đầu ra để phù hợp với từng trang cụ thể.
Ví dụ chính trong bài viết này là một mẫu trích xuất mục tiêu cố định hỗ trợ hai chế độ kích hoạt:
Trong mẫu kho lưu trữ mặc định, quy trình này:
x-recaptcha-tokenprice và productName$workflow.staticDataMẫu tương tự có thể trở thành:
Các mẫu kho lưu trữ này đều tuân theo khung xương khung tái sử dụng:
kích hoạt -> giải CAPTCHA -> gửi yêu cầu được bảo vệ -> trích xuất kết quả -> so sánh/lưu trữ/đầu ra
Cấu trúc này phù hợp với nhiều trường hợp hợp pháp:
| Trường hợp sử dụng | Điều gì thay đổi |
|---|---|
| Trích xuất | Trích xuất các trường giá và so sánh theo thời gian |
| Trích xuất dữ liệu sản phẩm | Trích xuất các trường như tiêu đề, SKU, người bán, tồn kho hoặc mô tả |
| Kiểm tra tồn kho | So sánh văn bản sẵn có, số lượng hoặc trạng thái nút mua |
| Đăng nhập vào tài khoản của bạn | Gửi token đã giải cùng yêu cầu đăng nhập và xác minh thành công đăng nhập |
| Truy xuất nội dung được bảo vệ | Lấy nội dung bị chặn và trả về các trường đã trích xuất |
| Trích xuất kích hoạt qua webhook | Cho phép dịch vụ khác kích hoạt mục tiêu được cấu hình cố định theo yêu cầu |
Cấu trúc vẫn có thể tái sử dụng, nhưng chi tiết triển khai thực tế có thể khác nhau trên mỗi trang. Trên thực tế, người dùng nên coi mỗi quy trình ở đây là ví dụ và sau đó điều chỉnh cài đặt giải CAPTCHA, hình dạng yêu cầu, vị trí token và logic trích xuất để phù hợp với mục tiêu mà họ đang tự động hóa.
Quy trình trích xuất chính ở trên lấy nội dung trang gốc và so sánh giá cả. Các quy trình sau mở rộng cùng mẫu giải CAPTCHA — Kích hoạt → Giải CAPTCHA → Gửi Yêu Cầu Được Bảo Vệ → Đánh Giá Kết Quả — cho các trường hợp sử dụng cụ thể. Mỗi quy trình đều yêu cầu các điều kiện tiên quyết giống nhau: một phiên bản n8n, một tài khoản CapSolver, và các tham số CAPTCHA của trang đích.
| Quy trình | Mục đích |
|---|---|
Scraping — Price & Product Details — CapSolver + Schedule + Webhook |
Mẫu lịch trình + webhook mục tiêu cố định giải reCAPTCHA v3, gửi token trong x-recaptcha-token, trích xuất price và productName, so sánh giá trị với $workflow.staticData, và có thể được sử dụng để trích xuất, trích xuất chi tiết sản phẩm hoặc kiểm tra trang sản phẩm được bảo vệ tương tự |
Lưu ý kích hoạt: Mẫu này được nhập vào với
active: false. Đường dẫn webhook không hoạt động cho đến khi bạn cấu hình các chỗ trống, chọn tài khoản CapSolver của bạn và kích hoạt quy trình trong n8n.
Trước khi bắt đầu, hãy đảm bảo bạn có:
Đối với ví dụ chính trong bài viết này, mục tiêu được giả định sử dụng reCAPTCHA, do đó các giá trị khóa là:
websiteURLwebsiteKeypageAction cho reCAPTCHA v3Lưu ý quan trọng: Hướng dẫn nhận diện tham số dưới đây được giới hạn chủ ý cho các ví dụ reCAPTCHA. Các mục tiêu thực tế có thể sử dụng loại thử thách khác hoàn toàn — như Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF hoặc MTCaptcha — và trong trường hợp đó, cấu hình nút giải CAPTCHA, các trường bắt buộc và mẫu yêu cầu được bảo vệ sẽ khác nhau.
Đối với các trang được bảo vệ bởi reCAPTCHA, các giá trị cốt lõi thường là:
| Tham số | Ý nghĩa |
|---|---|
websiteURL |
URL nơi CAPTCHA được hiển thị hoặc yêu cầu |
websiteKey |
Khóa công khai được trang sử dụng |
pageAction |
Chuỗi hành động được reCAPTCHA v3 mong đợi |
Trong mẫu giám sát giá của kho lưu trữ, nút CapSolver được cấu hình với:
operation: reCAPTCHA v3websiteURL: https://YOUR-TARGET-SITE.com/product-pagewebsiteKey: YOUR_SITE_KEY_HEREpageAction: view_productKhi bạn kiểm tra một trang mục tiêu reCAPTCHA, hãy xác minh:
pageAction có bắt buộc khôngLưu ý quan trọng: Đây không phải là phần phát hiện CAPTCHA phổ quát. Nếu mục tiêu sử dụng loại thử thách khác — như Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF hoặc MTCaptcha — bạn sẽ cần thay đổi cả cài đặt CapSolver và yêu cầu HTTP gửi token đã giải.
Quy trình kho lưu trữ Scraping — Price & Product Details — CapSolver + Schedule + Webhook hiện hỗ trợ hai đường kích hoạt mục tiêu cố định:
Every 6 Hours cho các kiểm tra định kỳWebhook Trigger cho các chạy theo yêu cầuCả hai đường đều sử dụng cùng các mẫu mục tiêu và logic trích xuất. Phiên bản webhook chỉ kết thúc ở Respond to Webhook để người gọi nhận được payload thông báo hoặc không thay đổi cuối cùng dưới dạng JSON.
Đường dẫn lịch trình sử dụng các nút sau:
Every 6 HoursSolve reCAPTCHA v3Fetch Product PageExtract DataCompare DataData Changed?Build AlertNo ChangeĐường dẫn webhook lặp lại cùng logic cho cùng mục tiêu cố định:
Webhook TriggerSolve reCAPTCHA v3 [Webhook]Fetch Product Page [Webhook]Extract Data [Webhook]Compare Data [Webhook]Data Changed? [Webhook]Build Alert [Webhook]No Change [Webhook]Respond to WebhookSử dụng lịch trình khi bạn muốn kiểm tra định kỳ, ví dụ như trích xuất hoặc kiểm tra tồn kho.
Sử dụng webhook khi một quy trình, dịch vụ hoặc ứng dụng khác nên kích hoạt cùng mục tiêu được cấu hình theo yêu cầu.
Mẫu sử dụng:
| Cài đặt | Giá trị |
|---|---|
| Operation | reCAPTCHA v3 |
websiteURL |
https://YOUR-TARGET-SITE.com/product-page |
websiteKey |
YOUR_SITE_KEY_HERE |
pageAction |
view_product |
Token đã giải được gửi trong tiêu đề yêu cầu:
| Tiêu đề | Giá trị |
|---|---|
user-agent |
Người dùng kiểu trình duyệt |
x-recaptcha-token |
{{ $json.data.solution.gRecaptchaResponse }} |
Đây là một trong những chi tiết quan trọng nhất trong quy trình. Mẫu kho lưu trữ không giả định token luôn thuộc về g-recaptcha-response. Trong ví dụ này, nó đi vào tiêu đề tùy chỉnh.
price và productNameNút HTML trích xuất:
| Khóa | Bộ chọn CSS |
|---|---|
price |
.product-price, [data-price], .price |
productName |
h1, .product-title |
Nút Code lưu trữ và so sánh giá trị bằng cách sử dụng:
$workflow.staticData.lastPrice$workflow.staticData.lastCheckedĐiều này cho phép quy trình phân biệt giữa:
Nút IF kiểm tra {{ $json.changed }}.
Nếu giá thay đổi, quy trình đi đến Build Alert.
Nếu không, nó đi đến No Change.
Trên đường dẫn webhook, nhánh nào cũng đi vào Respond to Webhook.
Mặc dù ví dụ chính bao gồm logic so sánh giá, nó hữu ích hơn khi xem như một mẫu trích xuất trang sản phẩm được bảo vệ với logic so sánh.
Các phần có thể tái sử dụng là:
Đó là lý do tại sao cùng cấu trúc có thể thúc đẩy:
Đây là phần quan trọng nhất trên một mục tiêu thực tế.
Đối với hầu hết các trang thực tế, bạn nên giả định rằng gần như mọi thứ ở đây đều có thể điều chỉnh: loại thử thách, tham số giải, nơi token được gửi, dữ liệu yêu cầu, cookie, tiêu đề, bộ chọn và ngay cả tiêu chí thành công cuối cùng. Các quy trình kho lưu trữ này là các mẫu có thể hoạt động, không phải công thức cố định sẽ phù hợp với mọi trang mà không thay đổi.
Các quy trình trường hợp sử dụng của kho lưu trữ hiện hỗ trợ lịch trình + webhook.
Sử dụng:
Các đường dẫn webhook trong các mẫu này là kích hoạt mục tiêu cố định, không phải API công khai cho các mục tiêu do người dùng cung cấp.
Ví dụ giám sát giá chính sử dụng reCAPTCHA v3, nhưng mục tiêu của bạn có thể sử dụng:
Nếu điều này thay đổi, bạn sẽ cần cập nhật bước giải tương ứng.
Ngay cả khi hai trang đều sử dụng reCAPTCHA, cài đặt có thể khác nhau.
Bạn có thể cần thay đổi:
operation hoặc loại nhiệm vụ của CapSolverwebsiteURLwebsiteKeypageActionMẫu trích xuất mở ra các trường cấu hình này dưới dạng chỗ trống vì chúng được kỳ vọng sẽ thay đổi.
Đừng giả định token luôn đi vào cùng một vị trí.
Mẫu này đã hiển thị một số mẫu:
| Mẫu | Ví dụ kho lưu trữ |
|---|---|
| Tiêu đề yêu cầu | Scraping — CapSolver + Schedule sử dụng x-recaptcha-token |
| Nội dung biểu mẫu | Các quy trình đăng nhập thường sử dụng g-recaptcha-response trong nội dung dạng biểu mẫu |
Trên các trang thực tế, token đã giải có thể thuộc về:
Mẫu này là một mẫu gửi, không phải mẫu phổ quát.
Yêu cầu được bảo vệ có thể yêu cầu nhiều hơn chỉ token CAPTCHA hoặc thử thách.
Bạn có thể cần điều chỉnh:
Điều này đặc biệt phổ biến đối với:
Mẫu trích xuất chính trích xuất:
priceproductNameNhưng bạn có thể thay thế bằng:
Mã giám sát giá hiện tại so sánh các giá trị số, nhưng cùng mẫu có thể được điều chỉnh cho:
JSON dưới đây là phiên bản có thể nhập của Scraping — Price & Product Details — CapSolver + Schedule + Webhook từ kho lưu trữ này, bao gồm cả các đường kích hoạt lịch trình + webhook.
{
"nodes": [
{
"parameters": {
"content": "## Scraping \u2014 Price & Product Monitor\n\n### How it works\n\n1. Triggers either by schedule or webhook input to start price monitoring.\n2. Solves reCAPTCHA to access the targeted product page.\n3. Retrieves and extracts data from the product page for further analysis.\n4. Compares newly fetched data with previously stored data to detect changes.\n5. Determines if changes occurred and prepares alerts if needed.\n6. Sends responses based on data analysis through designated channels.\n\n### Setup steps\n\n- [ ] Configure scheduled trigger interval in 'Every 6 Hours' node.\n- [ ] Set target website details in 'Set Target Config [Schedule]'.\n- [ ] Configure reCAPTCHA solver with API key in 'Solve reCAPTCHA v3' nodes.\n- [ ] Set up Webhook URL and path in 'Webhook Trigger'.\n- [ ] Define alert criteria and destination in 'Build Alert' nodes.\n\n### Customization\n\nAdjust the extraction pattern in 'Extract Data' nodes to fit specific product details.",
"height": 896,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1328,
-304
],
"id": "52c7808e-d2bc-4779-85e6-909a51066338",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled trigger setup\n\nInitializes the data monitoring process every 6 hours using a schedule trigger and sets the target configuration for scraping.",
"height": 320,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-160
],
"id": "3c5cee67-552d-48ea-8717-7c5126269e2e",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Quy trình thu thập dữ liệu định kỳ\n\nGiải quyết reCAPTCHA, tải trang sản phẩm, trích xuất dữ liệu và so sánh với các bản ghi trước để phát hiện thay đổi, theo một sự kích hoạt định kỳ.",
"height": 496,
"width": 1680,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
-304
],
"id": "d0315be2-111c-4893-bf42-2f2cc2eb186f",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Cài đặt kích hoạt Webhook\n\nXử lý theo dõi dữ liệu được kích hoạt thủ công thông qua Webhook đến và giải quyết reCAPTCHA để tiếp tục.",
"height": 304,
"width": 816,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-768,
336
],
"id": "a78f1606-07fb-40fd-af82-e1dc9b766206",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Quy trình thu thập dữ liệu Webhook\n\nXử lý các yêu cầu được kích hoạt bởi Webhook bằng cách tải trang sản phẩm, trích xuất dữ liệu và xác định các thay đổi.",
"height": 272,
"width": 1088,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
160,
320
],
"id": "1a677fd9-a3a8-404f-ba9a-2b087d7bfe11",
"name": "Sticky Note4"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
0
],
"id": "sc-901",
"name": "Mỗi 6 giờ"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "websiteURL",
"value": "https://YOUR-TARGET-SITE.com/trang-san-phẩm",
"type": "string"
},
{
"id": "cfg-002",
"name": "websiteKey",
"value": "YOUR_SITE_KEY_HERE",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-400,
0
],
"id": "sc-900",
"name": "Thiết lập Cấu hình Mục tiêu [Kế hoạch]"
},
{
"parameters": {
"operation": "reCAPTCHA v3",
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {
"pageAction": "xem_sản_phẩm"
}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "sc-902",
"name": "Giải quyết reCAPTCHA v3",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "Tài khoản CapSolver"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Thiết lập Cấu hình Mục tiêu [Kế hoạch]').first().json.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": "x-recaptcha-token",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "sc-903",
"name": "Lấy Trang Sản phẩm"
},
{
"parameters": {
"operation": "trích xuấtNội dungHTML",
"extractionValues": {
"values": [
{
"key": "giá",
"cssSelector": ".product-price, [data-price], .price"
},
{
"key": "tênSảnPhẩm",
"cssSelector": "h1, .product-title"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
0
],
"id": "sc-904",
"name": "Trích xuất Dữ liệu"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.giá;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.tênSảnPhẩm || 'Sản phẩm';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d,]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'giảm' : 'tăng') : 'không thay đổi';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'lần kiểm tra đầu tiên', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
0
],
"id": "sc-905",
"name": "So sánh Dữ liệu"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-1",
"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": "sc-906",
"name": "Dữ liệu Thay đổi?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "thông báo",
"value": "=Giá {{ $json.direction }} cho {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a2",
"name": "mức_độ",
"value": "={{ $json.direction === 'giảm' ? 'khuyến mãi' : 'thông tin' }}",
"type": "string"
},
{
"id": "a3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1392,
-192
],
"id": "sc-907",
"name": "Xây dựng Thông báo"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n1",
"name": "trạng thái",
"value": "không_thay_đổi",
"type": "string"
},
{
"id": "n2",
"name": "giáHiệnTại",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1392,
32
],
"id": "sc-908",
"name": "Không Thay đổi"
},
{
"parameters": {
"httpMethod": "POST",
"path": "theo_dõi_giá",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-720,
464
],
"id": "sc-909",
"name": "Kích hoạt Webhook",
"webhookId": "sc-909-webhook",
"onError": "tiếp_tục_output_thường"
},
{
"parameters": {
"operation": "reCAPTCHA v3",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {
"pageAction": "={{ $json.body.pageAction || 'xem_sản_phẩm' }}"
}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
464
],
"id": "sc-910",
"name": "Giải quyết reCAPTCHA v3 [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "Tài khoản CapSolver"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Kích hoạt Webhook').item.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": "x-recaptcha-token",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
432
],
"id": "sc-911",
"name": "Lấy Trang Sản phẩm [Webhook]"
},
{
"parameters": {
"operation": "trích xuấtNội dungHTML",
"extractionValues": {
"values": [
{
"key": "giá",
"cssSelector": ".product-price, [data-price], .price"
},
{
"key": "tênSảnPhẩm",
"cssSelector": "h1, .product-title"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
432
],
"id": "sc-912",
"name": "Trích xuất Dữ liệu [Webhook]"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.giá;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.tênSảnPhẩm || 'Sản phẩm';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d,]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'giảm' : 'tăng') : 'không thay đổi';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'lần kiểm tra đầu tiên', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
432
],
"id": "sc-913",
"name": "So sánh Dữ liệu [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-2",
"leftValue": "={{ $json.changed }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
432
],
"id": "sc-914",
"name": "Dữ liệu Thay đổi? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a4",
"name": "thông báo",
"value": "=Giá {{ $json.direction }} cho {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a5",
"name": "mức_độ",
"value": "={{ $json.direction === 'giảm' ? 'khuyến mãi' : 'thông tin' }}",
"type": "string"
},
{
"id": "a6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1424,
384
],
"id": "sc-915",
"name": "Xây dựng Thông báo [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n4",
"name": "trạng thái",
"value": "không_thay_đổi",
"type": "string"
},
{
"id": "n5",
"name": "giáHiệnTại",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1440,
592
],
"id": "sc-916",
"name": "Không Thay đổi [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1712,
512
],
"id": "sc-917",
"name": "Trả lời Webhook"
}
],
"connections": {
"Mỗi 6 giờ": {
"main": [
[
{
"node": "Thiết lập Cấu hình Mục tiêu [Lịch trình]",
"type": "main",
"index": 0
}
]
]
},
"Thiết lập Cấu hình Mục tiêu [Lịch trình]": {
"main": [
[
{
"node": "Giải reCAPTCHA v3",
"type": "main",
"index": 0
}
]
]
},
"Giải reCAPTCHA v3": {
"main": [
[
{
"node": "Lấy Trang Sản phẩm",
"type": "main",
"index": 0
}
]
]
},
"Lấy Trang Sản phẩm": {
"main": [
[
{
"node": "Trích xuất Dữ liệu",
"type": "main",
"index": 0
}
]
]
},
"Trích xuất Dữ liệu": {
"main": [
[
{
"node": "So sánh Dữ liệu",
"type": "main",
"index": 0
}
]
]
},
"So sánh Dữ liệu": {
"main": [
[
{
"node": "Dữ liệu đã thay đổi?",
"type": "main",
"index": 0
}
]
]
},
"Dữ liệu đã thay đổi?": {
"main": [
[
{
"node": "Xây dựng Thông báo",
"type": "main",
"index": 0
}
],
[
{
"node": "Không Có Thay Đổi",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Giải reCAPTCHA v3 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Giải reCAPTCHA v3 [Webhook]": {
"main": [
[
{
"node": "Lấy Trang Sản phẩm [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Lấy Trang Sản phẩm [Webhook]": {
"main": [
[
{
"node": "Trích xuất Dữ liệu [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Trích xuất Dữ liệu [Webhook]": {
"main": [
[
{
"node": "So sánh Dữ liệu [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"So sánh Dữ liệu [Webhook]": {
"main": [
[
{
"node": "Dữ liệu đã thay đổi? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Dữ liệu đã thay đổi? [Webhook]": {
"main": [
[
{
"node": "Xây dựng Thông báo [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Không Có Thay Đổi [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Xây dựng Thông báo [Webhook]": {
"main": [
[
{
"node": "Phản hồi cho Webhook",
"type": "main",
"index": 0
}
]
]
},
"Không Có Thay Đổi [Webhook]": {
"main": [
[
{
"node": "Phản hồi cho Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
Sau khi cấu hình các placeholder và kích hoạt workflow, kích hoạt đường dẫn webhook:
curl -X POST https://your-n8n-instance.com/webhook/price-monitor \
-H "Content-Type: application/json" \
-d '{}'
Phản hồi mong đợi (lần kiểm tra đầu tiên):
{
"status": "không_thay_đổi",
"currentPrice": "$29.99",
"checkedAt": "2026-03-11T08:00:00.000Z"
}
Phản hồi mong đợi (giá thay đổi):
{
"alert": "Giá đã giảm cho Widget Pro: $39.99 → $29.99 (-$10.00)",
"severity": "deal",
"checkedAt": "2026-03-11T14:00:00.000Z"
}
Một phản hồi với dữ liệu giá thực tế xác nhận rằng toàn bộ quy trình hoạt động — captcha đã được giải, trang bị bảo vệ đã được lấy, dữ liệu đã được trích xuất và logic so sánh đã chạy.
Nếu CapSolver trả về token nhưng trang web vẫn chặn yêu cầu, vấn đề thường không phải ở việc giải captcha. Các nguyên nhân phổ biến:
pageAction saiNếu trang đích sử dụng thách thức không phải reCAPTCHA — như Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF, hoặc MTCaptcha — ví dụ chính sẽ không hoạt động mà không thay đổi. Bạn cần cập nhật:
Nếu node HTML không trích xuất các trường bạn mong đợi:
Các mẫu repo được nhập với trạng thái không hoạt động. Cho đến khi bạn:
đường dẫn webhook sẽ không hoạt động.
Xây dựng Thông báo hoặc node xác thực thành công/thất bại.Sẵn sàng bắt đầu chưa? Đăng ký CapSolver và sử dụng mã thưởng OPENCLAW để nhận thêm 6% thưởng cho lần nạp đầu tiên!

Thông điệp chính là đơn giản: giải captcha chỉ là một bước trong quy trình. Người quét thực sự vẫn phải gửi token đúng cách, gửi đúng định dạng yêu cầu và trích xuất các trường quan trọng cho trường hợp sử dụng của bạn.
Đó cũng là lý do tại sao các mẫu này nên được xem như ví dụ. Một trang web khác có thể sử dụng loại captcha khác, kỳ vọng token ở nơi khác, cần cookie hoặc trường bổ sung, trả về định dạng phản hồi khác nhau và yêu cầu logic trích xuất hoặc xác minh khác nhau.
Mẫu này cung cấp điểm bắt đầu cho:
Nó sử dụng mô hình chung:
kích hoạt -> giải captcha -> gửi yêu cầu được bảo vệ -> trích xuất hoặc xác minh kết quả -> đầu ra
Cấu hình các placeholder, giữ workflow ở trạng thái không hoạt động cho đến khi chúng khớp với mục tiêu của bạn, sau đó kích hoạt đường dẫn lịch trình hoặc webhook phù hợp với trường hợp sử dụng của bạn.
Mẫu quét có thể được điều chỉnh cho luồng đăng nhập bằng cách thay đổi node HTTP Request để gửi thông tin đăng nhập cùng với token đã giải. Xem các hướng dẫn riêng cho từng loại captcha (reCAPTCHA, Turnstile, v.v.) để có các mẫu luồng đăng nhập sẵn có.
Khi đó bạn phải thay đổi workflow. Cài đặt và mẫu yêu cầu của ví dụ chính không phải là phổ quát. CapSolver hỗ trợ Cloudflare Turnstile, Cloudflare Challenge, GeeTest V3/V4, DataDome, AWS WAF, MTCaptcha và các loại khác. Cập nhật bước giải CapSolver và yêu cầu được bảo vệ để phù hợp với loại thách thức và mẫu gửi token thực tế của trang đích.
Nơi mà trang đích kỳ vọng. Đó có thể là:
Mẫu giám sát giá sử dụng một tiêu đề. Các trang khác sẽ khác nhau.
Thông thường thì có. Ngay cả các trang sử dụng cùng gia đình captcha cũng có thể yêu cầu websiteURL, websiteKey, pageAction, cài đặt ẩn, hoặc các tùy chọn khác khác nhau.
Có. Thay các chọn lọc và logic đầu ra cho những gì bạn cần, như tồn kho, tiêu đề, SKU, mô tả, nội dung bị bảo vệ, trạng thái đăng nhập, hoặc tín hiệu về tình trạng trang web.
Bắt đầu bằng cách kiểm tra phản hồi được bảo vệ trả về bởi node HTTP Request.
Gỡ lỗi workflow theo thứ tự này: giải -> gửi -> kiểm tra phản hồi -> trích xuất.
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.

Khám phá AI tốt nhất để giải các câu đố hình ảnh. Học cách Vision Engine và APIs ImageToText của CapSolver tự động hóa các thách thức thị giác phức tạp với độ chính xác cao.
