ProdukIntegrasiSumber DayaDokumentasiHarga
Mulai Sekarang

© 2026 CapSolver. All rights reserved.

Hubungi Kami

Slack: lola@capsolver.com

Produk

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Ekstensi Browser
  • Lebih banyak jenis CAPTCHA

Integrasi

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Mitra
  • Lihat semua integrasi

Sumber Daya

  • Program Referensi
  • Dokumentasi
  • Referensi API
  • Blog
  • FAQ
  • Glosarium
  • Status

Legal

  • Ketentuan Layanan
  • Kebijakan Privasi
  • Kebijakan Pengembalian Dana
  • Jangan jual informasi pribadi saya
//Cara Membangun Pemroses untuk Pengambilan Data Web di n8n dengan CapSolver
Apr03, 2026

Cara Membangun Pemroses untuk Pengambilan Data Web di n8n dengan CapSolver

Emma Foster

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:

  • mengambil harga dan data produk
  • memeriksa perubahan stok atau konten yang dilindungi
  • masuk ke akun Anda sendiri
  • memicu pengambilan data target tetap dari layanan lain melalui webhook

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.


Apa yang Dibangun oleh Panduan Ini

Contoh utama dalam artikel ini adalah template scraper target tetap yang sekarang mendukung dua mode aktivasi:

  • Jadwal: berjalan otomatis setiap 6 jam
  • Webhook: memicu target yang dikonfigurasi sama secara on-demand

Dalam template repo default, alur kerja ini:

  • menyelesaikan reCAPTCHA v3
  • mengambil halaman produk yang dilindungi
  • mengirimkan token melalui header x-recaptcha-token
  • mengekstrak price dan productName
  • membandingkan nilai saat ini dengan $workflow.staticData
  • mengembalikan payload peringatan atau payload tanpa perubahan

Pola yang sama dapat menjadi:

  • scraper
  • scraper detail produk
  • pemeriksa stok
  • alur masuk ke akun Anda sendiri

Kasus Penggunaan Umum

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: Contoh Kasus Penggunaan

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.


Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  1. Instance n8n
  2. Akun CapSolver dengan API key dan saldo
  3. Node CapSolver yang dikonfigurasi di n8n
  4. URL target dan bidang yang ingin Anda ekstrak
  5. Parameter captcha yang diperlukan oleh target tersebut
  6. Pemahaman jelas tentang bagaimana permintaan yang dilindungi sebenarnya dikirimkan di browser

Untuk contoh utama dalam artikel ini, target diasumsikan menggunakan reCAPTCHA, jadi nilai kunci adalah:

  • websiteURL
  • websiteKey
  • pageAction untuk reCAPTCHA v3

Penting: 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.


Cara Mengidentifikasi Parameter reCAPTCHA

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 v3
  • websiteURL: https://YOUR-TARGET-SITE.com/product-page
  • websiteKey: YOUR_SITE_KEY_HERE
  • pageAction: view_product

Ketika Anda memeriksa target reCAPTCHA, pastikan:

  • versi reCAPTCHA yang digunakan
  • apakah pageAction diperlukan
  • di mana token yang diselesaikan sebenarnya dikirimkan

Penting: 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 Utama: Scraping — Price & Product Details — CapSolver + Schedule + Webhook

Alur kerja repo Scraping — Price & Product Details — CapSolver + Schedule + Webhook sekarang mendukung dua jalur aktivasi target tetap:

  • Every 6 Hours untuk pemeriksaan berulang
  • Webhook Trigger untuk eksekusi on-demand

Kedua 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

Jalur jadwal menggunakan node-node ini:

  1. Every 6 Hours
  2. Solve reCAPTCHA v3
  3. Fetch Product Page
  4. Extract Data
  5. Compare Data
  6. Data Changed?
  7. Build Alert
  8. No Change

Jalur Webhook

Jalur webhook mengulang logika yang sama untuk target tetap yang sama:

  1. Webhook Trigger
  2. Solve reCAPTCHA v3 [Webhook]
  3. Fetch Product Page [Webhook]
  4. Extract Data [Webhook]
  5. Compare Data [Webhook]
  6. Data Changed? [Webhook]
  7. Build Alert [Webhook]
  8. No Change [Webhook]
  9. Respond to Webhook

Cara Kerja Logika Utama

1. Trigger

Gunakan 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.

2. Solve reCAPTCHA v3

Template menggunakan:

Pengaturan Nilai
Operation reCAPTCHA v3
websiteURL https://YOUR-TARGET-SITE.com/product-page
websiteKey YOUR_SITE_KEY_HERE
pageAction view_product

3. Ambil Halaman yang Dilindungi

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.

4. Ekstrak price dan productName

Node HTML mengekstrak:

Kunci Pemilih CSS
price .product-price, [data-price], .price
productName h1, .product-title

5. Bandingkan dengan Pemeriksaan Sebelumnya

Node Code menyimpan dan membandingkan nilai menggunakan:

  • $workflow.staticData.lastPrice
  • $workflow.staticData.lastChecked

Ini memungkinkan alur kerja membedakan antara:

  • pemeriksaan pertama
  • tidak ada perubahan
  • harga meningkat
  • harga menurun

6. Cabang ke Peringatan atau Tidak Ada Perubahan

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.


Mengapa Ini Benar-benar Template Scraper

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:

  • mode trigger
  • jenis captcha
  • pengaturan penyelesaian
  • permintaan yang dilindungi
  • pemilih ekstraksi
  • logika perbandingan atau output

Itulah sebabnya struktur yang sama dapat menggerakkan:

  • pengambilan data
  • ekstraksi detail produk
  • pemeriksaan stok
  • validasi halaman yang dilindungi
  • pemeriksaan login untuk akun Anda sendiri

Apa yang Akan Anda Butuhkan untuk Mengubah

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.

1. Mode Trigger

Alur kerja kasus penggunaan repo sekarang mendukung jadwal + webhook.

Gunakan:

  • jadwal untuk pemeriksaan berulang
  • webhook untuk aktivasi on-demand dari layanan lain

Jalur webhook dalam template ini adalah pemicu target tetap, bukan API publik untuk target yang disediakan pengguna.

2. Jenis CAPTCHA

Contoh pemantau harga utama menggunakan reCAPTCHA v3, tetapi target Anda mungkin menggunakan:

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • GeeTest V3 / V4
  • DataDome
  • AWS WAF
  • MTCaptcha
  • jenis tantangan lain yang didukung

Jika itu berubah, Anda akan perlu memperbarui langkah penyelesaian sesuai.

3. Pengaturan Penyelesaian CAPTCHA

Bahkan ketika dua situs menggunakan reCAPTCHA, pengaturannya masih bisa berbeda.

Anda mungkin perlu mengubah:

  • operation atau jenis tugas CapSolver
  • websiteURL
  • websiteKey
  • pageAction
  • opsi terkait invisible/enterprise
  • pengaturan tantangan spesifik situs lainnya

Template scraper mengekspos ini sebagai bidang konfigurasi placeholder karena diharapkan berubah.

4. Di Mana Token Dikirimkan

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:

  • header
  • bidang formulir
  • payload JSON
  • parameter kueri
  • cookie
  • bidang tersembunyi
  • nilai khusus aplikasi lainnya

Contoh repo ini adalah satu pola pengiriman, bukan yang universal.

5. Permintaan yang Dilindungi Itu Sendiri

Permintaan yang dilindungi mungkin membutuhkan lebih dari hanya token captcha atau tantangan.

Anda mungkin perlu menyesuaikan:

  • header
  • cookie
  • nilai CSRF
  • bidang tersembunyi
  • enkoding formulir
  • bentuk tubuh JSON
  • metode permintaan

Ini terutama umum untuk:

  • alur masuk
  • pengiriman formulir checkout atau terkunci

6. Apa yang Anda Ekstrak

Template scraper utama mengekstrak:

  • price
  • productName

Tetapi Anda dapat menggantinya dengan:

  • judul
  • status stok
  • SKU
  • deskripsi
  • nilai varian
  • teks ketersediaan
  • blok konten yang dilindungi penuh

7. Apa yang Anda Bandingkan atau Keluarkan

Kode pemantau harga saat ini membandingkan nilai numerik, tetapi pola yang sama dapat disesuaikan untuk:

  • perubahan harga
  • perubahan stok
  • keberhasilan login
  • keberhasilan pendaftaran
  • perbedaan konten
  • status kesehatan situs
  • ekspor data mentah tanpa perbandingan

Impor Alur Kerja Ini

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.

Klik untuk memperluas JSON alur kerja
json Copy
{
  "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"
}
}

Uji Itu

Setelah Anda mengkonfigurasi placeholder dan mengaktifkan alur kerja, aktifkan jalur webhook:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/price-monitor \
  -H "Content-Type: application/json" \
  -d '{}'

Respons yang diharapkan (pemeriksaan pertama):

json Copy
{
  "status": "tidak ada_perubahan",
  "currentPrice": "$29.99",
  "checkedAt": "2026-03-11T08:00:00.000Z"
}

Respons yang diharapkan (harga berubah):

json Copy
{
  "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.


Masalah Umum

Token Diselesaikan, Tapi Masih Diblokir

Jika CapSolver mengembalikan token tetapi situs tetap memblokir permintaan, masalahnya sering kali bukan karena penyelesaian token itu sendiri. Penyebab umum:

  • jenis captcha yang salah
  • pengaturan penyelesaian yang salah
  • pageAction yang salah
  • token dikirim ke tempat yang salah
  • kuki, header, atau bidang tersembunyi yang hilang

Situs Menggunakan Jenis Tantangan Berbeda

Jika 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:

  • konfigurasi node CapSolver
  • parameter tantangan yang diharapkan
  • permintaan terlindungi yang mengirim token

Selector Mengembalikan Nol

Jika node HTML tidak mengekstrak bidang yang Anda harapkan:

  • periksa apakah Anda benar-benar menerima halaman terlindungi
  • konfirmasi selector terhadap HTML yang dikembalikan
  • pastikan data hadir dalam respons mentah dan bukan hanya setelah rendering klien

Webhook Tidak Berfungsi

Templat repo diimpor sebagai tidak aktif. Hingga Anda:

  1. mengkonfigurasi placeholder
  2. memilih kredensial
  3. mengaktifkan alur kerja

jalur webhook tidak akan aktif.


Praktik Terbaik

  1. Gunakan token segera setelah diselesaikan.
  2. Periksa permintaan browser yang tepat sebelum menyalinnya ke n8n.
  3. Anggap setiap target mungkin membutuhkan pengaturan penyelesaian yang berbeda.
  4. Anggap setiap target mungkin membutuhkan logika pengiriman yang berbeda.
  5. Verifikasi respons terlindungi sebelum memperbaiki selector.
  6. Anggap templat repo sebagai titik awal, bukan penempatan universal.
  7. Pertahankan templat webhook target tetap hingga Anda memiliki alasan untuk mengekspos lebih banyak.
  8. Uji siklus lengkap solve -> submit -> ekstrak, bukan hanya langkah solve.
  9. Tambahkan node pemberitahuan atau penyimpanan di bawah 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!


Kesimpulan

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:

  • pengambilan data atau ekstraksi
  • pemantauan produk
  • pemeriksaan stok
  • pengambilan konten yang dilindungi

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.


Pertanyaan yang Sering Diajukan

Bisakah saya menggunakan ini untuk masuk ke akun saya sendiri?

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.

Apa yang terjadi jika situs menggunakan jenis tantangan berbeda?

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 mana saya harus mengirim token?

Di tempat yang diharapkan situs target. Itu bisa jadi:

  • header
  • isi formulir
  • payload JSON
  • parameter query
  • kuki
  • bidang tersembunyi

Templat pemantau harga menggunakan header. Situs lain akan berbeda.

Apakah saya perlu mengubah pengaturan CapSolver untuk setiap situs?

Biasanya ya. Bahkan situs yang menggunakan keluarga captcha yang sama bisa membutuhkan websiteURL, websiteKey, pageAction, pengaturan tidak terlihat, atau opsi tugas lainnya yang berbeda.

Bisakah saya mengambil sesuatu selain harga?

Ya. Ganti selector dan logika output sesuai kebutuhan Anda, seperti stok, judul, SKU, deskripsi, konten terlindungi, status login, atau sinyal kesehatan situs.

Bagaimana cara memastikan apakah payload permintaan atau selector salah?

Mulai dengan memeriksa respons terlindungi yang dikembalikan oleh node HTTP Request.

  • Jika respons masih diblokir atau tidak lengkap, bentuk permintaan kemungkinan salah.
  • Jika respons benar tetapi ekstraksi gagal, selector atau logika parsing kemungkinan salah.

Debug alur kerja dalam urutan ini: selesaikan -> kirim -> periksa respons -> ekstrak.

Lihat Lebih Banyak

n8nMar 09, 2026

Cara Menyelesaikan reCAPTCHA v2/v3 Menggunakan CapSolver dan n8n

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.

Emma Foster
Emma Foster
Apr 22, 2026

Terbaik AI untuk Menyelesaikan Teka-Teki Gambar: Alat dan Strategi Teratas untuk 2026

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

Daftar Isi

Emma Foster
Emma Foster
web scrapingApr 22, 2026

Arsitektur Pengambilan Data Web Rust untuk Ekstraksi Data yang Dapat Diskalakan

Pelajari arsitektur pengambilan data web Rust yang dapat diskalakan dengan reqwest, scraper, pengambilan data asinkron, pengambilan data browser tanpa tampilan, rotasi proxy, dan penanganan CAPTCHA yang sesuai aturan.

Emma Foster
Emma Foster
Apr 22, 2026

Search API vs Rantai Pasok Pengetahuan: Panduan Infrastruktur Data Kecerdasan Buatan

Pelajari bagaimana alat API pencarian, rantai pasok pengetahuan, alur kerja API SERP, dan pipa data AI membentuk infrastruktur data web modern untuk AI.

Emma Foster
Emma Foster
Blog
All