
Ethan Collins
Pattern Recognition Specialist

AWS WAF (Web Application Firewall) adalah sistem perlindungan bot kelas perusahaan Amazon yang digunakan oleh beberapa situs web terbesar di internet. Tidak seperti CAPTCHA tradisional yang menampilkan teka-teki gambar atau kotak centang, AWS WAF menggunakan tantangan tak terlihat dan verifikasi berbasis token, membuatnya sangat sulit untuk ditangani oleh alat otomatis.
Bagaimana jika Anda dapat secara otomatis menyelesaikan tantangan AWS WAF dalam alur kerja n8n Anda? Baik Anda membangun API pemecah yang dapat digunakan kembali, mengikis situs web yang dilindungi CAPTCHA, atau mengotomatiskan formulir login, Anda dapat melakukan semua ini tanpa menulis satu baris kode tradisional pun.
Dalam panduan ini, Anda akan belajar cara menggabungkan n8n (alat otomatisasi alur kerja visual) dengan CapSolver (layanan pemecahan CAPTCHA bertenaga AI) untuk menyelesaikan tantangan AWS WAF sesuai permintaan. Ini dapat berfungsi sebagai titik akhir API mandiri atau sebagai langkah dalam alur kerja otomatisasi yang lebih besar.
Apa yang akan kita bangun:
API Pemecah — titik akhir yang dapat digunakan kembali yang dapat dipanggil oleh alat lain:
Alur Kerja Penggunaan Langsung — menggabungkan CapSolver sebagai langkah dalam otomatisasi yang lebih besar:
AWS WAF (Web Application Firewall) adalah layanan mitigasi bot dan keamanan web Amazon Web Services. Ini melindungi situs web dari eksploitasi web umum, lalu lintas bot, dan penyalahgunaan otomatis. Banyak situs web dengan lalu lintas tinggi, terutama platform e-commerce, layanan keuangan, dan aplikasi perusahaan, menggunakan AWS WAF untuk membatasi akses di balik tantangan CAPTCHA yang tidak terlihat.
Bagaimana AWS WAF berbeda dari reCAPTCHA atau Turnstile:
websiteURL untuk memulai pemecahan.aws-waf-token. Ini harus dikirim melalui header HTTP Cookie pada permintaan berikutnya.awsKey, awsIv, awsContext, awsChallengeJS, dan parameter lain tergantung pada konfigurasi situs. Ini opsional dan hanya diperlukan untuk implementasi tertentu.
Bukan CloudFront. AWS WAF adalah lapisan firewall di depan aplikasi web Anda. CloudFront adalah CDN Amazon. Sebuah situs dapat menggunakan CloudFront tanpa AWS WAF, atau AWS WAF tanpa CloudFront. Ini adalah layanan independen, tetapi sering digunakan bersama.
Sebelum kita mulai, pastikan Anda memiliki yang berikut:
Penting: Pastikan akun CapSolver Anda memiliki saldo yang cukup. Tugas pemecahan AWS WAF mengonsumsi kredit berdasarkan penggunaan.
CapSolver tersedia sebagai integrasi resmi di n8n. Tidak perlu menginstal node komunitas. Anda akan 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.
Navigasikan ke instans n8n Anda dan buka Settings -> Credentials. Ini akan menampilkan semua kredensial yang telah Anda siapkan.

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

Penting: Setiap node CapSolver dalam alur kerja Anda akan merujuk kredensial ini. Anda hanya perlu membuatnya sekali. Semua alur kerja pemecah akan berbagi kredensial yang sama.
Sekarang Anda siap untuk membangun alur kerja pemecah AWS WAF Anda!
Sebelum Anda dapat menyelesaikan tantangan AWS WAF, Anda perlu mengonfirmasi bahwa situs target menggunakan AWS WAF dan mengumpulkan parameter opsional apa pun. Cara termudah untuk melakukan ini adalah dengan menggunakan ekstensi browser CapSolver yang dikombinasikan dengan inspeksi manual.
Navigasikan ke situs web target dan buka DevTools (F12). Cari tanda-tanda yang jelas ini:
aws-waf-token di tab Aplikasicaptcha.awswaf.com atau URL yang berisi challenge.jsx-amzn-waf-*Sebagian besar pemecahan AWS WAF hanya memerlukan websiteURL. Namun, beberapa situs mungkin mengekspos parameter tambahan yang dapat meningkatkan akurasi pemecahan.
| Parameter | Tempat Mencari | Deskripsi |
|---|---|---|
awsKey |
Sumber Halaman / Variabel JS | Nilai kunci yang dikembalikan dari halaman CAPTCHA |
awsIv |
Sumber Halaman / Variabel JS | Nilai iv yang dikembalikan dari halaman CAPTCHA |
awsContext |
Sumber Halaman / Variabel JS | Nilai konteks yang dikembalikan dari halaman CAPTCHA |
awsChallengeJS |
Tab Jaringan | URL challenge.js (misalnya, https://captcha.awswaf.com/.../challenge.js) |
awsApiJs |
Tab Jaringan | URL jsapi.js |
awsProblemUrl |
Tab Jaringan | URL titik akhir masalah |
awsApiKey |
Tab Jaringan | Nilai api_key dari titik akhir masalah |
awsExistingToken |
Cookie | aws-waf-token sebelumnya jika memperbarui |
Tip: Sebagian besar situs hanya memerlukan
websiteURL. Coba gunakan hanya parameter itu terlebih dahulu, dan hanya tambahkan parameter opsional jika token tidak diterima.
Untuk panduan yang lebih rinci tentang mengidentifikasi parameter CAPTCHA, lihat dokumentasi resmi CapSolver.
Alur kerja ini akan membuat titik akhir API POST yang menerima parameter AWS WAF dan mengembalikan token cookie yang dipecahkan.

Alur kerja terdiri dari empat node:
$json.error tidak kosong){"error": "..."} jika gagal| Pengaturan | Nilai |
|---|---|
| Metode HTTP | POST |
| Jalur | solver-aws-waf |
| Respons | Response Node |
Ini akan membuat titik akhir di https://your-n8n-instance.com/webhook/solver-aws-waf.
| Parameter | Nilai | Deskripsi |
|---|---|---|
| Operasi | AWS WAF |
Harus diatur ke AWS WAF |
| Tipe | AntiAwsWafTaskProxyLess |
Tidak ada proxy yang diperlukan (default). Gunakan AntiAwsWafTask dengan proxy untuk situs yang lebih ketat |
| URL Situs Web | {{ $json.body.websiteURL }} |
URL halaman tempat tantangan AWS WAF berada |
| awsKey | (Opsional) | Nilai kunci yang dikembalikan dari halaman CAPTCHA |
| awsIv | (Opsional) | Nilai iv yang dikembalikan dari halaman CAPTCHA |
| awsContext | (Opsional) | Nilai konteks yang dikembalikan dari halaman CAPTCHA |
| awsChallengeJS | (Opsional) | Tautan challenge.js |
| awsApiJs | (Opsional) | Tautan jsapi.js |
Perbedaan utama dari Turnstile/reCAPTCHA: AWS WAF tidak memerlukan
websiteKey. HanyawebsiteURLyang wajib. Pastikan juga untuk memilih kredensial CapSolver Anda di node ini.
| Pengaturan | Nilai |
|---|---|
| Kondisi | ={{ $json.error }} tidak kosong |
| Cabang Benar | Rute ke node Webhook respons kesalahan |
| Cabang Salah | Rute ke node Webhook respons berhasil |
Ini membuat jalur kesalahan eksplisit di kanvas. Karena node CapSolver diatur untuk melanjutkan saat terjadi kesalahan (onError: continueRegularOutput), kegagalan akan tiba di sini sebagai {"error": "..."} daripada membuat alur kerja crash.
Cabang Berhasil (output False dari Kesalahan CapSolver?):
| Pengaturan | Nilai |
|---|---|
| Format Respons | JSON |
| Isi Respons | ={{ JSON.stringify($json.data) }} |
Cabang Kesalahan (output True dari Kesalahan CapSolver?):
| Pengaturan | Nilai |
|---|---|
| Format Respons | JSON |
| Isi Respons | ={{ JSON.stringify({ error: $json.error }) }} |
Pesan kesalahan akan mengikuti salah satu dari dua format, tergantung pada titik kegagalan:
| Titik Kegagalan | Format |
|---|---|
| Pembuatan tugas ditolak (kunci salah, saldo tidak cukup, data tidak valid, dll.) | {"error": "Failed to create task: Request failed with status code 400"} |
| Tugas dibuat tetapi gagal memecahkan CAPTCHA | {"error": "Solve failed: <reason>"} |
| Pemecahan waktu habis setelah 120 detik | {"error": "Get task result timeout: unable to solve within 120000 seconds"} |
Catatan: Kegagalan pembuatan tugas (kunci API yang salah, saldo nol, data tugas yang tidak valid) semuanya akan muncul sebagai pesan HTTP 400 yang sama. Node n8n menangkap pengecualian HTTP sebelum membaca isi kesalahan CapSolver.
Contoh Kesalahan Umum:
{"error": "Failed to create task: Request failed with status code 400"}
{"error": "Solve failed: Invalid parameters"}
{"error": "Get task result timeout: unable to solve within 120000 seconds"}
Kirim permintaan POST ke titik akhir Webhook Anda:
curl -X POST https://your-n8n-instance.com/webhook/solver-aws-waf \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login"
}'
Respons yang Diharapkan:
{
"taskId": "abc123...",
"solution": {
"cookie": "aws-waf-token=AQAAAA..."
},
"status": "ready"
}
Salin JSON di bawah ini dan impor ke n8n Anda melalui Menu -> Import from JSON.
{
"name": "AWS WAF Solver API",
"nodes": [
{
"parameters": {
"content": "## AWS WAF Solver API\n\n**Untuk:** Tim yang perlu menyelesaikan tantangan AWS WAF di alat lain.\n\n**Fungsi:** Menerima parameter AWS WAF, mengirim tantangan ke CapSolver, dan mengembalikan cookie `aws-waf-token` yang dipecahkan.\n\n**Cara Kerjanya:**\n1. Webhook menerima permintaan POST dengan `websiteURL` dan parameter opsional.\n2. CapSolver memecahkan tantangan AWS WAF.\n3. Jika berhasil, Webhook mengembalikan respons JSON dengan cookie `aws-waf-token`.\n4. Jika gagal, Webhook mengembalikan pesan kesalahan.\n\n**Pengaturan:**\n1. Tambahkan kunci API CapSolver Anda di **Settings → Credentials**.\n2. Aktifkan alur kerja.\n3. Catat URL Webhook.\n\n**Penting:**\n- AWS WAF tidak memerlukan `websiteKey`. Hanya `websiteURL`.\n- Solusinya adalah cookie `aws-waf-token`, yang harus dikirim sebagai header HTTP `Cookie`.",
"height": 480,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-728,
-400
],
"id": "sticky-blog-main-1773678228095-1",
"name": "Sticky Note"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-aws-waf",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-400,
0
],
"id": "aw111111-1111-1111-1111-aw1111111101",
"name": "Webhook Trigger",
"webhookId": "aw111111-aaaa-bbbb-cccc-aw1111111101",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "AWS WAF",
"type": "AntiAwsWafTaskProxyLess",
"websiteURL": "={{ $json.body.websiteURL }}",
"awsKey": "={{ $json.body.awsKey }}",
"awsIv": "={{ $json.body.awsIv }}",
"awsContext": "={{ $json.body.awsContext }}",
"awsChallengeJS": "={{ $json.body.awsChallengeJS }}",
"awsApiJs": "={{ $json.body.awsApiJs }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "aw111111-1111-1111-1111-aw1111111102",
"name": "Solve AWS WAF",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "aws-if-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
208,
0
],
"id": "aw111111-1111-1111-1111-aw1111111103",
"name": "CapSolver Error?"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
512,
-80
],
"id": "aw111111-1111-1111-1111-aw1111111104",
"name": "Respond to Webhook (Success)"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
512,
128
],
"id": "aw111111-1111-1111-1111-aw1111111105",
"name": "Respond to Webhook (Error)"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Solve AWS WAF",
"type": "main",
"index": 0
}
]
]
},
"Solve AWS WAF": {
"main": [
[
{
"node": "CapSolver Error?",
"type": "main",
"index": 0
}
]
]
},
"CapSolver Error?": {
"main": [
[
{
"node": "Respond to Webhook (Success)",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook (Error)",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
API pemecah dan contoh pengiriman di atas menunjukkan pola inti untuk menyelesaikan tantangan AWS WAF, mengirimkan cookie, dan memproses hasilnya. Alur kerja di bawah ini memperluas pola ini ke kasus penggunaan siap produksi. Masing-masing mencakup pemicu ganda (jadwal + webhook), pelacakan status persisten, dan output terstruktur.
| Alur Kerja | Tujuan |
|---|---|
Pengikisan AWS WAF — Detail Harga & Produk — CapSolver + Jadwal + Webhook |
Mengikis harga dan nama produk setiap 6 jam, membandingkan dengan nilai sebelumnya yang disimpan di staticData, dan mengirim peringatan jika ada perubahan |
Login Akun AWS WAF — CapSolver + Jadwal + Webhook |
Masuk ke situs yang dilindungi AWS WAF dengan akun Anda. Pertama pecahkan, lalu POST kredensial dengan cookie |
Alur kerja ini mengikis halaman produk setiap 6 jam (jadwal) atau sesuai permintaan (webhook), mengekstrak harga menggunakan node HTML, dan membandingkannya dengan nilai yang disimpan sebelumnya.
Jalur Jadwal:
Setiap 6 Jam -> Pecahkan AWS WAF -> Ambil Halaman Produk -> Ekstrak Data
-> Bandingkan Data -> Data Berubah? -> Bangun Peringatan / Tidak Ada Perubahan
Perilaku utama:
Cookie (ini adalah cara yang benar untuk mengirim token AWS WAF; bukan sebagai bidang formulir).product-price, h1)$workflow.staticData.lastPrice mempertahankan harga sebelumnya di antara eksekusideal) dan peningkatan (tingkat keparahan: info){
"name": "AWS WAF Scraping — Price & Product Details — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## Pengikisan AWS WAF — Monitor Harga & Produk\n\n**Untuk:** Tim yang perlu memantau harga atau data produk di situs yang dilindungi AWS WAF.\n\n**Fungsi:** Memecahkan AWS WAF, mengambil halaman produk, mengekstrak harga dan nama melalui pemilih CSS, membandingkan dengan nilai yang disimpan, dan mengirim peringatan jika ada perubahan.\n\n**Cara Kerjanya:**\n1. Jadwal (setiap 6 jam) atau Webhook memicu alur.\n2. CapSolver memecahkan tantangan AWS WAF.\n3. Permintaan HTTP mengambil halaman produk dengan token yang dipecahkan.\n4. Node HTML mengekstrak harga dan nama produk.\n5. Node Kode membandingkan harga saat ini dengan harga yang disimpan → mengirim peringatan jika ada perubahan.\n\n**Pengaturan:**\n1. Tambahkan kunci API CapSolver Anda di **Settings → Credentials**.\n2. Ganti URL placeholder dan kunci situs.\n3. Perbarui pemilih CSS di \"Ekstrak Data\" agar sesuai dengan halaman target Anda.\n4. Hubungkan output \"Bangun Peringatan\" ke saluran notifikasi Anda.",
"height": 560,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-920,
-380
],
"id": "sticky-blog-main-1773678228094-1",
"name": "Sticky Note"
},
{
"parameters": {
"content": "### Jalur Jadwal\nDijalankan secara otomatis setiap 6 jam.\nHasil disimpan dalam data statis alur kerja untuk perbandingan antar eksekusi.",
"height": 480,
"width": 1900,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-440,
-280
],
"id": "sticky-blog-section-1773678228094-2",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "### Jalur Webhook\nPemicu sesuai permintaan — logika yang sama, mengembalikan hasil sebagai respons JSON.",
"height": 480,
"width": 1900,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-440,
140
],
"id": "sticky-blog-section-1773678228094-3",
"name": "Sticky Note2"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-400,
0
],
"id": "aw333333-3333-3333-3333-aw3333333301",
"name": "Every 6 Hours"
},
{
"parameters": {
"operation": "AWS WAF",
"type": "AntiAwsWafTaskProxyLess",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "aw333333-3333-3333-3333-aw3333333302",
"name": "Solve AWS WAF",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"url": "https://YOUR-TARGET-SITE.com/product-page",
"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": "Cookie",
"value": "={{ $json.data.solution.cookie }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "aw333333-3333-3333-3333-aw3333333303",
"name": "Fetch Product Page"
},
{
"parameters": {
"operation": "extractHtmlContent",
"sourceData": "json",
"dataPropertyName": "data",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price",
"returnValue": "text",
"returnArray": false
},
{
"key": "productName",
"cssSelector": "h1, .product-title",
"returnValue": "text",
"returnArray": false
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
0
],
"id": "aw333333-3333-3333-3333-aw3333333304",
"name": "Extract Data"
},
{
"parameters": {
"jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Parse numeric values for comparison\nconst parsePrice = (str) => {\n if (!str) return null;\n const match = str.match(/[\\d,]+\\.?\\d*/);\n return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// Update stored price\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\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';\n\nreturn [{\n json: {\n productName,\n currentPrice,\n previousPrice: previousPrice || 'first check',\n changed,\n direction,\n diff: changed ? `$${diff}` : null,\n checkedAt: new Date().toISOString()\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
0
],
"id": "aw333333-3333-3333-3333-aw3333333305",
"name": "Compare Data"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "price-if-001",
"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": "aw333333-3333-3333-3333-aw3333333306",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-001",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
"type": "string"
},
{
"id": "alert-002",
"name": "severity",
"value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
"type": "string"
},
{
"id": "alert-003",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
-80
],
"id": "aw333333-3333-3333-3333-aw3333333307",
"name": "Build Alert"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "nc-001",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "nc-002",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "nc-003",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
128
],
"id": "aw333333-3333-3333-3333-aw3333333308",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-aws-waf",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-400,
420
],
"id": "aw333333-3333-3333-3333-aw3333333309",
"name": "Webhook Trigger",
"webhookId": "aw333333-aaaa-bbbb-cccc-aw3333333309",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "AWS WAF",
"type": "AntiAwsWafTaskProxyLess",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
420
],
"id": "aw333333-3333-3333-3333-aw3333333310",
"name": "Solve AWS WAF [Webhook]",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"url": "https://YOUR-TARGET-SITE.com/product-page",
"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": "Cookie",
"value": "={{ $json.data.solution.cookie }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
420
],
"id": "aw333333-3333-3333-3333-aw3333333311",
"name": "Fetch Product Page [Webhook]"
},
{
"parameters": {
"operation": "extractHtmlContent",
"sourceData": "json",
"dataPropertyName": "data",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price",
"returnValue": "text",
"returnArray": false
},
{
"key": "productName",
"cssSelector": "h1, .product-title",
"returnValue": "text",
"returnArray": false
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
420
],
"id": "aw333333-3333-3333-3333-aw3333333312",
"name": "Extract Data [Webhook]"
},
{
"parameters": {
"jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Parse numeric values for comparison\nconst parsePrice = (str) => {\n if (!str) return null;\n const match = str.match(/[\\d,]+\\.?\\d*/);\n return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// Update stored price\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\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';\n\nreturn [{\n json: {\n productName,\n currentPrice,\n previousPrice: previousPrice || 'first check',\n changed,\n direction,\n diff: changed ? `$${diff}` : null,\n checkedAt: new Date().toISOString()\n }\n}];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
420
],
"id": "aw333333-3333-3333-3333-aw3333333313",
"name": "Compare Data [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "price-if-002",
"leftValue": "={{ $json.changed }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
420
],
"id": "aw333333-3333-3333-3333-aw3333333314",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "alert-004",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
"type": "string"
},
{
"id": "alert-005",
"name": "severity",
"value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
"type": "string"
},
{
"id": "alert-006",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
340
],
"id": "aw333333-3333-3333-3333-aw3333333315",
"name": "Build Alert [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "nc-004",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "nc-005",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "nc-006",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
548
],
"id": "aw333333-3333-3333-3333-aw3333333316",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1712,
420
],
"id": "aw333333-3333-3333-3333-aw3333333317",
"name": "Respond to Webhook [Webhook]"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Solve AWS WAF",
"type": "main",
"index": 0
}
]
]
},
"Solve AWS WAF": {
"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 AWS WAF [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve AWS WAF [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 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"No Change [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook [Webhook]",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Alur kerja ini mengotomatiskan pengiriman formulir login yang dilindungi AWS WAF dari awal hingga akhir. Ini memecahkan tantangan AWS WAF sebelum mengirimkan kredensial.
Alur kerja ini terdiri dari lima node:
| Pengaturan | Nilai |
|---|---|
| Metode HTTP | POST |
| Jalur | login-aws-waf |
| Respons | Response Node |
Ini akan membuat titik akhir di https://your-n8n-instance.com/webhook/login-aws-waf.
| Parameter | Nilai |
|---|---|
| Operasi | AWS WAF |
| URL Situs Web | https://YOUR-TARGET-SITE.com/login |
Pastikan juga untuk memilih kredensial CapSolver Anda.
| Pengaturan | Nilai |
|---|---|
| Metode | POST |
| URL | https://YOUR-TARGET-SITE.com/login |
| Tipe Konten | form-urlencoded |
| Parameter Isi | username=YOUR_USERNAME, password=YOUR_PASSWORD, Cookie={{ $('Solve AWS WAF').item.json.data.solution.cookie }} |
Penting: Ganti
YOUR_USERNAMEdanYOUR_PASSWORDdengan kredensial Anda yang sebenarnya. Selain itu, Anda mungkin perlu menyesuaikan nama bidang formulir agar sesuai dengan HTML situs target Anda.
| Pengaturan | Nilai |
|---|---|
| Format Respons | JSON |
| Isi Respons | ={{ JSON.stringify($json) }} |
Kirim permintaan POST ke titik akhir Webhook Anda:
curl -X POST https://your-n8n-instance.com/webhook/login-aws-waf \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"username": "testuser",
"password": "testpass"
}'
Respons yang Diharapkan (Berhasil):
{
"status": "success",
"message": "Login successful",
"solution": {
"cookie": "aws-waf-token=AQAAAA..."
}
}
Respons yang Diharapkan (Gagal):
{
"status": "failed",
"message": "Login failed: Invalid credentials or captcha",
"error": "..."
}
Salin JSON di bawah ini dan impor ke n8n Anda melalui Menu -> Import from JSON.
{
"name": "AWS WAF Account Login — CapSolver + Schedule + Webhook",
"nodes": [
{
"parameters": {
"content": "## Otomatisasi Login Akun AWS WAF — CapSolver + Jadwal + Webhook\n\n**Untuk:** Tim yang perlu mengotomatiskan login ke akun yang dilindungi AWS WAF.\n\n**Fungsi:** Memecahkan tantangan AWS WAF dan mengirimkan formulir login dengan cookie yang dipecahkan dan kredensial pengguna.\n\n**Cara Kerjanya:**\n1. Webhook memicu alur.\n2. CapSolver memecahkan tantangan AWS WAF.\n3. Permintaan HTTP mengirimkan formulir login dengan cookie yang dipecahkan dan kredensial pengguna.\n4. Webhook mengembalikan hasil login.\n\n**Pengaturan:**\n1. Tambahkan kunci API CapSolver Anda di **Settings → Credentials**.\n2. Ganti URL placeholder dan kredensial.\n3. Sesuaikan nama bidang formulir agar sesuai dengan situs target Anda.\n4. Aktifkan alur kerja.",
"height": 480,
"width": 460,
"color": 1
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-728,
-400
],
"id": "sticky-blog-main-1773678228096-1",
"name": "Sticky Note"
},
{
"parameters": {
"httpMethod": "POST",
"path": "login-aws-waf",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-400,
0
],
"id": "aw444444-4444-4444-4444-aw4444444401",
"name": "Webhook Trigger",
"webhookId": "aw444444-aaaa-bbbb-cccc-aw4444444401",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "AWS WAF",
"type": "AntiAwsWafTaskProxyLess",
"websiteURL": "={{ $json.body.websiteURL }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "aw444444-4444-4444-4444-aw4444444402",
"name": "Solve AWS WAF",
"credentials": {
"capSolverApi": {
"id": "YOUR_CREDENTIAL_ID",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $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": "Content-Type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "Cookie",
"value": "={{ $('Solve AWS WAF').item.json.data.solution.cookie }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "username",
"value": "={{ $json.body.username }}"
},
{
"name": "password",
"value": "={{ $json.body.password }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": false
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "aw444444-4444-4444-4444-aw4444444403",
"name": "Submit Login Form"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
512,
0
],
"id": "aw444444-4444-4444-4444-aw4444444404",
"name": "Respond to Webhook"
}
],
"connections": {
"Webhook Trigger": {
"main": [
[
{
"node": "Solve AWS WAF",
"type": "main",
"index": 0
}
]
]
},
"Solve AWS WAF": {
"main": [
[
{
"node": "Submit Login Form",
"type": "main",
"index": 0
}
]
]
},
"Submit Login Form": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
}
}
Kesalahan ini menunjukkan bahwa akun atau paket CapSolver Anda tidak menyertakan akses AWS WAF. Periksa Dasbor CapSolver Anda untuk mengonfirmasi bahwa layanan ini termasuk dalam paket Anda.
Kesalahan ini menunjukkan bahwa parameter websiteURL yang Anda berikan di node CapSolver tidak benar. Periksa kembali tab jaringan alat pengembang situs target Anda untuk memastikan Anda menggunakan nilai yang benar.
Jika login gagal meskipun AWS WAF berhasil dipecahkan, masalahnya mungkin terletak pada hal berikut:
Kesalahan ini menunjukkan bahwa kunci API CapSolver yang Anda konfigurasikan di n8n salah atau kedaluwarsa. Periksa Dasbor CapSolver Anda dan perbarui kredensial di n8n.
websiteURL dan parameter opsional apa pun seperti awsKey, awsIv, awsContext, awsChallengeJS, dan awsApiJs sudah benar. Ini adalah kunci untuk pemecahan AWS WAF yang berhasil.Siap untuk memulai? Daftar untuk CapSolver dan gunakan kode bonus n8n untuk mendapatkan bonus tambahan 8% pada pengisian ulang pertama Anda!

AWS WAF adalah firewall aplikasi web kelas perusahaan Amazon yang melindungi situs web dari lalu lintas bot dan penyalahgunaan melalui tantangan tak terlihat dan verifikasi berbasis token.
AWS WAF tidak memerlukan kunci situs, menggunakan autentikasi berbasis cookie, mengembalikan cookie aws-waf-token, dan biasanya merupakan tantangan tak terlihat tanpa widget yang terlihat untuk interaksi pengguna.
Harga bervariasi berdasarkan penggunaan. Periksa halaman harga CapSolver untuk harga AWS WAF saat ini. Tugas pemecahan AWS WAF lebih mahal daripada pengenalan gambar-ke-teks sederhana, tetapi lebih murah daripada jenis CAPTCHA kompleks lainnya.
Tugas pemecahan AWS WAF biasanya memakan waktu 10-30 detik, tergantung pada kompleksitas tantangan dan beban server CapSolver. Tidak seperti ImageToTextTask, pemecahan AWS WAF melibatkan pembuatan tugas dan polling, jadi tidak instan.
Layanan pemecahan AWS WAF CapSolver biasanya tidak memerlukan Anda untuk menyediakan proxy. CapSolver menangani persyaratan proxy secara internal. Anda hanya perlu memberikan websiteURL dan parameter opsional apa pun.
aws-waf-token saya tidak diterima?Jika aws-waf-token Anda tidak diterima, periksa hal berikut:
awsKey, awsIv, dll., pastikan Anda menyediakannya dengan benar.Jika login gagal meskipun AWS WAF berhasil dipecahkan, periksa hal berikut:
Ya. Alur kerja ini berfungsi dengan n8n yang di-host sendiri dan n8n Cloud. Node CapSolver sudah tersedia sebagai integrasi resmi. Anda hanya perlu menambahkan kredensial API Anda.
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.
