Cara Memecahkan CAPTCHA di n8n dengan Node HTTP Request

Tidak ada node CAPTCHA di n8n, dan Anda memang tidak membutuhkannya. Dua node HTTP Request dan satu node Wait sudah cukup untuk memecahkan semua jenis CAPTCHA yang didukung: node pertama mengirimkan job, node kedua melakukan polling sampai token kembali. Arahkan keduanya ke 127.0.0.1:8080 dan seluruh loop berjalan di mesin yang sama dengan n8n, sehingga tidak ada yang keluar dari jaringan Anda dan tidak ada yang dihitung per pemecahan. CapSkip juga bisa berjalan di server dan menerima panggilan API yang sama melalui jaringan, dan begitulah cara Anda memakainya dari n8n Cloud. Panduan ini membangun workflow node demi node, termasuk jebakan jaringan Docker yang menjerat kebanyakan orang pada percobaan pertama.
Apa yang Anda butuhkan
- n8n, baik self-hosted, desktop, maupun cloud. Ketiganya bisa dipakai, meskipun versi cloud memerlukan CapSkip yang dapat dijangkau melalui jaringan. Lihat bagian server di bawah.
- Aplikasi CapSkip berjalan dengan layanannya sudah dinyalakan. Port, key, serta mode Local atau Server ada di pengaturan koneksi.
- Sebuah sitekey dan URL halaman dari situs yang Anda otomatiskan.
Validasi key dimatikan secara default, jadi string apa pun yang tidak kosong bisa dipakai sebagai parameter key. Kirimkan sesuatu daripada tidak sama sekali: key yang kosong akan mengembalikan ERROR_WRONG_USER_KEY.
Mengapa HTTP Request, bukan community node
Community node harus diinstal di instance, tertinggal dari perubahan API, dan di n8n Cloud penggunaannya dibatasi. API di sini kompatibel dengan 2captcha dan hanya memiliki dua endpoint, sehingga sebuah community node hanya akan membungkus sekitar enam baris konfigurasi. Node HTTP Request bawaan melakukan pekerjaan yang sama, ikut diperbarui bersama n8n, dan berfungsi di setiap jenis instance.
| Endpoint API | Fungsinya | Mengembalikan |
|---|---|---|
/in.php | Mengirim sebuah tugas | ID captcha berupa angka |
/res.php | Menanyakan apakah ID itu sudah selesai | Token, atau string CAPCHA_NOT_READY |
Langkah 1: kirim CAPTCHA
Tambahkan sebuah node HTTP Request dan beri nama Submit CAPTCHA. Atur method ke POST dan URL ke http://127.0.0.1:8080/in.php. Aktifkan Send Body, pilih Form Urlencoded, lalu tambahkan kolom berikut.
| Nama | Nilai |
|---|---|
| key | String apa pun yang tidak kosong |
| method | userrecaptcha |
| googlekey | Sitekey Anda |
| pageurl | Halaman tempat widget berada |
| json | 1 |
Selalu kirim kolom json. Tanpa kolom itu, responsnya hanya berupa string mentah seperti OK|2122988149 yang harus Anda pisahkan sendiri. Dengan kolom itu, Anda mendapatkan objek yang bisa langsung diakses n8n.
// Response from in.php with json=1
{"status": 1, "request": "2122988149"}
// The captcha ID is now available downstream as:
// {{ $json.request }}Jenis CAPTCHA lain hanya mengubah kolom method dan parameter di sebelahnya. Turnstile memakai turnstile dengan pasangan sitekey dan pageurl, GeeTest memakai geetest dengan gt dan challenge, dan CAPTCHA gambar memakai base64 dengan byte gambar di sebuah kolom body. Referensi API mencantumkan setiap parameter untuk tiap jenis.
Langkah 2: tunggu sebelum polling pertama
Tambahkan sebuah node Wait setelah Submit CAPTCHA. Atur Resume ke After Time Interval, Wait Amount ke 15, dan Wait Unit ke seconds.
Lima belas detik bukan angka asal. Job reCAPTCHA v2 jarang selesai lebih cepat dari itu, jadi langsung melakukan polling hanya akan membuang satu eksekusi alur kerja untuk hasil yang sudah pasti berupa CAPCHA_NOT_READY. Turnstile dan GeeTest selesai lebih cepat, jadi 5 detik sudah cukup di sana. CAPTCHA gambar biasanya selesai dalam waktu sekitar satu detik.
Langkah 3: lakukan polling untuk token
Tambahkan node HTTP Request kedua bernama Poll Result. Method GET, URL http://127.0.0.1:8080/res.php, Send Query Parameters aktif.
| Nama | Nilai |
|---|---|
| key | String yang sama dengan yang Anda pakai di langkah 1 |
| action | get |
| id | {{ $('Submit CAPTCHA').item.json.request }} |
| json | 1 |
Rujuk node submit berdasarkan namanya, bukan dengan memakai $json.request. Begitu node Wait berada di antara keduanya, item yang masuk menjadi milik node Wait, dan pada putaran kedua loop item itu menjadi milik node IF. Menyebut node sumber secara eksplisit menjaga ID tetap stabil, berapa kali pun loop-nya berjalan.
Langkah 4: ulangi loop sampai hasilnya siap
Tambahkan sebuah node IF setelah Poll Result. Kondisinya adalah perbandingan string: left value {{ $json.request }}, operation “is not equal to”, dan right value CAPCHA_NOT_READY.
Hubungkan output false kembali ke node Wait. Itu menutup loop-nya, dan n8n akan terus berputar sampai jawabannya datang. Output true membawa token ke tahap berikutnya.
// res.php while the job is still running
{"status": 0, "request": "CAPCHA_NOT_READY"}
// res.php once it is solved
{"status": 1, "request": "03AGdBq26..."}Perhatikan ejaannya. API mengembalikan CAPCHA_NOT_READY tanpa huruf T pertama, warisan dari format wire 2captcha yang menjadi acuan kompatibilitasnya. Jika Anda mengetiknya dengan ejaan yang terlihat benar, node IF tidak akan pernah cocok, sehingga loop berjalan terus sampai alur kerja kehabisan waktu.
Hasil hanya bisa dibaca satu kali. Membaca ID yang sama dua kali akan mengembalikan kesalahan, bukan token lagi, jadi kirim token langsung ke node berikutnya alih-alih melakukan polling sekali untuk memeriksa dan sekali lagi untuk mengambilnya.
Langkah 5: gunakan token
Cabang true dari node IF kini membawa token tersebut. Kirimkan token itu di kolom form g-recaptcha-response pada permintaan yang sebelumnya terblokir untuk Anda, menggunakan node HTTP Request ketiga.
// Code node, Mode: Run Once for All Items.
// Builds the form payload for the final request.
const token = $input.first().json.request;
return [
{
json: {
email: "[email protected]",
"g-recaptcha-response": token,
},
},
];Token kedaluwarsa sekitar dua menit setelah diterbitkan, jadi lakukan pengirimannya segera. Jika alur kerja Anda memiliki langkah persetujuan atau node Wait lain di antara pemecahan dan pengiriman, pindahkan proses pemecahan ke setelah langkah itu.
Jebakan Docker: localhost bukan komputer Anda
Ini adalah kegagalan yang paling sering terjadi, dan pesan kesalahannya tidak mengarah ke mana pun yang berguna. Di dalam container, 127.0.0.1 berarti container itu sendiri, bukan host yang menjalankan pemecah CAPTCHA. n8n melaporkan connection refused dan alur kerja berhenti di Submit CAPTCHA.
Di Docker Desktop untuk Mac dan Windows, ganti host-nya dengan host.docker.internal di kedua URL. Di Linux nama itu tidak ter-resolve secara default, jadi tambahkan secara eksplisit saat Anda menjalankan container.
# docker pull docker.n8n.io/n8nio/n8n # Linux: map host.docker.internal to the host gateway. docker run -it --rm \ --add-host=host.docker.internal:host-gateway \ -p 5678:5678 \ -v n8n_data:/home/node/.n8n \ docker.n8n.io/n8nio/n8n # Both node URLs then become: # http://host.docker.internal:8080/in.php # http://host.docker.internal:8080/res.php
Jika n8n dan pemecah CAPTCHA berjalan di jaringan Docker yang sama, gunakan nama service-nya. Aturannya sama saja: URL harus bisa di-resolve dari dalam container, bukan dari terminal Anda.
Menjalankan CapSkip di server sebagai gantinya
CapSkip tidak harus berada di mesin yang sama dengan n8n. Menu pengaturan koneksi memiliki dua mode, dan mode kedualah yang membuat ini bekerja dengan n8n versi hosted.
| Mode | Mendengarkan di | Gunakan saat |
|---|---|---|
| Lokal | 127.0.0.1, hanya perangkat itu | n8n dan CapSkip berjalan di komputer yang sama |
| Server | Jaringan Anda atau IP publik | n8n berjalan di tempat lain: mesin lain, sebuah VPS, atau n8n Cloud |
Tempatkan CapSkip di sebuah VPS dalam mode Server dan setiap mesin di tim Anda mengarah ke satu instance. URL node menjadi http://YOUR_SERVER_IP:8080/in.php dan http://YOUR_SERVER_IP:8080/res.php, dan tidak ada lagi yang berubah di workflow. IP publik statis layak dimiliki, karena URL tersebut dipatok di dalam node dan alamat yang berubah akan merusaknya.
Ini tetap perangkat keras milik Anda sendiri dan tetap tanpa hitungan pemakaian. Mode Server memindahkan lokasi tempat pemecah berjalan, bukan kepemilikannya, jadi Anda tetap tidak membayar per pemecahan.
Kesalahan umum dan artinya
| Respons | Penyebab | Perbaiki |
|---|---|---|
ECONNREFUSED | Pemecah CAPTCHA tidak berjalan, atau container tidak dapat melihat host | Jalankan layanan lokalnya, lalu terapkan perbaikan Docker di atas |
ERROR_WRONG_USER_KEY | Kolom key kosong atau tidak ada | Kirim string apa pun yang tidak kosong |
ERROR_GOOGLEKEY | Sitekey salah, terpotong, atau berasal dari halaman lain | Baca ulang atribut data-sitekey pada halaman aslinya |
ERROR_PAGEURL | Kolom pageurl tidak menyertakan skema atau mengarah ke tempat lain | Kirim URL lengkap termasuk https |
| Loop tidak pernah berhenti | Node IF membandingkan dengan string ready yang salah eja | Cocokkan ejaan CAPCHA_NOT_READY persis |
ERROR_CAPTCHA_UNSOLVABLE | Job gagal, bukan kehabisan waktu | Kirim ulang dengan nilai challenge yang baru |
Setiap kode yang dapat dikembalikan API tercantum di dokumentasi API, beserta parameter yang menyebabkan masing-masing kode.
FAQ
Apakah ini berfungsi di n8n Cloud?
Ya, dengan CapSkip dalam mode Server. Worker cloud berjalan di infrastruktur n8n, sehingga worker tersebut tidak dapat melihat 127.0.0.1 di desktop Anda, dan itulah satu-satunya alamat yang diizinkan mode Local. Ubah pengaturan koneksi ke mode Server, jalankan CapSkip di sebuah VPS dengan IP publik statis, lalu arahkan node ke alamat tersebut. Jika Anda lebih suka menyimpan semuanya di satu mesin, jalankan n8n secara self-hosted di sampingnya dan tetap gunakan mode Local.
Berapa banyak eksekusi yang dihabiskan loop polling ini?
Satu. Loop di dalam sebuah alur kerja tetap dihitung satu eksekusi, berapa kali pun ia berputar, jadi pasangan Wait dan IF tidak melipatgandakan jumlah eksekusi Anda. Loop itu memang menahan eksekusi tetap terbuka, dan hal ini berpengaruh jika Anda menjalankan banyak alur kerja sekaligus di instance kecil.
Bisakah saya memecahkan beberapa CAPTCHA dalam satu proses?
Ya. Node HTTP Request berjalan sekali untuk setiap item masukan, jadi memberinya daftar pasangan sitekey dan URL akan mengirimkan semuanya dan memberi Anda satu captcha ID per item. Jaga agar setiap ID tetap berpasangan dengan item asalnya sepanjang loop, dan gunakan node Split In Batches jika Anda ingin membatasi berapa banyak yang berjalan sekaligus.
Apakah saya perlu proxy?
Biasanya tidak. Tambahkan kolom proxy dan proxytype ke node submit hanya jika situs target menolak token yang dipecahkan dari jaringan yang berbeda dengan jaringan yang memuat halamannya. Proxy berlaku untuk reCAPTCHA, Turnstile, dan GeeTest, dan diabaikan untuk CAPTCHA gambar.
Menyambungkannya ke alur kerja nyata
Kelima node di atas bisa dipasang ke alur kerja apa pun yang berhadapan dengan formulir terproteksi: scraper penangkap lead, pengecekan harga tiap malam, atau alat internal yang masuk ke portal lawas. Karena yang dipakai adalah pemecah captcha yang berjalan di perangkat keras Anda sendiri, sitekey dan URL halaman yang Anda berikan tidak pernah meninggalkan komputer itu, dan loop-nya tidak menimbulkan biaya per proses. Jika Anda lebih suka memanggilnya dari node Code dalam JavaScript atau Python alih-alih node HTTP Request, SDK resmi membungkus dua endpoint yang sama, dan detail khusus reCAPTCHA v2 dibahas secara terpisah.
