
Emma Foster
Machine Learning Engineer

Jika Anda pernah mencoba mengotomatisasi interaksi web, hampir pasti Anda pernah menemui reCAPTCHA — sistem tantangan Google yang memblokir bot dari mengakses situs web. Baik Anda sedang membangun scraper, menguji aplikasi web, atau mengotomatisasi tugas berulang, reCAPTCHA dapat menghentikan seluruh alur kerja Anda.
Bagaimana jika Anda bisa menyelesaikan reCAPTCHA secara otomatis di dalam alur kerja n8n Anda — apakah Anda sedang membangun solver API yang dapat digunakan ulang, meng-scrape situs yang dilindungi captcha, atau mengotomatisasi formulir login — semua tanpa menulis satu baris kode tradisional pun?
Dalam panduan ini, Anda akan belajar cara menggabungkan n8n (alat otomasi alur kerja visual) dengan CapSolver (layanan pemecahan captcha bertenaga AI) untuk menyelesaikan tantangan reCAPTCHA v2, v2 Invisible, dan v3 sesuai permintaan — baik sebagai endpoint API mandiri atau sebagai langkah di dalam alur kerja otomatisasi apa pun.
Apa yang akan Anda buat:
Solver API — endpoint yang dapat digunakan ulang yang dapat dipanggil oleh alat lain Anda:
Alur kerja penggunaan langsung — CapSolver tertanam sebagai langkah di dalam otomatisasi yang lebih besar:
reCAPTCHA adalah sistem deteksi bot Google yang digunakan oleh jutaan situs web. Ada tiga versi utama yang akan Anda temui:
reCAPTCHA v2 — Kotak centang ("Saya bukan robot") + tantangan gambar
reCAPTCHA v2 Invisible — Tidak ada kotak centang yang terlihat, aktif secara otomatis di latar belakang
reCAPTCHA v3 — Sepenuhnya tidak terlihat, memberikan skor (0.0–1.0) berdasarkan perilaku
Memahami versi mana yang digunakan sebuah situs sangat penting — masing-masing memerlukan parameter yang sedikit berbeda saat menyelesaikan.
Sebelum memulai, pastikan Anda memiliki hal-hal berikut:
Penting: Pastikan saldo akun CapSolver Anda cukup. Tugas penyelesaian reCAPTCHA mengonsumsi kredit berdasarkan jenis captcha.
CapSolver tersedia sebagai integrasi resmi di n8n — tidak perlu 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 instansi n8n Anda dan navigasikan ke Settings → Credentials. Anda akan melihat semua kredensial yang sudah dikonfigurasi di sini.

All (default)n8n akan secara otomatis menguji koneksi. Anda akan melihat banner hijau "Connection tested successfully" yang mengonfirmasi kunci API Anda valid.

Penting: Setiap node CapSolver dalam alur kerja Anda akan merujuk ke kredensial ini. Anda hanya perlu membuatnya sekali — semua alur kerja solver Anda akan menggunakan kredensial yang sama.
Sekarang Anda siap membangun alur kerja penyelesai reCAPTCHA Anda!
Sebelum Anda dapat menyelesaikan reCAPTCHA, Anda perlu mengetahui parameternya — khususnya websiteURL dan websiteKey (juga disebut site key). Cara termudah untuk menemukannya adalah menggunakan Ekstensi Browser CapSolver.
Unduh dan pasang ekstensi CapSolver dari Chrome Web Store atau Firefox Add-ons.

Dengan panel detektor terbuka, interaksikan halaman untuk memicu reCAPTCHA. Ekstensi akan secara otomatis mendeteksi dan menampilkan semua parameter terkait:
recaptcha.net)
Tips: Ekstensi menghasilkan output JSON yang menunjukkan dengan tepat bagaimana memformat parameter ini untuk permintaan penyelesaian Anda. Ini menghemat waktu Anda dari harus memeriksa sumber halaman secara manual.
Untuk panduan detail tentang mengidentifikasi parameter captcha, lihat dokumentasi resmi CapSolver.
Alur kerja ini membuat endpoint POST yang menerima parameter reCAPTCHA dan mengembalikan token yang sudah diselesaikan. Struktur 4-node yang sama berfungsi untuk semua jenis reCAPTCHA — cukup ubah Operation di node CapSolver.

$json.error tidak kosong){"error": "..."} jika gagal| Jenis | Operation yang dipilih | Parameter tambahan |
|---|---|---|
| v2 Standar | reCAPTCHA v2 |
— |
| v2 Invisible | reCAPTCHA v2 |
Atur Is Invisible ke true di node |
| v3 | reCAPTCHA v3 |
Tambahkan pageAction — harus sesuai dengan aksi yang dikonfigurasi situs target (misalnya, login, submit) |
Alur kerja di bawah menggunakan reCAPTCHA v2 sebagai default. Buka node CapSolver dan ubah dropdown Operation untuk mengganti jenis. Tidak perlu perubahan struktur lain.
| Pengaturan | Nilai |
|---|---|
| HTTP Method | POST |
| Path | solver-recaptcha |
| Respond | Response Node |
Ini membuat endpoint di: https://your-n8n-instance.com/webhook/solver-recaptcha
| Parameter | Nilai | Deskripsi |
|---|---|---|
| Operation | reCAPTCHA v2 |
Ubah ini ke reCAPTCHA v3 untuk v3; untuk v2 Invisible, tetap reCAPTCHA v2 dan setel Is Invisible ke true |
| Website URL | ={{ $json.body.websiteURL }} |
URL halaman dengan captcha |
| Website Key | ={{ $json.body.websiteKey }} |
Site key reCAPTCHA |
| Page Action | ={{ $json.body.pageAction || '' }} |
Diperlukan untuk v3 — harus sesuai dengan aksi yang dikonfigurasi situs |
| Is Invisible | ={{ $json.body.isInvisible || false }} |
Setel ke true untuk v2 Invisible |
| API Domain | ={{ $json.body.apiDomain || '' }} |
Opsional — domain API kustom (misalnya, recaptcha.net) |
| Enterprise Payload | ={{ $json.body.enterprisePayload || '' }} |
Opsional — payload tambahan untuk reCAPTCHA Enterprise |
| Is Session | ={{ $json.body.isSession || false }} |
Opsional — aktifkan penyelesaian berbasis sesi |
| Task Type | ={{ $json.body.taskType || 'ReCaptchaV2TaskProxyLess' }} |
Tipe tugas CapSolver — lihat referensi di bawah. Default ReCaptchaV2TaskProxyLess |
| Proxy | ={{ $json.body.proxy || '' }} |
Hanya digunakan jika tipe tugas yang dipilih membutuhkan proxy (tipe non-ProxyLess). Kosongkan atau hilangkan untuk tipe tugas ProxyLess. Format: ip:port:user:pass |
Jangan lupa pilih kredensial CapSolver Anda di node.
Referensi Tipe Tugas reCAPTCHA:
| Tipe Tugas | Proxy Diperlukan | Catatan |
|---|---|---|
ReCaptchaV2TaskProxyLess |
Tidak | Default v2 |
ReCaptchaV2Task |
Ya | v2 dengan proxy |
ReCaptchaV2EnterpriseTaskProxyLess |
Tidak | Enterprise v2, tanpa proxy |
ReCaptchaV2EnterpriseTask |
Ya | Enterprise v2, membutuhkan proxy |
ReCaptchaV3TaskProxyLess |
Tidak | Default v3 |
ReCaptchaV3Task |
Ya | v3 dengan proxy |
ReCaptchaV3EnterpriseTaskProxyLess |
Tidak | Enterprise v3, tanpa proxy |
ReCaptchaV3EnterpriseTask |
Ya | Enterprise v3, membutuhkan proxy |
Proxy: Hanya berlaku untuk tipe tugas non-
ProxyLess(misalnya,ReCaptchaV2Task,ReCaptchaV3EnterpriseTask). Saat menggunakan tipe tugasProxyLess, field proxy diabaikan — CapSolver menggunakan infrastrukturnya sendiri. Saat menggunakan tipe non-ProxyLess, Anda harus menyediakan proxy.
| Pengaturan | Nilai |
|---|---|
| Kondisi | ={{ $json.error }} tidak kosong |
| Cabang benar | Mengarah ke node Error Respond to Webhook |
| Cabang salah | Mengarah ke node Success Respond to Webhook |
Ini membuat jalur error eksplisit di canvas. Node CapSolver melanjutkan saat error (onError: continueRegularOutput), sehingga kegagalan sampai di sini sebagai { "error": "..." } daripada menghentikan alur kerja. Anda dapat menambahkan node tambahan di cabang benar (logging, peringatan, retry) tanpa mengubah jalur sukses.
Cabang sukses (output false dari CapSolver Error?):
| Pengaturan | Nilai |
|---|---|
| Respond With | JSON |
| Response Body | ={{ JSON.stringify($json.data) }} |
Kirim permintaan POST ke endpoint webhook Anda:bash curl -X POST https://your-n8n-instance.com/webhook/solver-recaptcha \ -H "Content-Type: application/json" \ -d '{ "websiteURL": "https://example.com/login", "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-", "taskType": "ReCaptchaV2TaskProxyLess" }' > Jenis tugas harus sesuai dengan Operasi node. Setiap workflow yang diterapkan dikonfigurasi untuk versi reCAPTCHA tertentu melalui bidang Operation pada node CapSolver (reCAPTCHA v2 atau reCAPTCHA v3). Hanya jenis tugas untuk versi tersebut yang valid — mengirim jenis tugas v3 ke workflow v2 (atau sebaliknya) tidak akan berhasil. Catatan: v2 Invisible menggunakan operasi reCAPTCHA v2 yang sama seperti v2 standar — perbedaannya adalah parameter isInvisible, bukan operasinya.
Untuk reCAPTCHA v3, juga tambahkan "pageAction": "login" (atau aksi apa pun yang digunakan situs) ke dalam body permintaan, dan gunakan jenis tugas v3 (misalnya, "taskType": "ReCaptchaV3TaskProxyLess").
Respons yang Diharapkan:```json
{
"taskId": "abc123...",
"solution": {
"gRecaptchaResponse": "03AGdBq24PBCb..."
},
"status": "ready"
}
Salin JSON di bawah ini dan impor ke n8n melalui **Menu** → **Import from JSON**. Kemudian ubah **Operation** di node CapSolver ke tipe reCAPTCHA yang Anda inginkan.
<details>
<summary>Klik untuk memperluas JSON alur kerja (reCAPTCHA v2 — ubah Operation untuk tipe lain)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Solver API\n\n### How it works\n\n1. A webhook receives the reCAPTCHA solver request.\n2. The request is passed to the solver node to resolve the reCAPTCHA.\n3. The system checks if the solver encountered an error.\n4. If an error occurred, a response is sent indicating the failure.\n5. If successful, a response is sent with the result.\n\n### Setup steps\n\n- [ ] Configure webhook endpoint to receive solver requests.\n- [ ] Set up CapSolver credentials if necessary.\n\n### Customization\n\nAdjust the solver node settings depending on reCAPTCHA type or difficulty.",
"width": 480,
"height": 592
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-800,
-240
],
"id": "497d295f-4668-48ff-8eaa-97773cfd1c89",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Receive request and solve\n\nHandles incoming requests and solves reCAPTCHA.",
"width": 496,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-240,
-112
],
"id": "cb4b7a54-ae67-458e-bbef-18e3f6d242bb",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Evaluate and respond\n\nChecks for errors and sends appropriate webhook responses.",
"width": 560,
"height": 432,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
-240
],
"id": "fc9430f0-b899-45ce-b5cf-de9a1b10fbe2",
"name": "Sticky Note2"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"id": "rc-api-001",
"name": "Receive Solver Request",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-192,
0
],
"webhookId": "solver-recaptcha"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"id": "rc-api-002",
"name": "Solve reCAPTCHA",
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
0
],
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
},
"continueOnFail": true
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "1",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
},
"leftValue": "={{ $json.error }}",
"rightValue": ""
}
]
},
"options": {}
},
"id": "rc-api-003",
"name": "CapSolver Error?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
512,
-32
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"id": "rc-api-004",
"name": "Respond to Webhook (Error)",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
880,
-128
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"id": "rc-api-005",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
880,
32
]
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "Solve reCAPTCHA",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA": {
"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
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
---
## Alur Kerja: Mengirimkan Token ke Situs Web
Sejauh ini, alur kerja API di atas menunjukkan cara **mendapatkan** token captcha yang sudah diselesaikan. Tapi apa yang sebenarnya **Anda lakukan** dengan token tersebut?
Dalam otomatisasi dunia nyata, menyelesaikan captcha hanyalah setengah dari pekerjaan. Anda perlu **mengirimkan token** ke situs web target — persis seperti yang dilakukan browser — untuk membuka data atau aksi di balik captcha tersebut.
Berikut pola umumnya:
1. **Selesaikan captcha** → Dapatkan token `gRecaptchaResponse` dari CapSolver
2. **Kirim token** → Kirim ke situs web target melalui Permintaan HTTP (biasanya sebagai field form `g-recaptcha-response` atau parameter URL)
3. **Verifikasi respons** → Periksa apakah situs web menerima token dan mengembalikan data yang diharapkan
4. **Proses hasil** → Ambil data yang Anda butuhkan
### Contoh: Menyelesaikan & Mengirim reCAPTCHA v2
**Contoh:** [example.com](https://example.com)

#### Alur Kerja Flow```
Manual Trigger → CapSolver reCAPTCHA v2 → HTTP POST Request → IF (check success) → Valid / Invalid
```#### Cara Kerjanya
1. **Pemicu Manual** — Memulai alur kerja secara manual (klik "Execute workflow"). Anda dapat menggantinya dengan pemicu apa pun — Webhook, Jadwal, Event Aplikasi, dll.
2. **CapSolver reCAPTCHA v2** — Memecahkan captcha untuk halaman demo:
- URL Situs Web: `https://example.com`
- Kunci Situs Web: `YOUR_SITE_KEY`
3. **Permintaan HTTP POST** — Mengirimkan token yang sudah dipecahkan ke URL yang sama sebagai form POST:
- Token dikirim dalam field form `g-recaptcha-response`
- Ini persis seperti yang dilakukan browser saat Anda mengklik "Submit" setelah memecahkan captcha
4. **Node IF** — Memeriksa apakah HTML respons mengandung `"recaptcha-success"`, yang berarti captcha diterima
5. **Valid / Tidak Valid** — Node IF mengarahkan ke cabang **Valid** saat berhasil (di mana Anda mengekstrak data yang dibutuhkan, misalnya dengan **node HTML** untuk daftar produk, hasil form, dll.) atau cabang **Tidak Valid** saat gagal (di mana Anda menangani kesalahan)
> **Konsep utama:** Setiap situs web menangani pengiriman token dengan cara yang berbeda. Dalam demo ini, token dimasukkan dalam field form `g-recaptcha-response` melalui POST — tetapi situs lain mungkin mengharapkannya sebagai parameter URL, dalam body JSON, atau melalui endpoint yang benar-benar berbeda. Selalu periksa pengiriman form situs yang sebenarnya (menggunakan tab Network di DevTools) untuk melihat dengan tepat bagaimana token harus dikirim.
<details>
<summary>Klik untuk memperluas JSON alur kerja</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA v2 \u2014 All Triggers\n\n### How it works\n\n1. Receives solver requests through a webhook.\n2. Processes these requests using CapSolver and returns the results.\n3. Regularly triggers checks every hour using a schedule.\n4. Executes the scheduled process and checks the status of tasks.\n5. Allows manual testing of CapSolver through a manual trigger.\n\n### Setup steps\n\n- [ ] Set up webhook credentials for 'Receive Solver Request'.\n- [ ] Configure CapSolver with necessary keys for all CapSolver nodes.\n- [ ] Assign necessary permissions for HTTP request to reCAPTCHA endpoint.\n- [ ] Review and adjust the schedule in 'Schedule Trigger'.\n- [ ] Test manual execution with 'Manual Trigger'.\n",
"width": 480,
"height": 896
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-816,
-128
],
"id": "68e8c344-ce45-4e9f-859b-ca005db7c73e",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Receive and handle requests\n\nStarts with receiving a solver request via webhook, processes it, and returns the solver result.",
"width": 800,
"height": 304,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
-128
],
"id": "c26741c7-e0e6-4a4e-9fbf-2a623df014c8",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled recurrent process\n\nInitiates the process on an hourly schedule, sets target parameters, and sends them to CapSolver.",
"width": 800,
"height": 304,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
224
],
"id": "4b879cbf-e269-4260-9596-740b95df628a",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Process and validate token\n\nPosts to the reCAPTCHA validation endpoint and checks results, branching into pass or fail paths.",
"width": 736,
"height": 464,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
656,
96
],
"id": "7c860b53-f4a7-4d0b-8537-5253eec5a043",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Manual testing process\n\nAllows manual trigger testing with CapSolver and formats the result for review.",
"width": 800,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
576
],
"id": "8936a2df-c5b5-4c63-a0d5-afd190553a57",
"name": "Sticky Note4"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solve-recaptcha-v2",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-208,
0
],
"id": "11111111-1111-1111-1111-111111111101",
"name": "Receive Solver Request",
"webhookId": "a1b2c3d4-e5f6-7890-abcd-ef1234567801",
"onError": "continueRegularOutput"
},
{
"parameters": {
"type": "={{ $json.body.taskType || 'ReCaptchaV2TaskProxyLess' }}",
"proxy": "={{ $json.body.proxy || '' }}",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {
"pageAction": "={{ $json.body.pageAction || '' }}",
"isInvisible": "={{ $json.body.isInvisible || false }}",
"apiDomain": "={{ $json.body.apiDomain || '' }}",
"enterprisePayload": "={{ $json.body.enterprisePayload || '' }}",
"isSession": "={{ $json.body.isSession || false }}"
}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
0
],
"id": "11111111-1111-1111-1111-111111111102",
"name": "CapSolver [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
400,
0
],
"id": "11111111-1111-1111-1111-111111111103",
"name": "Return Solver Result"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-208,
352
],
"id": "11111111-1111-1111-1111-111111111104",
"name": "Schedule Trigger (Every 1h)"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sa-001",
"name": "websiteURL",
"value": "https://www.google.com/recaptcha/api2/demo",
"type": "string"
},
{
"id": "sa-002",
"name": "websiteKey",
"value": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
112,
352
],
"id": "11111111-1111-1111-1111-111111111105",
"name": "Set Target Params"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
400,
352
],
"id": "11111111-1111-1111-1111-111111111106",
"name": "CapSolver [Schedule]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://www.google.com/recaptcha/api2/demo",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"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"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
704,
352
],
"id": "11111111-1111-1111-1111-111111111107",
"name": "Submit Token"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-001",
"leftValue": "={{ $json.data }}",
"rightValue": "recaptcha-success",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1008,
352
],
"id": "11111111-1111-1111-1111-111111111108",
"name": "Check Result"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sp-001",
"name": "status",
"value": "passed",
"type": "string"
},
{
"id": "sp-002",
"name": "message",
"value": "reCAPTCHA v2 monitor passed successfully",
"type": "string"
},
{
"id": "sp-003",
"name": "timestamp",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1248,
224
],
"id": "11111111-1111-1111-1111-111111111109",
"name": "Monitor Passed"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sf-001",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "sf-002",
"name": "message",
"value": "reCAPTCHA v2 monitor FAILED \u2014 token rejected",
"type": "string"
},
{
"id": "sf-003",
"name": "timestamp",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1248,
384
],
"id": "11111111-1111-1111-1111-111111111110",
"name": "Monitor Failed"
},
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-208,
688
],
"id": "11111111-1111-1111-1111-111111111111",
"name": "Manual Trigger (Test)"
},
{
"parameters": {
"websiteURL": "https://www.google.com/recaptcha/api2/demo",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
688
],
"id": "11111111-1111-1111-1111-111111111112",
"name": "CapSolver [Manual]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "mr-001",
"name": "token",
"value": "={{ $json.data.solution.gRecaptchaResponse }}",
"type": "string"
},
{
"id": "mr-002",
"name": "taskId",
"value": "={{ $json.data.taskId }}",
"type": "string"
},
{
"id": "mr-003",
"name": "status",
"value": "solved",
"type": "string"
},
{
"id": "mr-004",
"name": "solvedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
400,
688
],
"id": "11111111-1111-1111-1111-111111111113",
"name": "Format Result"
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "CapSolver [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Webhook]": {
"main": [
[
{
"node": "Return Solver Result",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger (Every 1h)": {
"main": [
[
{
"node": "Set Target Params",
"type": "main",
"index": 0
}
]
]
},
"Set Target Params": {
"main": [
[
{
"node": "CapSolver [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Schedule]": {
"main": [
[
{
"node": "Submit Token",
"type": "main",
"index": 0
}
]
]
},
"Submit Token": {
"main": [
[
{
"node": "Check Result",
"type": "main",
"index": 0
}
]
]
},
"Check Result": {
"main": [
[
{
"node": "Monitor Passed",
"type": "main",
"index": 0
}
],
[
{
"node": "Monitor Failed",
"type": "main",
"index": 0
}
]
]
},
"Manual Trigger (Test)": {
"main": [
[
{
"node": "CapSolver [Manual]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Manual]": {
"main": [
[
{
"node": "Format Result",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
> **Menyesuaikan untuk jenis reCAPTCHA lain:** Pola yang sama ini juga berlaku untuk **v2 Invisible** dan **v3**. Untuk v2 Invisible, atur `isInvisible: true` di node CapSolver. Untuk v3, ubah Operasi menjadi `reCAPTCHA v3` dan tambahkan parameter `pageAction`. Langkah pengiriman HTTP Request akan berbeda tiap situs — selalu periksa pengiriman formulir sebenarnya di DevTools.
---
## Alur Kerja: Contoh Kasus Penggunaan
API solver dan contoh scraping di atas menunjukkan pola inti: menyelesaikan captcha, mengirim token, memproses hasil. 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 |
|---|---|
| `reCAPTCHA Scraping — Harga & Detail Produk — CapSolver + Jadwal + Webhook` | Mengambil harga dan nama produk setiap 6 jam, membandingkan dengan nilai sebelumnya yang disimpan di `staticData`, memberi peringatan jika ada perubahan |
| `reCAPTCHA Login Akun — CapSolver + Jadwal + Webhook` | Masuk ke akun Anda sendiri di situs yang dilindungi captcha dengan menyelesaikan captcha terlebih dahulu, lalu mengirimkan kredensial dengan token |
### Contoh 1: Scraping — Harga & Detail Produk
Alur kerja ini mengambil halaman produk setiap 6 jam (jadwal) atau sesuai permintaan (webhook), mengekstrak harga menggunakan node HTML, dan membandingkannya dengan nilai yang disimpan sebelumnya.
**Jalur jadwal:**```
Every 6 Hours → Solve reCAPTCHA v3 → Fetch Product Page → Extract Data
→ Compare Data → Data Changed? → Build Alert / No Change
```> **Penanganan kesalahan:** Jika CapSolver gagal, eksekusi akan berhenti dan ditandai sebagai gagal di n8n. Periksa **Executions** untuk melihat kesalahan, atau konfigurasikan [Error Workflow](https://docs.n8n.io/flow-logic/error-handling/) n8n untuk mendapatkan pemberitahuan secara otomatis.
Perilaku utama:
- Menggunakan **reCAPTCHA v3** dengan parameter `pageAction` (dapat dikonfigurasi)
- Token dikirim sebagai header `x-recaptcha-token` (sesuaikan dengan format yang diharapkan situs Anda)
- **Node HTML** mengekstrak harga dan nama produk melalui CSS selector (`.product-price`, `h1`)
- `$workflow.staticData.lastPrice` menyimpan harga sebelumnya antar eksekusi
- Perbandingan harga mendeteksi baik **penurunan** (tingkat keparahan: `deal`) maupun **kenaikan** (tingkat keparahan: `info`)
- Jenis tugas adalah `ReCaptchaV3TaskProxyLess` (hardcoded) — edit node Solve reCAPTCHA v3 secara langsung untuk mengubah jenis tugas atau proxy
<details>
<summary>Klik untuk memperluas JSON workflow lengkap (17 node)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Scraping \u2014 Price & Product Monitor\n\n### How it works\n\n1. Triggers the workflow every 6 hours or via webhook.\n2. Configures target website URL and key for scraping.\n3. Solves reCAPTCHA to access the webpage.\n4. Fetches and extracts product data from the webpage.\n5. Compares current data with previous data to check for changes.\n6. Builds alert or updates status based on data changes.\n\n### Setup steps\n\n- [ ] Configure the 'Every 6 Hours' trigger to set the appropriate time schedule.\n- [ ] Set up the target website URL and key parameters in the 'Set Target Config [Schedule]' node.\n- [ ] Ensure the 'Solve reCAPTCHA' and 'Solve reCAPTCHA [Webhook]' nodes are configured with the correct CAPTCHA services.\n- [ ] Set up webhook endpoint in the 'Webhook Trigger' node.\n- [ ] Configure the 'Respond to Webhook' node for handling webhook responses.\n\n### Customization\n\nAdjust the 'Compare Data' and 'Compare Data [Webhook]' code to fit specific data comparison logic or data formats.",
"height": 896,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1312,
-352
],
"id": "871c5a60-20b4-4cc0-a357-d5cecb8a322a",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled trigger setup\n\nTriggers every 6 hours and sets the target config for scraping.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-128
],
"id": "43acb039-cfcd-47c3-892e-e13da011b721",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled CAPTCHA solving and page fetch\n\nSolves the CAPTCHA and fetches the product page based on schedule.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
-128
],
"id": "68fc53a6-181e-4ca8-bf7d-f3f8e9b12f9d",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Scheduled data extraction and comparison\n\nExtracts and compares data from the fetched page.",
"height": 272,
"width": 784,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
-112
],
"id": "155fc92b-721a-40bf-80e6-6dd2082b126a",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Scheduled alert or status update\n\nHandles response based on data comparison for scheduled runs.",
"height": 560,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1296,
-352
],
"id": "ee2c8c8e-d21d-42aa-b261-49a6fffb3d11",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "## Webhook trigger setup\n\nInitiates the workflow via a webhook request.",
"height": 368,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
304
],
"id": "6957473e-81a0-4afd-a0ea-e6f61c3be715",
"name": "Sticky Note5"
},
{
"parameters": {
"content": "## Webhook CAPTCHA solving and page fetch\n\nSolves the CAPTCHA and fetches the product page via webhook.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
304
],
"id": "48990176-a5b5-48db-ac09-bcc207318f0a",
"name": "Sticky Note6"
},
{
"parameters": {
"content": "## Webhook data extraction and comparison\n\nProcesses data fetched from the page and checks for changes via webhook.",
"height": 272,
"width": 784,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
320
],
"id": "844166d1-75f7-4192-8bfb-3a1381fb6235",
"name": "Sticky Note7"
},
{
"parameters": {
"content": "## Webhook alert or status update\n\nResponds to webhook trigger with alert or status update.",
"height": 544,
"width": 384,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1328,
240
],
"id": "c1926a60-dfb3-4520-a530-82aa40c6341c",
"name": "Sticky Note8"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
0
],
"id": "rc-s-901",
"name": "Every 6 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "websiteURL",
"value": "https://YOUR-TARGET-SITE.com/product-page",
"type": "string"
},
{
"id": "cfg-002",
"name": "websiteKey",
"value": "YOUR_SITE_KEY_HERE",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-400,
0
],
"id": "rc-s-900",
"name": "Set Target Config [Schedule]"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "rc-s-902",
"name": "Solve reCAPTCHA",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Set Target Config [Schedule]').first().json.websiteURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "user-agent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "rc-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": "rc-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 || 'first check', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
0
],
"id": "rc-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": [
1104,
0
],
"id": "rc-s-906",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $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": [
1344,
-160
],
"id": "rc-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": [
1344,
48
],
"id": "rc-s-908",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-704,
480
],
"id": "rc-s-909",
"name": "Webhook Trigger",
"webhookId": "rc-s-909-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
432
],
"id": "rc-s-910",
"name": "Solve reCAPTCHA [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"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"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
432
],
"id": "rc-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": [
512,
432
],
"id": "rc-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 || 'first check', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
432
],
"id": "rc-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": [
1104,
432
],
"id": "rc-s-914",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a4",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $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": [
1376,
368
],
"id": "rc-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": [
1392,
608
],
"id": "rc-s-916",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1568,
512
],
"id": "rc-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 reCAPTCHA",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA": {
"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 reCAPTCHA [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA [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
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
### Contoh 2: Login Akun
Alur kerja ini mengotomatiskan login ke situs yang dilindungi captcha. Node **Set Login Config** memusatkan semua parameter — **[Schedule]** untuk jalur jadwal dan **[Webhook]** untuk jalur webhook sesuai permintaan. Edit node konfigurasi yang sesuai untuk mengonfigurasi setiap jalur.
**Jalur jadwal:**```
Every 24 Hours → Set Login Config → Solve Captcha → Submit Login
→ Login Successful? → Mark Login Success / Mark Login Failed
```> **Penanganan kesalahan:** Jika CapSolver gagal, eksekusi akan berhenti dan ditandai sebagai gagal di n8n. Periksa **Executions** untuk melihat kesalahan, atau konfigurasikan [Error Workflow](https://docs.n8n.io/flow-logic/error-handling/) n8n untuk mendapatkan pemberitahuan secara otomatis.
Perilaku utama:
- Default menggunakan **reCAPTCHA v2** (`ReCaptchaV2TaskProxyLess`) — ubah `taskType` di **Set Login Config [Schedule]** atau **Set Login Config [Webhook]** untuk jalur yang sesuai; ubah `Operation` di node Solve Captcha jika beralih antara v2 dan v3
- Field form dikodekan secara statis sebagai `email`, `password`, dan `g-recaptcha-response` — edit node **Submit Login** secara langsung agar sesuai dengan nama field situs target Anda
- Pemeriksaan **Login Successful?** mengevaluasi baik `statusCode < 400` dan keberadaan `successMarker` yang dapat dikonfigurasi di dalam body respons
- **Jalur Webhook** menggunakan **Set Login Config [Webhook]** dengan nilai placeholder yang sama — edit node tersebut untuk mengonfigurasi jalur webhook sesuai kebutuhan
- Jalur webhook mengembalikan hasil dalam format JSON melalui **Respond to Webhook**
<details>
<summary>Klik untuk memperluas JSON workflow lengkap (15 node)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Account Login\n\n### How it works\n\n1. The workflow triggers every 24 hours to initiate a login process.\n2. It solves reCAPTCHA challenges for login attempts.\n3. Submits login credentials via HTTP requests.\n4. Checks if login is successful and records the outcome.\n5. A webhook can trigger the login process manually.\n6. Responds to webhook calls with login status.\n\n### Setup steps\n\n- [ ] Configure the schedule trigger for desired intervals.\n- [ ] Set up the webhook URL for manual login attempts.\n- [ ] Ensure that credentials for solving reCAPTCHA are valid.\n- [ ] Configure the HTTP request nodes with the correct login endpoint.\n- [ ] Confirm that response nodes are set with the correct output format.\n\n### Customization\n\nCustomizable time intervals for automated login attempts and custom webhook endpoints can be configured.",
"width": 480,
"height": 896
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1248,
-352
],
"id": "b76c0299-05e6-4d65-ba90-63a8148242af",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled login initialization\n\nTriggers login attempts every 24 hours and configures necessary parameters.",
"width": 1408,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-688,
-112
],
"id": "0610b8c8-fce5-4efd-b3d2-1eeeb6eba648",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled login results\n\nDetermines and marks the results of scheduled login attempts.",
"width": 240,
"height": 528,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
816,
-352
],
"id": "73eec9f0-dbe8-43a5-bff7-2308b4cac998",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Webhook login initialization\n\nManual login attempts triggered by webhook, solving reCAPTCHA.",
"width": 1408,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-688,
320
],
"id": "0680f603-0a47-429f-81cb-69ff7741a9bd",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Webhook login results and response\n\nRecords results of webhook login attempts and sends response.",
"width": 512,
"height": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
816,
208
],
"id": "4f244d27-03e3-4670-8e6f-67ed6264ac8d",
"name": "Sticky Note4"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-640,
0
],
"id": "rc-l-921",
"name": "Every 24 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "l1",
"name": "websiteURL",
"value": "https://YOUR-LOGIN-PAGE.com",
"type": "string"
},
{
"id": "l2",
"name": "websiteKey",
"value": "YOUR_SITE_KEY_HERE",
"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": [
-336,
0
],
"id": "rc-l-922",
"name": "Set Login Config [Schedule]"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-32,
0
],
"id": "rc-l-923",
"name": "Solve Captcha [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": "your-email@example.com"
},
{
"name": "password",
"value": "YOUR_ACCOUNT_PASSWORD"
},
{
"name": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
272,
0
],
"id": "rc-l-924",
"name": "Submit Login [Schedule]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"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": [
576,
0
],
"id": "rc-l-925",
"name": "Login Successful? [Schedule]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "s1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "s2",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "s3",
"name": "message",
"value": "Configured account login flow succeeded",
"type": "string"
},
{
"id": "s4",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
864,
-192
],
"id": "rc-l-926",
"name": "Mark Login Success [Schedule]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "f1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "f2",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "f3",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "f4",
"name": "message",
"value": "Login response did not match the configured success marker",
"type": "string"
},
{
"id": "f5",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
864,
16
],
"id": "rc-l-927",
"name": "Mark Login Failed [Schedule]"
},
{
"parameters": {
"httpMethod": "POST",
"path": "account-login-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-640,
432
],
"id": "rc-l-928",
"name": "Webhook Trigger",
"webhookId": "rc-l-928-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-32,
432
],
"id": "rc-l-929",
"name": "Solve Captcha [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": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
272,
432
],
"id": "rc-l-930",
"name": "Submit Login [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"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": [
576,
432
],
"id": "rc-l-931",
"name": "Login Successful? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "ws1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "ws2",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "ws3",
"name": "message",
"value": "Configured account login flow succeeded",
"type": "string"
},
{
"id": "ws4",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
864,
336
],
"id": "rc-l-932",
"name": "Mark Login Success [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "wf1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "wf2",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "wf3",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "wf4",
"name": "message",
"value": "Login response did not match the configured success marker",
"type": "string"
},
{
"id": "wf5",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
880,
528
],
"id": "rc-l-933",
"name": "Mark Login Failed [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1184,
496
],
"id": "rc-l-934",
"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 Captcha [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Solve Captcha [Schedule]": {
"main": [
[
{
"node": "Submit Login [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Schedule]": {
"main": [
[
{
"node": "Login Successful? [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Login Successful? [Schedule]": {
"main": [
[
{
"node": "Mark Login Success [Schedule]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Login Failed [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Solve Captcha [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve Captcha [Webhook]": {
"main": [
[
{
"node": "Submit Login [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Webhook]": {
"main": [
[
{
"node": "Login Successful? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Login Successful? [Webhook]": {
"main": [
[
{
"node": "Mark Login Success [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Login Failed [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Mark Login Success [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Mark Login Failed [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
Anda telah belajar cara membangun API pemecah reCAPTCHA dan alur kerja scraping siap produksi menggunakan n8n dan CapSolver — tanpa perlu coding tradisional.
Dalam panduan ini, kami membahas:
Inti dari pembelajaran ini: memecahkan captcha hanyalah setengah pekerjaan — Anda juga perlu mengirim token ke situs web target untuk membuka data yang dilindungi.
Tips: Alur kerja ini menggunakan pemicu Schedule + Webhook, tetapi Anda dapat mengganti node pemicu dengan pemicu n8n lainnya — manual, event aplikasi, pengiriman formulir, dll. Setelah mengambil data, gunakan node bawaan n8n untuk menyimpan hasil ke Google Sheets, database, penyimpanan cloud, atau mengirim notifikasi via Telegram/Slack/Email.
Siap memulai? Daftar di CapSolver dan gunakan kode bonus n8n untuk mendapatkan bonus tambahan 8% pada pengisian pertama Anda!

Harga bervariasi tergantung jenis captcha. reCAPTCHA v2 biasanya berbiaya sekitar $1-3 per 1.000 pemecahan. Periksa halaman harga CapSolver untuk tarif terkini.
Sebagian besar tantangan reCAPTCHA v2 diselesaikan dalam 5-20 detik. reCAPTCHA v3 biasanya lebih cepat karena tidak melibatkan tantangan gambar.
Ya! Alur kerja ini dapat digunakan dengan n8n yang dihosting sendiri maupun n8n Cloud. Node CapSolver sudah tersedia sebagai integrasi resmi — cukup tambahkan kredensial API Anda.
Metode termudah adalah menggunakan ekstensi browser CapSolver — buka DevTools, pergi ke tab "CapSolver Captcha Detector", dan aktifkan captcha. Ekstensi akan menampilkan semua parameter secara otomatis. Alternatifnya, Anda dapat mencari data-sitekey atau render= pada URL skrip reCAPTCHA di sumber halaman.
Keduanya menggunakan teknologi dasar yang sama, tetapi v2 menampilkan kotak centang yang terlihat ("I'm not a robot") sedangkan v2 Invisible berjalan di latar belakang tanpa widget yang terlihat. Saat memecahkan, perbedaannya hanya pada pengaturan isInvisible: true.
Beberapa hal bisa menyebabkan ini. Pertama, token cepat kedaluwarsa — pastikan Anda mengirim token segera setelah diterima. Kedua, pastikan Anda mengirim token ke tempat yang benar: periksa permintaan jaringan sebenarnya yang dibuat browser saat mengirim formulir (DevTools → tab Network) dan pastikan nama field, metode permintaan, dan endpoint sesuai dengan konfigurasi di n8n. Ketiga, beberapa situs memerlukan parameter tambahan seperti enterprisePayload atau cookie dan header khusus — gunakan ekstensi CapSolver untuk memeriksa apakah ini 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.
