
Emma Foster
Machine Learning Engineer

Cloudflare Turnstile dengan cepat menjadi alternatif CAPTCHA pilihan untuk situs web modern. Tidak seperti CAPTCHA tradisional yang memaksa pengguna untuk memecahkan teka-teki gambar, Turnstile berjalan diam-diam di latar belakang — membuatnya lebih sulit dideteksi dan dilewati dengan alat otomatisasi standar.
Bagaimana jika Anda bisa menyelesaikan Turnstile secara otomatis di dalam alur kerja n8n Anda — baik Anda sedang membangun API pemecah yang dapat digunakan kembali, melakukan scraping situs yang dilindungi captcha, atau mengotomatiskan formulir login — semuanya tanpa menulis satu baris kode tradisional pun?
Dalam panduan ini, Anda akan belajar cara menggabungkan n8n (alat otomatisasi alur kerja visual) dengan CapSolver (layanan pemecah captcha bertenaga AI) untuk menyelesaikan tantangan Cloudflare Turnstile sesuai permintaan — baik sebagai endpoint API mandiri atau sebagai langkah di dalam alur kerja otomatisasi apa pun.
Apa yang akan Anda bangun:
API Pemecah — endpoint yang dapat digunakan kembali yang dapat dipanggil oleh alat Anda yang lain:
Alur kerja penggunaan langsung — CapSolver disematkan sebagai langkah di dalam otomatisasi yang lebih besar:
Cloudflare Turnstile adalah alternatif CAPTCHA yang memverifikasi pengunjung secara otomatis menggunakan sinyal browser — tanpa teka-teki, tanpa kotak centang. Ini muncul sebagai widget kecil yang disematkan dalam formulir (login, pendaftaran, checkout) dan hadir dalam tiga mode: Terkelola (Managed), Non-Interaktif (Non-Interactive), dan Tidak Terlihat (Invisible). Dari perspektif pemecahan, mode tidak masalah — Anda selalu membutuhkan dua parameter yang sama: websiteURL dan websiteKey.

Bukan sama dengan Cloudflare Challenge. Jika Anda melihat layar penuh "Melakukan verifikasi keamanan...", itu adalah Cloudflare Challenge, bukan Turnstile — ini memerlukan pemecah yang berbeda.
Sebelum memulai, pastikan Anda memiliki yang berikut:
Penting: Pastikan Anda memiliki saldo yang cukup di akun CapSolver Anda. Tugas pemecahan Turnstile mengonsumsi kredit berdasarkan penggunaan.
CapSolver tersedia sebagai integrasi resmi di n8n — tidak diperlukan instalasi node komunitas. Anda dapat menemukannya langsung di panel node saat membangun alur kerja Anda.
Karena ini adalah integrasi resmi, Anda perlu membuat kredensial di n8n agar node CapSolver dapat mengautentikasi dengan akun Anda.
Buka instans n8n Anda dan navigasikan ke Pengaturan (Settings) → Kredensial (Credentials). Anda akan melihat semua kredensial yang telah Anda konfigurasi di sini.

Semua (All) (default)n8n akan secara otomatis menguji koneksi. Anda akan melihat spanduk hijau "Koneksi berhasil diuji (Connection tested successfully)" yang mengonfirmasi bahwa kunci API Anda valid.

Penting: Setiap node CapSolver di alur kerja Anda akan merujuk kredensial ini. Anda hanya perlu membuatnya sekali — semua alur kerja pemecah Anda akan berbagi kredensial yang sama.
Sekarang Anda siap untuk membangun alur kerja pemecah Turnstile Anda!
Alur kerja ini membuat endpoint API POST yang menerima parameter Turnstile dan mengembalikan token yang telah dipecahkan.

Alur kerja terdiri dari empat node:
$json.error tidak kosong){"error": "..."} jika gagal| Pengaturan | Nilai |
|---|---|
| Metode HTTP | POST |
| Jalur | solver-turnstile |
| Tanggapi | Node Respons (Response Node) |
Ini membuat endpoint di: https://instans-n8n-anda.com/webhook/solver-turnstile
| Parameter | Nilai | Deskripsi |
|---|---|---|
| Operasi | Cloudflare Turnstile |
Harus diatur ke Cloudflare Turnstile |
| Tipe | AntiTurnstileTaskProxyLess |
Tipe tugas ini tidak memerlukan proxy |
| URL Situs Web | {{ $json.body.websiteURL }} |
URL halaman dengan widget Turnstile |
| Kunci Situs Web | {{ $json.body.websiteKey }} |
Kunci situs Turnstile |
| metadata.action | (Opsional) | Beberapa situs memerlukan string tindakan spesifik untuk tantangan Turnstile |
| metadata.cdata | (Opsional) | Data kustom yang beberapa situs berikan ke widget Turnstile untuk verifikasi |
Beberapa situs juga memerlukan metadata.action dan/atau metadata.cdata — Anda dapat menambahkannya di bawah bagian Opsional (Optional) di node. Juga pilih kredensial CapSolver Anda di node ini.
| Pengaturan | Nilai |
|---|---|
| Kondisi | ={{ $json.error }} tidak kosong |
| Cabang True | Mengarahkan ke node Error Respond to Webhook |
| Cabang False | Mengarahkan ke node Success Respond to Webhook |
Ini membuat jalur kesalahan eksplisit di kanvas. Node CapSolver melanjutkan jika terjadi kesalahan (onError: continueRegularOutput), sehingga kegagalan tiba di sini sebagai { "error": "..." } daripada menghentikan alur kerja.
Cabang Sukses (Success branch) (output false dari CapSolver Error?):
| Pengaturan | Nilai |
|---|---|
| Tanggapi Dengan | JSON |
| Badan Respons | ={{ JSON.stringify($json.data) }} |
Kirim permintaan POST ke endpoint webhook Anda:
curl -X POST https://instans-n8n-anda.com/webhook/solver-turnstile \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://contoh.com/login",
"websiteKey": "0x4AAAAAAADV8V8V8V8V8V8V"
}'
Respons yang Diharapkan:
{
"taskId": "abc123...",
"solution": {
"token": "0.XXXXXXXXXXXXXXXX..."
},
"status": "ready"
}
Salin JSON di bawah ini dan impor ke n8n melalui Menu → Impor dari JSON (Import from JSON):
{
"nodes": [
{
"parameters": {
"content": "## Turnstile — API Pemecah\n\n### Cara kerjanya\n- Dipicu oleh webhook\n- CapSolver: Cloudflare Turnstile\n- Cabang kondisional\n- Tanggapi webhook\n- Tanggapi webhook\n\n### Pengaturan\n- Tambahkan kunci API **CapSolver** Anda di Pengaturan → Kredensial\n- Konfigurasi nilai placeholder\n- Aktifkan alur kerja",
"height": 448,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-800,
-176
],
"id": "5ffd9cef-8202-4382-b878-6c99193e85c9",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Menerima dan Memproses Permintaan Pemecah\n\nMenangani permintaan pemecah masuk dan memprosesnya melalui Cloudflare Turnstile.",
"height": 336,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-240,
-176
],
"id": "6ad0812b-7141-41e4-96d6-e72e08a24405",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Mengevaluasi Respons Pemecah\n\nMemeriksa kesalahan dalam respons pemecah dan mengarahkan alur yang sesuai.",
"height": 336,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
352,
-176
],
"id": "8839e65a-8735-4135-9b0f-07ac081ebd70",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Tanggapi Webhook\n\nMengirim respons kembali ke webhook berdasarkan keberhasilan atau kegagalan pemecah.",
"height": 528,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
656,
-256
],
"id": "2fec67ea-a216-4717-8336-2aa060c352ab",
"name": "Sticky Note3"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-turnstile",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-192,
0
],
"id": "137be4f0-1762-4f0c-b993-c512d27e35de",
"name": "Receive Solver Request",
"webhookId": "901bdfa1-308c-4145-87fb-9c1958914751"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
0
],
"id": "954ff1f0-d5de-4468-b0d1-fbce03676676",
"name": "Cloudflare Turnstile",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "capsolver-err-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
400,
0
],
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "CapSolver Error?"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
704,
-64
],
"id": "e1f2a3b4-c5d6-7890-abcd-123456789012",
"name": "Respond to Webhook (Error)"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
704,
112
],
"id": "db264e2b-48ce-4887-9b2b-2b8077993c30",
"name": "Respond to Webhook"
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "Cloudflare Turnstile",
"type": "main",
"index": 0
}
]
]
},
"Cloudflare Turnstile": {
"main": [
[
{
"node": "CapSolver Error?",
"type": "main",
"index": 0
}
]
]
},
"CapSolver Error?": {
"main": [
[
{
"node": "Respond to Webhook (Error)",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
Endpoint API pemecah Turnstile menerima parameter berikut:
| Parameter | Wajib | Deskripsi |
|---|---|---|
websiteURL |
Ya | URL halaman yang menghosting widget Turnstile |
websiteKey |
Ya | Kunci situs Turnstile |
metadata.action |
Tidak | String tindakan yang diperlukan oleh beberapa situs untuk tantangan Turnstile |
metadata.cdata |
Tidak | Data kustom yang diteruskan oleh beberapa situs ke widget Turnstile untuk verifikasi |
Tip: Anda dapat mengidentifikasi
websiteURLdanwebsiteKeydengan memeriksa sumber halaman atau menggunakan ekstensi browser CapSolver.
Dibandingkan dengan reCAPTCHA, Turnstile lebih sederhana — Anda hanya memerlukan dua parameter wajib. Beberapa situs mungkin juga memerlukan bidang opsional metadata.action atau metadata.cdata — tambahkan ini di bagian Opsional (Optional) node jika token tidak diterima.
Alur kerja API di atas menunjukkan cara mendapatkan token Turnstile yang telah dipecahkan. Tapi apa yang sebenarnya Anda lakukan dengannya?
Dalam otomatisasi dunia nyata, memecahkan tantangan hanyalah setengah dari pekerjaan. Anda perlu mengirimkan token ke situs web target — persis seperti yang akan dilakukan browser — untuk membuka data atau tindakan di balik perlindungan Turnstile.
Berikut adalah pola umumnya:
cf-turnstile-response)Contoh: https://contoh.com/ — Situs web yang dilindungi Turnstile
Pemicu Manual → CapSolver Turnstile → Permintaan POST HTTP → IF (periksa keberhasilan) → Edit Bidang (ekstrak data)
Cloudflare Turnstilehttps://contoh.com/login0x4AAAAAAA... (temukan dengan memeriksa sumber halaman — lihat Cara Mengidentifikasi Parameter Turnstile)cf-turnstile-responseusername, password)Konsep kunci: Setiap situs web menangani pengiriman token secara berbeda. Dalam contoh ini, token masuk ke bidang
cf-turnstile-response.
API pemecah dan contoh scraping di atas menunjukkan pola inti: memecahkan Turnstile, mengirimkan token, memproses hasilnya. Alur kerja berikut memperluas pola ini ke kasus penggunaan siap produksi — masing-masing dengan pemicu ganda (jadwal + webhook), pelacakan status persisten, dan output terstruktur.
| Alur Kerja | Tujuan |
|---|---|
Scraping Turnstile — Detail Harga & Produk — CapSolver + Jadwal + Webhook |
Melakukan scraping harga dan nama produk setiap 6 jam, membandingkan dengan nilai sebelumnya yang disimpan di staticData, memberi tahu tentang perubahan |
Login Akun Turnstile — CapSolver + Jadwal + Webhook |
Masuk ke akun Anda sendiri di situs yang dilindungi captcha dengan memecahkan terlebih dahulu, lalu mengirimkan kredensial dengan token |
Alur kerja ini melakukan scraping halaman produk setiap 6 jam (jadwal) atau sesuai permintaan (webhook), mengekstrak harga menggunakan node HTML, dan membandingkannya dengan nilai yang disimpan sebelumnya.
Jalur jadwal:
Setiap 6 Jam → Pecahkan Captcha → Ambil Halaman Produk → Ekstrak Data
→ Bandingkan Data → Data Berubah? → Buat Peringatan / Tidak Ada Perubahan
Perilaku utama:
cf-turnstile-response (sesuaikan dengan format yang diharapkan situs Anda — beberapa situs mungkin menggunakan nama bidang yang berbeda).product-price, h1)$workflow.staticData.lastPrice mempertahankan harga sebelumnya di seluruh eksekusideal) dan peningkatan (increased) (tingkat keparahan: info){
"nodes": [
{
"parameters": {
"content": "## Scraping Turnstile — Detail Harga & Produk — CapSolver + Jadwal + Webhook\n\n### Cara kerjanya\n- Dipicu oleh scheduleTrigger\n- Dipicu oleh webhook\n- Mengatur: websiteURL, websiteKey\n- CapSolver: Cloudflare Turnstile\n- Permintaan GET\n- Ekstrak HTML\n- Kode kustom\n\n### Pengaturan\n- Tambahkan kunci API **CapSolver** Anda di Pengaturan → Kredensial\n- Konfigurasi nilai placeholder\n- Aktifkan alur kerja",
"height": 928,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1312,
-272
],
"id": "e7600f37-30e2-414c-8482-136e850c7767",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Pengaturan Scraping Terjadwal\n\nMemicu proses scraping setiap 6 jam dan mengkonfigurasi pengaturan target.",
"height": 288,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-160
],
"id": "b5976b58-4e25-4db2-8968-b918d51ae3db",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Eksekusi Scraping Terjadwal\n\nMemecahkan Turnstile, mengambil halaman produk, mengekstrak dan membandingkan data untuk pemicu terjadwal.",
"height": 464,
"width": 1456,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
-272
],
"id": "81ae9453-8fac-49c8-906e-f6054a1d5311",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Pengaturan Scraping Webhook\n\nMenginisialisasi proses scraping melalui pemicu webhook dan memecahkan Turnstile.",
"height": 304,
"width": 528,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
304
],
"id": "5b9d6820-6036-43d4-8d47-1c207864256e",
"name": "Sticky Note3"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
-32
],
"id": "ts-s-901",
"name": "Every 6 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "websiteURL",
"value": "https://SITUS-TARGET-ANDA.com/halaman-produk",
"type": "string"
},
{
"id": "cfg-002",
"name": "websiteKey",
"value": "KUNCI_SITUS_ANDA_DI_SINI",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-400,
-32
],
"id": "ts-s-900",
"name": "Set Target Config [Schedule]"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "ts-s-902",
"name": "Solve Turnstile",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"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": "cf-turnstile-response",
"value": "={{ $json.data.solution.token }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "ts-s-903",
"name": "Fetch Product Page"
},
{
"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": "ts-s-904",
"name": "Extract Data"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || \'Product\';\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 ? \'dropped\' : \'increased\') : \'unchanged\';\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": [
688,
0
],
"id": "ts-s-905",
"name": "Compare 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": [
864,
0
],
"id": "ts-s-906",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "alert",
"value": "=Harga {{ $json.direction }} untuk {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a2",
"name": "severity",
"value": "={{ $json.direction === \'dropped\' ? \'deal\' : \'info\' }}",
"type": "string"
},
{
"id": "a3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1152,
-192
],
"id": "ts-s-907",
"name": "Build Alert"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n1",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "n2",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
32
],
"id": "ts-s-908",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-turnstile",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-704,
432
],
"id": "ts-s-909",
"name": "Webhook Trigger",
"webhookId": "28b7ba21-7608-45c2-8552-ec91b8ce7c9b"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-368,
432
],
"id": "ts-s-910",
"name": "Solve Turnstile [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"url": "={{ $(\'Webhook Trigger\').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": "cf-turnstile-response",
"value": "={{ $json.data.solution.token }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-80,
432
],
"id": "ts-s-911",
"name": "Fetch Product Page [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": [
208,
432
],
"id": "ts-s-912",
"name": "Extract Data [Webhook]"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || \'Product\';\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 ? \'dropped\' : \'increased\') : \'unchanged\';\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": [
512,
432
],
"id": "ts-s-913",
"name": "Compare 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": [
704,
432
],
"id": "ts-s-914",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a4",
"name": "alert",
"value": "=Harga {{ $json.direction }} untuk {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a5",
"name": "severity",
"value": "={{ $json.direction === \'dropped\' ? \'deal\' : \'info\' }}",
"type": "string"
},
{
"id": "a6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
960,
240
],
"id": "ts-s-915",
"name": "Build Alert [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n4",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "n5",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
992,
496
],
"id": "ts-s-916",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1248,
384
],
"id": "ts-s-917",
"name": "Respond to Webhook"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Set Target Config [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Set Target Config [Schedule]": {
"main": [
[
{
"node": "Solve Turnstile",
"type": "main",
"index": 0
}
]
]
},
"Solve Turnstile": {
"main": [
[
{
"node": "Fetch Product Page",
"type": "main",
"index": 0
}
]
]
},
"Fetch Product Page": {
"main": [
[
{
"node": "Extract Data",
"type": "main",
"index": 0
}
]
]
},
"Extract Data": {
"main": [
[
{
"node": "Compare Data",
"type": "main",
"index": 0
}
]
]
},
"Compare Data": {
"main": [
[
{
"node": "Data Changed?",
"type": "main",
"index": 0
}
]
]
},
"Data Changed?": {
"main": [
[
{
"node": "Build Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "No Change",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Solve Turnstile [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve Turnstile [Webhook]": {
"main": [
[
{
"node": "Fetch Product Page [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Fetch Product Page [Webhook]": {
"main": [
[
{
"node": "Extract Data [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Extract Data [Webhook]": {
"main": [
[
{
"node": "Compare Data [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Compare Data [Webhook]": {
"main": [
[
{
"node": "Data Changed? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Data Changed? [Webhook]": {
"main": [
[
{
"node": "Build Alert [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "No Change [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Build Alert [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"No Change [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
Alur kerja ini mengotomatiskan login ke situs yang dilindungi captcha. Node Set Login Config memusatkan semua parameter — [Jadwal (Schedule)] untuk jalur jadwal dan [Webhook] untuk jalur webhook sesuai permintaan. Edit node konfigurasi yang sesuai untuk mengkonfigurasi setiap jalur.
Jalur jadwal:
Setiap 24 Jam → Atur Konfigurasi Login → Pecahkan Captcha → Kirim Login
→ Login Berhasil? → Tandai Login Berhasil / Tandai Login Gagal
Perilaku utama:
Operasi (Operation) di node Pecahkan Captcha untuk jenis captcha lainnya.email, password, dan cf-turnstile-response (edit node Kirim Login secara langsung agar sesuai dengan nama bidang situs Anda).statusCode < 400 dan keberadaan successMarker yang dapat dikonfigurasi di badan respons.{
"nodes": [
{
"parameters": {
"content": "## Login Akun Turnstile — CapSolver + Jadwal + Webhook\n\n### Cara kerjanya\n- Dipicu oleh scheduleTrigger\n- Dipicu oleh webhook\n- Mengatur: websiteURL, websiteKey, successMarker\n- CapSolver: Cloudflare Turnstile\n- Permintaan POST\n- Cabang kondisional\n- Mengatur: status, checkedAt\n\n### Pengaturan\n- Tambahkan kunci API **CapSolver** Anda di Pengaturan → Kredensial\n- Konfigurasi nilai placeholder\n- Aktifkan alur kerja",
"height": 768,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1168,
-128
],
"id": "887d0c97-af49-4830-99a3-8dd04a78ec10",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Proses Login Terjadwal\n\nMenangani proses login yang dipicu setiap 24 jam",
"height": 416,
"width": 1920,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-608,
-128
],
"id": "3fac5b95-ad9c-4029-ac4b-c99952659970",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Proses Login yang Dipicu Webhook\n\nMenangani proses login yang dipicu oleh webhook",
"height": 384,
"width": 2288,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-624,
336
],
"id": "08fa3f86-8373-44ab-abb1-1358cbb3f963",
"name": "Sticky Note2"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-560,
48
],
"id": "ts-l-01",
"name": "Every 24 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "l1",
"name": "websiteURL",
"value": "https://HALAMAN-LOGIN-ANDA.com",
"type": "string"
},
{
"id": "l2",
"name": "websiteKey",
"value": "KUNCI_SITUS_ANDA_DI_SINI",
"type": "string"
},
{
"id": "l3",
"name": "successMarker",
"value": "account-dashboard",
"type": "string"
},
{
"id": "l4",
"name": "userAgent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-240,
48
],
"id": "ts-l-02",
"name": "Set Login Config [Schedule]"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
256,
48
],
"id": "ts-l-03",
"name": "Solve Turnstile [Schedule]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $(\'Set Login Config [Schedule]\').item.json.websiteURL }}/login",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $(\'Set Login Config [Schedule]\').item.json.userAgent }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "email",
"value": "email-anda@contoh.com"
},
{
"name": "password",
"value": "KATA_SANDI_AKUN_ANDA"
},
{
"name": "cf-turnstile-response",
"value": "={{ $json.data.solution.token }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
576,
48
],
"id": "ts-l-04",
"name": "Submit Login [Schedule]"
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "strict"
},
"conditions": [
{
"id": "lif1",
"leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || \'\').includes($(\'Set Login Config [Schedule]\').item.json.successMarker) }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
896,
48
],
"id": "ts-l-05",
"name": "Login OK? [Schedule]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "s1",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "s2",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
-48
],
"id": "ts-l-06",
"name": "Mark Success"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "f1",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "f2",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "f3",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
128
],
"id": "ts-l-07",
"name": "Mark Failed"
},
{
"parameters": {
"httpMethod": "POST",
"path": "account-login-turnstile",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-560,
448
],
"id": "ts-l-08",
"name": "Webhook Trigger",
"webhookId": "9c7a53a4-d3ee-495b-9381-3a9425bb1b36"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
256,
448
],
"id": "ts-l-09",
"name": "Solve Turnstile [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $(\'Webhook Trigger\').item.json.body.loginActionURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $(\'Webhook Trigger\').item.json.body.userAgent || \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36\' }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "={{ $(\'Webhook Trigger\').item.json.body.usernameField || \'email\' }}",
"value": "={{ $(\'Webhook Trigger\').item.json.body.usernameValue }}"
},
{
"name": "={{ $(\'Webhook Trigger\').item.json.body.passwordField || \'password\' }}",
"value": "={{ $(\'Webhook Trigger\').item.json.body.passwordValue }}"
},
{
"name": "cf-turnstile-response",
"value": "={{ $json.data.solution.token }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
576,
448
],
"id": "ts-l-10",
"name": "Submit Login [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "strict"
},
"conditions": [
{
"id": "lif2",
"leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || \'\').includes($(\'Webhook Trigger\').item.json.body.successMarker) }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
896,
448
],
"id": "ts-l-11",
"name": "Login OK? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "ws1",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "ws2",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
352
],
"id": "ts-l-12",
"name": "Mark Success [W]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "wf1",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "wf2",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "wf3",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
544
],
"id": "ts-l-13",
"name": "Mark Failed [W]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1504,
448
],
"id": "ts-l-14",
"name": "Respond to Webhook"
}
],
"connections": {
"Every 24 Hours": {
"main": [
[
{
"node": "Set Login Config [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Set Login Config [Schedule]": {
"main": [
[
{
"node": "Solve Turnstile [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Solve Turnstile [Schedule]": {
"main": [
[
{
"node": "Submit Login [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Schedule]": {
"main": [
[
{
"node": "Login OK? [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Login OK? [Schedule]": {
"main": [
[
{
"node": "Mark Success",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Failed",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Solve Turnstile [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve Turnstile [Webhook]": {
"main": [
[
{
"node": "Submit Login [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Webhook]": {
"main": [
[
{
"node": "Login OK? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Login OK? [Webhook]": {
"main": [
[
{
"node": "Mark Success [W]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Failed [W]",
"type": "main",
"index": 0
}
]
]
},
"Mark Success [W]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Mark Failed [W]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
Anda telah belajar cara membangun API pemecah Cloudflare Turnstile dan alur kerja scraping siap produksi menggunakan n8n dan CapSolver — tanpa memerlukan pengkodean tradisional.
Dalam panduan ini, kami membahas:
Intinya: memecahkan tantangan Turnstile hanyalah setengah dari pekerjaan — Anda juga perlu mengirimkan token ke situs web target untuk membuka data yang dilindungi.
Tip: Alur kerja ini menggunakan pemicu Jadwal + Webhook, tetapi Anda dapat mengganti node pemicu dengan pemicu n8n apa pun — manual, acara aplikasi, pengiriman formulir, dll. Setelah mengambil data, gunakan node bawaan n8n untuk menyimpan hasil ke Google Sheets, database, penyimpanan cloud, atau mengirim peringatan melalui Telegram/Slack/Email.
Siap untuk memulai? Daftar untuk CapSolver dan gunakan kode bonus n8n untuk bonus tambahan 8% pada pengisian ulang pertama Anda!

Cloudflare Turnstile adalah alternatif CAPTCHA yang memverifikasi pengunjung tanpa mengharuskan mereka memecahkan teka-teki. Ini berjalan di latar belakang menggunakan sinyal browser dan analisis perilaku untuk menentukan apakah seorang pengunjung adalah manusia.
Harga bervariasi berdasarkan penggunaan. Periksa halaman harga CapSolver untuk tarif Turnstile saat ini.
Tantangan Turnstile biasanya diselesaikan dalam beberapa detik karena tidak ada tantangan gambar yang terlibat.
Ya! Alur kerja ini berfungsi dengan n8n self-hosted dan n8n Cloud. Node CapSolver sudah tersedia sebagai integrasi resmi — cukup tambahkan kredensial API Anda.
Cari data-sitekey di sumber halaman HTML atau cari turnstile.render() di JavaScript. Anda juga dapat membuka DevTools (F12) → tab Jaringan (Network) dan memfilter berdasarkan turnstile untuk menemukan kunci situs dalam permintaan. Untuk panduan terperinci, lihat dokumentasi CapSolver.
Beberapa hal dapat menyebabkan ini. Pertama, token kedaluwarsa dengan cepat — pastikan Anda mengirimkan token segera. Kedua, verifikasi Anda mengirim token ke tempat yang tepat: periksa permintaan jaringan aktual yang dibuat browser saat Anda mengirimkan formulir (DevTools → tab Jaringan) dan konfirmasi nama bidang (cf-turnstile-response adalah tipikal tetapi tidak universal), metode permintaan, dan endpoint semuanya cocok dengan yang telah Anda konfigurasikan di n8n. Ketiga, beberapa situs memerlukan parameter metadata.action atau metadata.cdata — gunakan ekstensi CapSolver untuk memeriksa apakah ada di antaranya yang berlaku. Jika token masih ditolak, hubungi dukungan CapSolver untuk bantuan spesifik situs.
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.

Mengotomasi penyelesaian CAPTCHA dengan Nanobot dan CapSolver. Gunakan Playwright untuk menyelesaikan reCAPTCHA dan Cloudflare secara otomatis.
