
Emma Foster
Machine Learning Engineer

Jika pernah mencoba mengambil harga, data produk, atau konten halaman yang dilindungi, Anda sudah tahu bagian yang sulit bukan hanya memuat URL. Alur kerja juga harus menyelesaikan captchas situs tersebut, mengirimkan token yang telah diselesaikan dengan cara yang diharapkan situs, lalu mengekstrak data yang tepat dari respons yang dilindungi.
Itulah sebabnya contoh "selesaikan captcha dan selesai" tidak cukup untuk otomatisasi nyata. Situs mungkin mengharapkan token dalam header, tubuh formulir, payload JSON, parameter kueri, cookie, atau bidang khusus aplikasi lainnya. Situs mungkin menggunakan reCAPTCHA, Turnstile, atau tantangan captcha lainnya. Dan setelah respons yang dilindungi kembali, pemilih dan logika output tetap perlu sesuai dengan tujuan Anda.
Dalam panduan ini, Anda akan belajar bagaimana membangun scraper untuk situs yang dilindungi captcha di n8n menggunakan CapSolver. Panduan utama berdasarkan alur kerja repo Scraping — Price & Product Details — CapSolver + Schedule + Webhook, tetapi template yang sama dapat disesuaikan untuk:
Artikel ini tentang otomatisasi yang sah pada target yang Anda miliki, kelola, atau diizinkan untuk diuji.
Penting: Alur kerja ini adalah contoh dan template awal, bukan resep universal yang bisa langsung digunakan. Anda seharusnya menyesuaikan pengaturan captcha, metode pengiriman token, payload permintaan, header, cookie, pemilih ekstraksi, dan logika output untuk sesuai dengan setiap situs tertentu.
Contoh utama dalam artikel ini adalah template scraper target tetap yang sekarang mendukung dua mode aktivasi:
Dalam template repo default, alur kerja ini:
x-recaptcha-tokenprice dan productName$workflow.staticDataPola yang sama dapat menjadi:
Semua template repo mengikuti kerangka kerja yang dapat digunakan kembali:
trigger -> selesaikan captcha -> kirim permintaan yang dilindungi -> ekstrak hasil -> bandingkan/simpan/output
Struktur ini cocok untuk beberapa penggunaan sah:
| Kasus penggunaan | Apa yang berubah |
|---|---|
| Pengambilan data | Ekstrak bidang harga dan bandingkan seiring waktu |
| Pengambilan data produk | Ekstrak bidang seperti judul, SKU, penjual, stok, atau deskripsi |
| Pemeriksaan stok | Bandingkan teks ketersediaan, kuantitas, atau status tombol beli |
| Masuk ke akun Anda sendiri | Kirim token yang telah diselesaikan bersama permintaan login dan verifikasi keberhasilan login |
| Pemulihan konten yang dilindungi | Ambil konten yang terkunci dan kembalikan bidang yang diekstrak |
| Pengambilan data melalui webhook | Biarkan layanan lain mengaktifkan target yang dikonfigurasi tetap secara on-demand |
Struktur tetap dapat digunakan kembali, tetapi detail implementasi nyata bisa berbeda di setiap situs. Dalam praktiknya, pengguna seharusnya menganggap setiap alur kerja di sini sebagai contoh dan menyesuaikan konfigurasi penyelesaian, bentuk permintaan, penempatan token, dan logika ekstraksi sesuai target yang sedang diotomatisasi.
Alur kerja scraper utama di atas mengambil konten halaman mentah dan membandingkan harga. Alur kerja berikut memperluas pola penyelesaian captcha yang sama — Trigger → Solve Captcha → Submit Protected Request → Evaluate Result — untuk penggunaan spesifik. Setiap yang memerlukan prasyarat yang sama: instance n8n, kredensial CapSolver, dan parameter captcha target.
| Alur Kerja | Tujuan |
|---|---|
Scraping — Price & Product Details — CapSolver + Schedule + Webhook |
Template target tetap jadwal + webhook yang menyelesaikan reCAPTCHA v3, mengirimkan token di x-recaptcha-token, mengekstrak price dan productName, membandingkan nilai dengan $workflow.staticData, dan dapat digunakan untuk mengambil data, ekstraksi detail produk, atau pemeriksaan halaman produk yang dilindungi |
Catatan aktivasi: Template ini diimpor sebagai
active: false. Jalur webhook tidak aktif hingga Anda mengkonfigurasi placeholder, memilih kredensial CapSolver Anda, dan mengaktifkan alur kerja di n8n.
Sebelum memulai, pastikan Anda memiliki:
Untuk contoh utama dalam artikel ini, target diasumsikan menggunakan reCAPTCHA, jadi nilai kunci adalah:
websiteURLwebsiteKeypageAction untuk reCAPTCHA v3Penting: Penjelasan identifikasi parameter di bawah ini secara sengaja dibatasi pada contoh reCAPTCHA. Target nyata mungkin menggunakan jenis tantangan yang berbeda sama sekali — seperti Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF, atau MTCaptcha — dan dalam hal itu konfigurasi node penyelesaian, bidang yang diperlukan, dan pola permintaan yang dilindungi akan berbeda.
Untuk halaman yang dilindungi reCAPTCHA, nilai inti biasanya:
| Parameter | Artinya |
|---|---|
websiteURL |
URL di mana captcha ditampilkan atau diperlukan |
websiteKey |
Kunci situs publik yang digunakan oleh halaman |
pageAction |
String aksi yang diharapkan oleh reCAPTCHA v3 |
Dalam template pemantau harga repo, node CapSolver dikonfigurasi dengan:
operation: reCAPTCHA v3websiteURL: https://YOUR-TARGET-SITE.com/product-pagewebsiteKey: YOUR_SITE_KEY_HEREpageAction: view_productKetika Anda memeriksa target reCAPTCHA, pastikan:
pageAction diperlukanPenting: Ini bukan bagian detektor captcha universal. Jika target menggunakan jenis tantangan yang berbeda — seperti Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF, atau MTCaptcha — Anda akan perlu mengubah baik pengaturan CapSolver maupun permintaan HTTP yang mengirimkan token yang diselesaikan.
Alur kerja repo Scraping — Price & Product Details — CapSolver + Schedule + Webhook sekarang mendukung dua jalur aktivasi target tetap:
Every 6 Hours untuk pemeriksaan berulangWebhook Trigger untuk eksekusi on-demandKedua jalur ini menggunakan placeholder target yang sama dan logika scraper yang sama. Versi webhook hanya berakhir di Respond to Webhook sehingga pemanggil mendapatkan payload peringatan atau tanpa perubahan akhir sebagai JSON.
Jalur jadwal menggunakan node-node ini:
Every 6 HoursSolve reCAPTCHA v3Fetch Product PageExtract DataCompare DataData Changed?Build AlertNo ChangeJalur webhook mengulang logika yang sama untuk target tetap yang sama:
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 WebhookGunakan jadwal ketika Anda ingin pemeriksaan berulang, seperti pengambilan data atau pemeriksaan stok.
Gunakan webhook ketika layanan, alur kerja, atau aplikasi lainnya harus mengaktifkan target yang dikonfigurasi sama secara on-demand.
Template menggunakan:
| Pengaturan | Nilai |
|---|---|
| Operation | reCAPTCHA v3 |
websiteURL |
https://YOUR-TARGET-SITE.com/product-page |
websiteKey |
YOUR_SITE_KEY_HERE |
pageAction |
view_product |
Token yang diselesaikan dikirimkan dalam header permintaan:
| Header | Nilai |
|---|---|
user-agent |
User agent gaya browser |
x-recaptcha-token |
{{ $json.data.solution.gRecaptchaResponse }} |
Ini adalah detail paling penting dalam alur kerja. Template repo tidak mengasumsikan token selalu berada di g-recaptcha-response. Dalam contoh ini, ia masuk ke header khusus.
price dan productNameNode HTML mengekstrak:
| Kunci | Pemilih CSS |
|---|---|
price |
.product-price, [data-price], .price |
productName |
h1, .product-title |
Node Code menyimpan dan membandingkan nilai menggunakan:
$workflow.staticData.lastPrice$workflow.staticData.lastCheckedIni memungkinkan alur kerja membedakan antara:
Node IF memeriksa {{ $json.changed }}.
Jika harga berubah, alur kerja pergi ke Build Alert.
Jika tidak, pergi ke No Change.
Pada jalur webhook, cabang mana pun kemudian pergi ke Respond to Webhook.
Meskipun contoh utama mencakup logika perbandingan harga, lebih bermanfaat untuk memikirkannya sebagai template scraper halaman produk yang dilindungi dengan logika perbandingan.
Bagian yang dapat digunakan kembali adalah:
Itulah sebabnya struktur yang sama dapat menggerakkan:
Ini adalah bagian yang paling penting pada target nyata.
Untuk sebagian besar situs nyata, Anda seharusnya mengasumsikan hampir semua hal di sini dapat disesuaikan: jenis tantangan, parameter penyelesaian, di mana token dikirimkan, tubuh permintaan, cookie, header, pemilih, dan bahkan kriteria keberhasilan akhir. Alur kerja repo ini adalah contoh pola yang dapat berjalan, bukan resep tetap yang akan sesuai dengan setiap situs tanpa perubahan.
Alur kerja kasus penggunaan repo sekarang mendukung jadwal + webhook.
Gunakan:
Jalur webhook dalam template ini adalah pemicu target tetap, bukan API publik untuk target yang disediakan pengguna.
Contoh pemantau harga utama menggunakan reCAPTCHA v3, tetapi target Anda mungkin menggunakan:
Jika itu berubah, Anda akan perlu memperbarui langkah penyelesaian sesuai.
Bahkan ketika dua situs menggunakan reCAPTCHA, pengaturannya masih bisa berbeda.
Anda mungkin perlu mengubah:
operation atau jenis tugas CapSolverwebsiteURLwebsiteKeypageActionTemplate scraper mengekspos ini sebagai bidang konfigurasi placeholder karena diharapkan berubah.
Jangan asumsikan token selalu berada di tempat yang sama.
Repo ini sudah menunjukkan beberapa pola:
| Pola | Contoh repo |
|---|---|
| Header permintaan | Scraping — CapSolver + Schedule menggunakan x-recaptcha-token |
| Tubuh formulir | Alur kerja login biasanya menggunakan g-recaptcha-response dalam tubuh form-urlencoded |
Pada situs nyata, token yang diselesaikan mungkin berada di:
Contoh repo ini adalah satu pola pengiriman, bukan yang universal.
Permintaan yang dilindungi mungkin membutuhkan lebih dari hanya token captcha atau tantangan.
Anda mungkin perlu menyesuaikan:
Ini terutama umum untuk:
Template scraper utama mengekstrak:
priceproductNameTetapi Anda dapat menggantinya dengan:
Kode pemantau harga saat ini membandingkan nilai numerik, tetapi pola yang sama dapat disesuaikan untuk:
JSON di bawah ini adalah versi yang dapat diimpor saat ini dari Scraping — Price & Product Details — CapSolver + Schedule + Webhook dari repo ini, termasuk jalur aktivasi jadwal + 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": "## Proses pencarian yang dijadwalkan\n\nMenyelesaikan reCAPTCHA, mengambil halaman produk, mengekstrak data, dan membandingkannya dengan catatan sebelumnya untuk mengidentifikasi perubahan, mengikuti pemicu yang dijadwalkan.",
"height": 496,
"width": 1680,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
-304
],
"id": "d0315be2-111c-4893-bf42-2f2cc2eb186f",
"name": "Catatan Menempel2"
},
{
"parameters": {
"content": "## Pengaturan pemicu webhook\n\nMenangani pemantauan data yang dipicu secara manual melalui webhook masuk dan menyelesaikan reCAPTCHA untuk melanjutkan.",
"height": 304,
"width": 816,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-768,
336
],
"id": "a78f1606-07fb-40fd-af82-e1dc9b766206",
"name": "Catatan Menempel3"
},
{
"parameters": {
"content": "## Proses pencarian webhook\n\nMemproses permintaan yang dipicu webhook dengan mengambil halaman produk, mengekstrak data, dan menentukan perubahan.",
"height": 272,
"width": 1088,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
160,
320
],
"id": "1a677fd9-a3a8-404f-ba9a-2b087d7bfe11",
"name": "Catatan Menempel4"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
0
],
"id": "sc-901",
"name": "Setiap 6 Jam"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "websiteURL",
"value": "https://YOUR-TARGET-SITE.com/product-page",
"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": "Set Target Config [Schedule]"
},
{
"parameters": {
"operation": "reCAPTCHA v3",
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {
"pageAction": "view_product"
}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "sc-902",
"name": "Selesaikan reCAPTCHA v3",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "Akun CapSolver"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Set Target Config [Schedule]').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": "Ambil Halaman Produk"
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price"
},
{
"key": "productName",
"cssSelector": "h1, .product-title"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
0
],
"id": "sc-904",
"name": "Ekstrak Data"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Produk';\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 ? 'turun' : 'naik') : 'tidak berubah';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'pemeriksaan pertama', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
0
],
"id": "sc-905",
"name": "Bandingkan Data"
},
{
"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": "Data Berubah?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "alert",
"value": "=Harga {{ $json.direction }} untuk {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a2",
"name": "tingkat keparahan",
"value": "={{ $json.direction === 'turun' ? 'penawaran' : 'informasi' }}",
"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": "Buat Pemberitahuan"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n1",
"name": "status",
"value": "tidak ada perubahan",
"type": "string"
},
{
"id": "n2",
"name": "harga saat ini",
"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": "Tidak Ada Perubahan"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-720,
464
],
"id": "sc-909",
"name": "Pemicu Webhook",
"webhookId": "sc-909-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "reCAPTCHA v3",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {
"pageAction": "={{ $json.body.pageAction || 'view_product' }}"
}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
464
],
"id": "sc-910",
"name": "Selesaikan reCAPTCHA v3 [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "Akun CapSolver"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Pemicu 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": "Ambil Halaman Produk [Webhook]"
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price"
},
{
"key": "productName",
"cssSelector": "h1, .product-title"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
432
],
"id": "sc-912",
"name": "Ekstrak Data [Webhook]"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Produk';\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 ? 'turun' : 'naik') : 'tidak berubah';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'pemeriksaan pertama', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
432
],
"id": "sc-913",
"name": "Bandingkan Data [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": "Data Berubah? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a4",
"name": "alert",
"value": "=Harga {{ $json.direction }} untuk {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a5",
"name": "tingkat keparahan",
"value": "={{ $json.direction === 'turun' ? 'penawaran' : 'informasi' }}",
"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": "Buat Pemberitahuan [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n4",
"name": "status",
"value": "tidak ada perubahan",
"type": "string"
},
{
"id": "n5",
"name": "harga saat ini",
"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": "Tidak Ada Perubahan [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1712,
512
],
"id": "sc-917",
"name": "Balas Webhook"
}
],
"connections": {
"Setiap 6 Jam": {
"main": [
[
{
{
"node": "Atur Konfigurasi Tujuan [Jadwal]",
"type": "main",
"index": 0
}
],
"main": [
[
{
"node": "Selesaikan reCAPTCHA v3",
"type": "main",
"index": 0
}
]
],
"Selesaikan reCAPTCHA v3": {
"main": [
[
{
"node": "Ambil Halaman Produk",
"type": "main",
"index": 0
}
]
],
"Ambil Halaman Produk": {
"main": [
[
{
"node": "Ekstrak Data",
"type": "main",
"index": 0
}
]
],
"Ekstrak Data": {
"main": [
[
{
"node": "Bandingkan Data",
"type": "main",
"index": 0
}
]
],
"Bandingkan Data": {
"main": [
[
{
"node": "Data Berubah?",
"type": "main",
"index": 0
}
]
],
"Data Berubah?": {
"main": [
[
{
"node": "Buat Pemberitahuan",
"type": "main",
"index": 0
}
],
[
{
"node": "Tidak Ada Perubahan",
"type": "main",
"index": 0
}
]
],
"Trigger Webhook": {
"main": [
[
{
"node": "Selesaikan reCAPTCHA v3 [Webhook]",
"type": "main",
"index": 0
}
]
],
"Selesaikan reCAPTCHA v3 [Webhook]": {
"main": [
[
{
"node": "Ambil Halaman Produk [Webhook]",
"type": "main",
"index": 0
}
]
],
"Ambil Halaman Produk [Webhook]": {
"main": [
[
{
"node": "Ekstrak Data [Webhook]",
"type": "main",
"index": 0
}
]
],
"Ekstrak Data [Webhook]": {
"main": [
[
{
"node": "Bandingkan Data [Webhook]",
"type": "main",
"index": 0
}
]
],
"Bandingkan Data [Webhook]": {
"main": [
[
{
"node": "Data Berubah? [Webhook]",
"type": "main",
"index": 0
}
]
],
"Data Berubah? [Webhook]": {
"main": [
[
{
"node": "Buat Pemberitahuan [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Tidak Ada Perubahan [Webhook]",
"type": "main",
"index": 0
}
]
],
"Buat Pemberitahuan [Webhook]": {
"main": [
[
{
"node": "Balas Webhook",
"type": "main",
"index": 0
}
]
],
"Tidak Ada Perubahan [Webhook]": {
"main": [
[
{
"node": "Balas Webhook",
"type": "main",
"index": 0
}
]
]
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
Setelah Anda mengkonfigurasi placeholder dan mengaktifkan alur kerja, aktifkan jalur webhook:
curl -X POST https://your-n8n-instance.com/webhook/price-monitor \
-H "Content-Type: application/json" \
-d '{}'
Respons yang diharapkan (pemeriksaan pertama):
{
"status": "tidak ada_perubahan",
"currentPrice": "$29.99",
"checkedAt": "2026-03-11T08:00:00.000Z"
}
Respons yang diharapkan (harga berubah):
{
"alert": "Harga turun untuk Widget Pro: $39.99 → $29.99 (-$10.00)",
"severity": "deal",
"checkedAt": "2026-03-11T14:00:00.000Z"
}
Respons dengan data harga aktual memastikan seluruh pipeline berjalan — captcha diselesaikan, halaman terlindungi diambil, data diekstrak, dan logika perbandingan dijalankan.
Jika CapSolver mengembalikan token tetapi situs tetap memblokir permintaan, masalahnya sering kali bukan karena penyelesaian token itu sendiri. Penyebab umum:
pageAction yang salahJika target menggunakan tantangan non-reCAPTCHA — seperti Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF, atau MTCaptcha — contoh utama tidak akan berfungsi tanpa perubahan. Anda perlu memperbarui:
Jika node HTML tidak mengekstrak bidang yang Anda harapkan:
Templat repo diimpor sebagai tidak aktif. Hingga Anda:
jalur webhook tidak akan aktif.
Buat Pemberitahuan atau node keberhasilan/gagal otentikasi.Siap memulai? Daftar di CapSolver dan gunakan kode bonus OPENCLAW untuk bonus tambahan 6% pada recharge pertama Anda!
Poin utamanya sederhana: menyelesaikan captcha hanyalah satu langkah dalam alur kerja. Pengambil data tetap harus mengirim token secara benar, mengirim bentuk permintaan yang tepat, dan mengekstrak bidang yang penting untuk kasus penggunaan Anda.
Itu juga alasan mengapa templat ini sebaiknya dianggap sebagai contoh. Situs berbeda mungkin menggunakan jenis captcha berbeda, mengharapkan token di tempat lain, membutuhkan kuki atau bidang tambahan, mengembalikan bentuk respons yang berbeda, dan memerlukan logika ekstraksi atau validasi yang berbeda.
Templat ini memberi Anda titik awal untuk:
Menggunakan pola umum:
trigger -> selesaikan captcha -> kirim permintaan terlindungi -> ekstrak atau verifikasi hasil -> output
Konfigurasikan placeholder, pertahankan alur kerja tidak aktif hingga sesuai dengan target Anda, lalu aktifkan jalur jadwal atau webhook yang sesuai dengan kasus penggunaan Anda.
Templat pengambil data dapat disesuaikan untuk alur login dengan mengubah node HTTP Request menjadi POST kredensial bersama token yang diselesaikan. Lihat panduan khusus untuk jenis captcha (reCAPTCHA, Turnstile, dll.) untuk contoh alur login yang siap pakai.
Maka Anda harus memodifikasi alur kerja. Pengaturan reCAPTCHA dan pola permintaan utama tidak universal. CapSolver mendukung Cloudflare Turnstile, Cloudflare Challenge, GeeTest V3/V4, DataDome, AWS WAF, MTCaptcha, dan lainnya. Perbarui langkah penyelesaian CapSolver dan permintaan terlindungi untuk sesuai dengan jenis tantangan dan pola pengiriman token yang digunakan target.
Di tempat yang diharapkan situs target. Itu bisa jadi:
Templat pemantau harga menggunakan header. Situs lain akan berbeda.
Biasanya ya. Bahkan situs yang menggunakan keluarga captcha yang sama bisa membutuhkan websiteURL, websiteKey, pageAction, pengaturan tidak terlihat, atau opsi tugas lainnya yang berbeda.
Ya. Ganti selector dan logika output sesuai kebutuhan Anda, seperti stok, judul, SKU, deskripsi, konten terlindungi, status login, atau sinyal kesehatan situs.
Mulai dengan memeriksa respons terlindungi yang dikembalikan oleh node HTTP Request.
Debug alur kerja dalam urutan ini: selesaikan -> kirim -> periksa respons -> ekstrak.
Bangun API solver eCAPTCHA v2/v3 menggunakan CapSolver dan n8n. Pelajari cara mengotomatisasi penyelesaian token, mengirimkannya ke website, dan mengekstrak data yang dilindungi tanpa coding.

Temukan AI terbaik untuk menyelesaikan teka-teki gambar. Pelajari bagaimana Engine Visi CapSolver dan API ImageToText mengotomasi tantangan visual kompleks dengan akurasi tinggi.
