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 Mengatasi Cloudflare Turnstile Menggunakan CapSolver dan n8n
Mar09, 2026

Cara Mengatasi Cloudflare Turnstile Menggunakan CapSolver dan n8n

Emma Foster

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:

  • API pemecah Cloudflare Turnstile

Alur kerja penggunaan langsung — CapSolver disematkan sebagai langkah di dalam otomatisasi yang lebih besar:

  • Scraper harga & produk yang memecahkan Turnstile, mengambil halaman yang dilindungi, dan memberi tahu tentang perubahan harga
  • Otomatisasi login akun yang memecahkan Turnstile sebelum mengirimkan kredensial

Apa itu Cloudflare Turnstile?

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.


Prasyarat

Sebelum memulai, pastikan Anda memiliki yang berikut:

  1. Instans n8n — Baik self-hosted atau n8n Cloud
  2. Akun CapSolver — Daftar di sini dan dapatkan kunci API Anda
  3. Node CapSolver n8n — Sudah tersedia sebagai node resmi di n8n (tidak perlu instalasi)
  4. Ekstensi browser CapSolver (opsional tetapi direkomendasikan) — Untuk mengidentifikasi parameter captcha di situs web target

Penting: Pastikan Anda memiliki saldo yang cukup di akun CapSolver Anda. Tugas pemecahan Turnstile mengonsumsi kredit berdasarkan penggunaan.


Menyiapkan CapSolver di n8n

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.

Langkah 1: Buka Halaman Kredensial

Buka instans n8n Anda dan navigasikan ke Pengaturan (Settings) → Kredensial (Credentials). Anda akan melihat semua kredensial yang telah Anda konfigurasi di sini.

Halaman kredensial n8n menunjukkan akun CapSolver

Langkah 2: Buat Kredensial CapSolver

  1. Klik Buat kredensial (Create credential) (kanan atas)
  2. Cari "CapSolver" dan pilih CapSolver API
  3. Masukkan Kunci API (API Key) Anda — salin langsung dari Dasbor CapSolver
  4. Biarkan Domain Permintaan HTTP yang Diizinkan (Allowed HTTP Request Domains) diatur ke Semua (All) (default)
  5. Klik Simpan (Save)

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

Konfigurasi kredensial CapSolver dengan uji koneksi yang berhasil

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: API Pemecah Cloudflare Turnstile

Alur kerja ini membuat endpoint API POST yang menerima parameter Turnstile dan mengembalikan token yang telah dipecahkan.

Cloudflare Turnstile

Cara Kerjanya

Alur kerja terdiri dari empat node:

  1. Webhook — Menerima permintaan POST masuk dengan parameter Turnstile
  2. Cloudflare Turnstile — Mengirim tantangan ke CapSolver dan menunggu solusi
  3. CapSolver Error? — Node IF yang bercabang apakah pemecahan gagal ($json.error tidak kosong)
  4. Respond to Webhook — Mengembalikan solusi jika berhasil, atau {"error": "..."} jika gagal

Konfigurasi Node

1. Node Webhook

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

2. Node CapSolver Cloudflare 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.

3. Node CapSolver Error? (IF)

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.

4. Node Respond to Webhook

Cabang Sukses (Success branch) (output false dari CapSolver Error?):

Pengaturan Nilai
Tanggapi Dengan JSON
Badan Respons ={{ JSON.stringify($json.data) }}

Uji Coba

Kirim permintaan POST ke endpoint webhook Anda:

bash Copy
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:

json Copy
{
  "taskId": "abc123...",
  "solution": {
    "token": "0.XXXXXXXXXXXXXXXX..."
  },
  "status": "ready"
}

Impor Alur Kerja Ini

Salin JSON di bawah ini dan impor ke n8n melalui Menu → Impor dari JSON (Import from JSON):

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

Referensi Parameter API

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 websiteURL dan websiteKey dengan 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: Mengirim Token Turnstile ke Situs Web

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:

  1. Pecahkan tantangan → Dapatkan token dari CapSolver
  2. Kirim token → Kirimkan ke situs web target melalui Permintaan HTTP (biasanya sebagai bidang formulir cf-turnstile-response)
  3. Verifikasi respons → Periksa apakah situs web menerima token
  4. Proses hasilnya → Ekstrak data yang Anda butuhkan

Contoh: Memecahkan & Mengirim Turnstile

Contoh: https://contoh.com/ — Situs web yang dilindungi Turnstile

Alur Kerja

Copy
Pemicu Manual → CapSolver Turnstile → Permintaan POST HTTP → IF (periksa keberhasilan) → Edit Bidang (ekstrak data)

Cara Kerjanya

  1. Pemicu Manual (Manual Trigger) — Memulai alur kerja secara manual (klik "Jalankan alur kerja"). Anda dapat menggantinya dengan pemicu apa pun — Webhook, Jadwal, Acara Aplikasi, dll.
  2. CapSolver Cloudflare Turnstile — Memecahkan tantangan Turnstile:
    • Operasi: Cloudflare Turnstile
    • URL Situs Web: https://contoh.com/login
    • Kunci Situs Web: 0x4AAAAAAA... (temukan dengan memeriksa sumber halaman — lihat Cara Mengidentifikasi Parameter Turnstile)
  3. Permintaan POST HTTP (HTTP POST Request) — Mengirimkan token yang telah dipecahkan ke situs web target:
    • Token dikirim dalam bidang formulir cf-turnstile-response
    • Sertakan bidang formulir lain yang diharapkan situs (misalnya, username, password)
    • Inilah yang dilakukan browser saat Anda mengirimkan formulir setelah Turnstile memvalidasi Anda
  4. Node IF (IF Node) — Memeriksa apakah respons menunjukkan keberhasilan (misalnya, pengalihan, pesan keberhasilan, atau bidang JSON spesifik)
  5. Edit Bidang (Edit Fields) — Mengekstrak data yang Anda butuhkan dari respons. Dalam skenario nyata, di sinilah Anda akan mengurai HTML menggunakan node HTML untuk menarik elemen spesifik (misalnya, data pengguna, daftar produk, konten dasbor) dan memetakannya ke bidang output Anda.

Konsep kunci: Setiap situs web menangani pengiriman token secara berbeda. Dalam contoh ini, token masuk ke bidang cf-turnstile-response.


Alur Kerja: Contoh Kasus Penggunaan

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

Contoh 1: Scraping

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:

Copy
Setiap 6 Jam → Pecahkan Captcha → Ambil Halaman Produk → Ekstrak Data
  → Bandingkan Data → Data Berubah? → Buat Peringatan / Tidak Ada Perubahan

Perilaku utama:

  • Token dikirim sebagai header cf-turnstile-response (sesuaikan dengan format yang diharapkan situs Anda — beberapa situs mungkin menggunakan nama bidang yang berbeda)
  • Node HTML mengekstrak harga dan nama produk melalui selektor CSS (.product-price, h1)
  • $workflow.staticData.lastPrice mempertahankan harga sebelumnya di seluruh eksekusi
  • Perbandingan harga mendeteksi penurunan (dropped) (tingkat keparahan: deal) dan peningkatan (increased) (tingkat keparahan: info)
Klik untuk memperluas JSON alur kerja lengkap (17 node)
json Copy
{
  "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"
  }
}

Contoh 2: Login Akun

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:

Copy
Setiap 24 Jam → Atur Konfigurasi Login → Pecahkan Captcha → Kirim Login
  → Login Berhasil? → Tandai Login Berhasil / Tandai Login Gagal

Perilaku utama:

  • Default ke Cloudflare Turnstile — ubah Operasi (Operation) di node Pecahkan Captcha untuk jenis captcha lainnya.
  • Parameter badan di-hardcode: email, password, dan cf-turnstile-response (edit node Kirim Login secara langsung agar sesuai dengan nama bidang situs Anda).
  • Pemeriksaan Login Berhasil? (Login Successful?) mengevaluasi statusCode < 400 dan keberadaan successMarker yang dapat dikonfigurasi di badan respons.
  • Jalur Webhook menggunakan Atur Konfigurasi Login [Webhook] (Set Login Config [Webhook]) dengan nilai placeholder yang di-hardcode yang sama — edit node tersebut untuk mengkonfigurasi jalur webhook sesuai permintaan.
  • Jalur webhook mengembalikan hasilnya sebagai JSON melalui Tanggapi Webhook (Respond to Webhook).
Klik untuk memperluas JSON alur kerja lengkap (15 node)
json Copy
{
  "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"
  }
}

Kesimpulan

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:

  • Endpoint API pemecah untuk Cloudflare Turnstile menggunakan alur kerja berbasis webhook.
  • Contoh kasus penggunaan — scraping dan login akun — menunjukkan cara mengirimkan token yang telah dipecahkan dan memproses data yang dilindungi.
  • Cara mengidentifikasi parameter Turnstile dengan memeriksa sumber halaman.
  • Praktik terbaik untuk penanganan token, manajemen kesalahan, dan penggunaan produksi.

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!

Spanduk kode bonus CapSolver

Pertanyaan yang Sering Diajukan

Apa itu Cloudflare Turnstile?

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.

Berapa biaya untuk memecahkan tantangan Turnstile?

Harga bervariasi berdasarkan penggunaan. Periksa halaman harga CapSolver untuk tarif Turnstile saat ini.

Berapa lama waktu yang dibutuhkan untuk memecahkan tantangan Turnstile?

Tantangan Turnstile biasanya diselesaikan dalam beberapa detik karena tidak ada tantangan gambar yang terlibat.

Bisakah saya menggunakan alur kerja ini dengan n8n Cloud?

Ya! Alur kerja ini berfungsi dengan n8n self-hosted dan n8n Cloud. Node CapSolver sudah tersedia sebagai integrasi resmi — cukup tambahkan kredensial API Anda.

Bagaimana cara menemukan kunci situs Turnstile untuk situs web?

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.

CapSolver mengembalikan token tetapi situs web masih menolaknya — mengapa?

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.

Lihat Lebih Banyak

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
Web ScrapingFeb 17, 2026

Cara menyelesaikan Captcha di Nanobot dengan CapSolver

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

Daftar Isi

Anh Tuan
Anh Tuan
Web ScrapingFeb 10, 2026

Data sebagai Layanan (DaaS): Apa Itu dan Mengapa Penting pada 2026

Pahami Data sebagai Layanan (DaaS) pada 2026. Eksplor manfaatnya, kasus penggunaan, dan bagaimana DaaS mengubah bisnis dengan wawasan real-time dan skalabilitas.

Anh Tuan
Anh Tuan
Web ScrapingFeb 03, 2026

Cara Menyelesaikan Captcha di RoxyBrowser dengan Integrasi CapSolver

Mengintegrasikan CapSolver dengan RoxyBrowser untuk mengotomatisasi tugas browser dan menghindari reCAPTCHA, Turnstile, dan CAPTCHA lainnya.

Ethan Collins
Ethan Collins
Blog
Web Scraping