Cara Memecahkan CAPTCHA di Activepieces (Piece HTTP)

Pemecahan captcha di Activepieces terdiri dari tiga langkah: kirim challenge, tunggu, baca token. Bangun alurnya di atas piece HTTP, bukan di langkah Code, karena apakah langkah Code bisa memakai npm sama sekali bergantung pada mode sandbox yang dijalankan instance Anda, dan mode yang dipakai Activepieces Cloud tidak memiliki npm. Piece HTTP bekerja di semua mode. Ada satu pengaturan kedua yang lebih menentukan daripada kodenya, dan pengaturan itu memutuskan apakah alur Anda bisa menjangkau pemecah di alamat privat sama sekali.
Apa yang Anda butuhkan
- Sebuah proyek Activepieces tempat Anda bisa mempublikasikan alur, di cloud mereka atau self-hosted.
- CapSkip yang berjalan di komputer Windows. Mode Local hanya cocok jika Activepieces berjalan di komputer yang sama, yang dalam praktiknya berarti instalasi self-hosted. Selain itu semuanya butuh mode Server.
- Sitekey dan URL halaman dari situs yang Anda otomatisasi.
- Sebuah variabel proyek yang menyimpan kunci pemecah, sehingga kunci itu tidak tertulis di badan alur.
- Pada instance self-hosted dengan jaringan yang diperketat, satu entri di daftar izin SSRF. Langkah 3 membahas hal ini.
Mengapa piece HTTP dan bukan langkah Code
Editor langkah Code punya dialog Add npm package. Dialog itu mencari paketnya di registry npm, mengunci versi terbaru dan menuliskannya ke daftar dependensi langkah tersebut. Di Activepieces Cloud daftar itu kemudian dibuang.
Activepieces membangun langkah Code dengan menulis kode sumber Anda ke sebuah file TypeScript, menginstal dependensinya dan membundel hasilnya. Proses build hanya meminta dependensi Anda jika mode eksekusi pada instance itu mengizinkan paket. Pada V8 sandboxing, yaitu mode yang menurut dokumentasi Activepieces dipakai cloud mereka, paket tidak diizinkan, sehingga proses build menggantinya dengan kumpulan dependensi kosong dan tetap mengompilasi. Langkahnya ter-deploy tanpa masalah. Import-nya baru gagal saat alur dijalankan.
| Mode eksekusi | npm di langkah Code | Apa artinya untuk alur ini |
|---|---|---|
| V8 sandboxing, nilai SANDBOX_CODE_ONLY | Tidak ada paket npm | Gunakan piece HTTP. Ini adalah Activepieces Cloud |
| Sandboxing gabungan, SANDBOX_CODE_AND_PROCESS | Tidak ada paket npm | Gunakan piece HTTP |
| Namespace kernel, SANDBOX_PROCESS | Paket npm berfungsi | SDK Node berfungsi, dan ia melakukan polling untuk Anda |
| Tanpa sandboxing, UNSANDBOXED | Paket npm berfungsi | SDK Node berfungsi, dan ia melakukan polling untuk Anda |
Jadi ada dua cara jujur untuk melakukan ini, dan yang mana yang Anda dapat bukan pilihan Anda, melainkan pilihan administrator Anda. Jalur piece HTTP di bawah ini bekerja di keempat mode. Jalur langkah Code di akhir panduan ini bekerja di dua di antaranya dan jauh lebih singkat kalau Anda memilikinya.
Langkah 1: kirim challenge
CapSkip berbicara dengan API yang kompatibel dengan 2captcha di port 8080, sehingga piece HTTP bisa berkomunikasi dengannya tanpa konektor yang perlu diinstal. Tambahkan aksi Send HTTP Request, atur method ke POST dan URL ke endpoint submit pada pemecah Anda.
{
"key": "{{variables['CAPSKIP_KEY']}}",
"method": "userrecaptcha",
"googlekey": "YOUR_SITEKEY",
"pageurl": "https://example.com/page-with-recaptcha",
"json": 1
}Responsnya berupa objek JSON kecil yang bidang request-nya berisi id yang Anda pakai untuk polling.
{ "status": 1, "request": "2122988149" }Itu untuk reCAPTCHA v2. Jenis lain yang didukung CapSkip memakai panggilan yang sama dengan parameter berbeda: tambahkan invisible atau enterprise yang diatur ke 1, atau version yang diatur ke v3 dengan nama action, atau ganti method menjadi turnstile atau geetest. Daftar parameter lengkapnya ada di dokumentasi API CapSkip.
Rujuk kuncinya dengan sintaks variabel proyek, jangan menempelkannya langsung. Variabel dienkripsi saat disimpan dan tidak pernah ditampilkan kembali kepada Anda di daftar variabel, dan mengganti satu variabel cukup satu kali edit, bukan berburu ke setiap alur.
Langkah 2: tunggu, lalu baca token
Tambahkan aksi Delay For, lalu permintaan HTTP kedua yang membaca hasilnya. Dua puluh detik adalah waktu tunggu pertama yang masuk akal untuk kotak centang reCAPTCHA v2. CAPTCHA gambar kembali dalam sekitar satu detik, v3 dalam sepuluh sampai lima belas detik, GeeTest sekitar lima detik.
# GET, with the id from step 1 in the query string. http://127.0.0.1:8080/res.php?key=YOUR_KEY&action=get&id=2122988149&json=1
Ada dua jawaban yang mungkin. Hasil yang sudah siap berupa objek JSON dengan bentuk seperti respons submit, dengan tokennya di bidang request. Hasil yang belum siap berupa string CAPCHA_NOT_READY, dieja tanpa huruf T, dan artinya teruslah menunggu, bukan ada sesuatu yang salah. Riwayat ejaan itu ada di ulasan lengkap tentang respons CAPCHA_NOT_READY.
Piece Delay berperilaku berbeda di bawah dan di atas sepuluh detik, dan inilah detail yang membuat pola polling di sini jadi murah. Delay sepuluh detik atau kurang akan tidur di dalam proses worker. Apa pun yang lebih lama akan membuat waitpoint, menangguhkan eksekusi dan melanjutkannya ketika waktunya habis. Waktu tertangguh bukan waktu eksekusi, dan Activepieces mendokumentasikan bahwa alur yang dijeda oleh Delay atau oleh Wait for Approval tidak diperhitungkan terhadap batas waktu eksekusi. Jadi menunggu dua puluh detik tidak memakan apa pun dari jatah sepuluh menit Anda, begitu pula tunggu kedua.
Jika satu kali baca tidak cukup, tambahkan Delay lagi dan pembacaan lagi, bukan memakai loop. Ada dua alasan. Loop on Items menjalankan setiap item di daftar, jadi iterasinya tetap terjadi entah tokennya sudah datang atau belum, dan Router di dalamnya hanya menghemat pekerjaan di cabang itu, bukan perjalanan mengelilingi loop-nya. Yang lebih penting, hasil CapSkip hanya bisa dibaca sekali, jadi loop yang membaca ulang id yang sudah dikumpulkannya tidak mendapat token dua kali, melainkan mendapat error pada pembacaan kedua.
Langkah 3: pengaturan jaringan yang memblokir pemecah lokal
Ini bagian yang sering menjebak orang, dan ini khas Activepieces, bukan saran umum untuk orkestrator. Activepieces punya penjaga SSRF untuk kode alur, yang dikendalikan oleh variabel bernama AP_NETWORK_MODE. Nilai default-nya UNRESTRICTED. Jika diatur ke STRICT, engine akan menambal fungsi DNS lookup dan socket connect milik Node sebelum kode alur mana pun berjalan, dan menolak setiap koneksi yang alamatnya loopback, privat RFC1918, link-local atau metadata cloud. Ia melempar error bernama SSRFBlockedError.
Pemecah CAPTCHA di jaringan Anda sendiri persis berbentuk seperti yang diblokir penjaga itu. Baik 127.0.0.1 maupun alamat LAN seperti 192.168.1.40 ada di daftar tersebut. Itu penjaga yang sedang bekerja sebagaimana mestinya, bukan bug, dan Activepieces memberi Anda pengecualian resmi untuk itu: masukkan alamat pemecah ke AP_SSRF_ALLOW_LIST, yang menerima IP dan rentang CIDR dipisahkan koma dan berlaku untuk kode alur maupun untuk permintaan keluar milik server itu sendiri. Restart server setelah mengubahnya.
# On a self-hosted Activepieces with AP_NETWORK_MODE=STRICT, # name the solver machine or its subnet so flows can reach it. AP_SSRF_ALLOW_LIST=192.168.1.40,10.0.5.0/24
Terlepas dari penjaga itu, alurnya tetap harus bisa menjangkau komputer tersebut. CapSkip punya dua mode koneksi untuk ini. Local mengikat ke 127.0.0.1 dan hanya melayani perangkat itu. Server mengikat ke alamat jaringan atau IP publik Anda, sehingga mesin lain, host container atau platform hosting bisa menjangkau komputer Windows yang sama lewat API. Keduanya ada di bawah pengaturan koneksi, dan mode Server hanya mengubah di alamat mana pemecah mendengarkan. Perangkat kerasnya tetap milik Anda dan pemecahannya tetap tanpa batas.
| Di mana Activepieces berjalan | Mode mana, dan apa lagi |
|---|---|
| Self-hosted di komputer Windows yang sama dengan CapSkip | Mode Local, host tetap 127.0.0.1. Masukkan ke daftar izin jika mode jaringannya STRICT |
| Self-hosted di Docker atau di mesin lain pada jaringan Anda | Mode Server dengan alamat LAN pemecah. Masukkan alamat itu ke daftar izin juga |
| Activepieces Cloud | Mode Server dengan IP publik statis dan aturan firewall. Penjaga SSRF tetap berjalan tetapi tidak memblokir, karena alamat publik tidak ada di daftar blokirnya |
Langkah 4: batas waktu dan percobaan ulang
Tiga angka menentukan apakah pemecahan yang lambat bisa bertahan, dan hanya satu di antaranya yang bisa Anda atur di dalam alur.
| Batas yang mana | Nilai | Mengapa ini penting bagi sebuah pemecahan |
|---|---|---|
| Seluruh eksekusi, dan setiap aksi tunggal, dibatasi secara independen satu sama lain | Masing-masing sepuluh menit, keduanya dari satu variabel AP_FLOW_TIMEOUT_SECONDS | Longgar, karena waktu delay tidak diperhitungkan terhadap batas waktu eksekusi alur |
| Batas waktu respons webhook sinkron | Tiga puluh detik, diatur oleh AP_WEBHOOK_TIMEOUT_SECONDS | Ini jebakannya. Lihat paragraf di bawah |
| Retry on Failure, per langkah | Empat percobaan, dengan waktu tunggu empat, delapan dan enam belas detik | Menangani pemecah yang sedang restart, bukan yang sekadar lambat |
Angka webhook itulah yang menggigit. URL webhook yang berakhiran kata sync menahan koneksi HTTP tetap terbuka dan menjawab dengan hasil alur, dan ia menyerah setelah tiga puluh detik. Pemecahan reCAPTCHA v2 tidak selalu selesai dalam tiga puluh detik, jadi pemanggil yang memicu alur secara sinkron dan mengharapkan token kembali akan menerima HTTP 408 sementara alurnya terus berjalan di belakang. Picu alur secara asinkron dan biarkan ia mengirim token ke tempat yang Anda butuhkan, atau pecah pekerjaannya sehingga bagian sinkronnya tidak pernah menunggu pemecahan.
Retry on Failure layak diaktifkan untuk langkah pengiriman dan tidak untuk langkah pembacaan. Jeda mundurnya eksponensial dari basis dua detik, sehingga waktu tunggunya kira-kira empat, delapan dan enam belas detik sepanjang empat percobaan. Itu tepat untuk koneksi yang ditolak. Itu keliru untuk token yang sudah Anda kumpulkan, karena aturan baca sekali di atas.
Semuanya dalam satu langkah, di instance self-hosted
Jika administrator Anda menjalankan tanpa sandboxing atau dengan sandboxing namespace kernel, alur di atas menyusut menjadi satu langkah Code, karena SDK-nya melakukan polling untuk Anda. Tambahkan capskip di dialog npm, lalu tulis langkahnya. Langkah Code ditulis dalam TypeScript dan dibundel sebelum dijalankan, sehingga import biasa sudah cukup.
// npm install capskip - add it in the step's package dialog.
import { CapSkip } from 'capskip';
export const code = async (inputs) => {
// host is the solver machine. Keep 127.0.0.1 only when
// Activepieces runs on the same Windows box as CapSkip.
const solver = new CapSkip({
host: inputs.capskipHost,
port: 8080,
apiKey: inputs.capskipKey,
});
const result = await solver.recaptcha(inputs.sitekey, inputs.pageUrl);
// Return the token, not the whole result. The next step
// submits it, and run logs keep whatever you return.
return { token: result.code };
};Berikan capskipKey sebagai input langkah yang berisi rujukan variabel proyek, sehingga kuncinya diselesaikan saat runtime dan tidak pernah muncul di kode sumber. SDK mulai melakukan polling pada 250 milidetik lalu melambat secara bertahap, bukan tidur dengan interval tetap, dan itulah sebabnya versi ini biasanya kembali lebih cepat daripada alur berbasis Delay. Batas atasnya untuk reCAPTCHA, Turnstile dan GeeTest adalah 300 detik, jauh di dalam batas waktu aksi sepuluh menit.
Kirim tokennya di langkah yang langsung menyusul. Token reCAPTCHA berlaku sekitar dua menit, jadi alur yang memecahkan, menunggu di langkah persetujuan lalu mengirim akan gagal dengan token yang tadinya benar-benar valid saat dibuat. Mode kegagalan itu dibahas di panduan tentang kedaluwarsa token reCAPTCHA.
Kesalahan umum dan artinya
| Apa yang Anda lihat | Penyebab | Perbaiki |
|---|---|---|
| SSRFBlockedError di log eksekusi | Mode jaringannya STRICT dan pemecah berada di alamat privat | Tambahkan alamatnya ke AP_SSRF_ALLOW_LIST dan restart server |
| Modul capskip tidak ditemukan saat alur dijalankan | Mode sandbox membuang dependensinya saat build | Bangun ulang langkahnya sebagai panggilan piece HTTP, atau self-host dengan mode yang mengizinkan paket |
| Koneksi ditolak di port 8080 | CapSkip terikat ke loopback sementara worker-nya ada di tempat lain | Beralih ke mode Server dan gunakan alamat jaringan pemecah |
| Pembacaan mengembalikan CAPCHA_NOT_READY setiap kali | Delay-nya lebih singkat daripada waktu pemecahan | Naikkan Delay pertama, atau tambahkan satu delay dan pembacaan lagi |
| Pembacaan kedua atas id yang sama gagal | Hasil CapSkip hanya bisa dibaca sekali | Simpan token di output langkah, jangan pernah membaca ulang id-nya |
| ERROR_WRONG_USER_KEY di dalam respons | Variabel proyek menghasilkan string kosong | Periksa nama variabelnya, termasuk huruf besar kecilnya yang persis |
| HTTP 408 dari webhook sinkron | Pemecahan berlangsung melewati batas waktu webhook tiga puluh detik | Picu secara asinkron, atau pindahkan pemecahannya keluar dari jalur sinkron |
| Token yang valid ditolak oleh situs target | Token kedaluwarsa di antara langkah pemecahan dan langkah pengiriman | Kirim di langkah berikutnya, tanpa persetujuan atau delay di antaranya |
FAQ
Bisakah saya menggunakan CapSkip dari Activepieces Cloud?
Ya, dengan mode Server. Worker-nya ada di infrastruktur Activepieces, bukan milik Anda, jadi pemecah harus mendengarkan di alamat yang bisa mereka jangkau: sebuah IP publik, idealnya yang statis, dengan aturan firewall yang mengizinkan trafik mereka masuk. Tidak ada yang berubah pada pemecahnya, hanya tempat ia mendengarkan. Yang tidak bisa Anda lakukan di cloud mereka adalah memakai SDK Node di langkah Code, karena mode itu tidak punya npm, jadi bangunlah alurnya di atas piece HTTP.
Mengapa menambahkan paket npm tampak berhasil?
Karena dialognya adalah fitur antarmuka sementara penyaringannya terjadi di server. Dialog itu menemukan paketnya di registry npm dan mencatatnya. Saat build, server menanyakan apakah mode eksekusi mengizinkan paket, dan jika tidak, ia menukarnya dengan kumpulan dependensi kosong sebelum menginstal. Langkahnya terkompilasi dan ter-deploy tanpa peringatan. Anda baru tahu saat dijalankan, ketika import-nya tidak menemukan apa pun.
Haruskah alurnya melakukan loop sampai tokennya datang?
Biasanya tidak. Loop on Items menjalankan seluruh daftar item-nya, jadi Anda membayar setiap iterasi yang Anda konfigurasikan, dan setiap iterasi akan membaca ulang id yang hanya bisa dibaca sekali. Delay dengan panjang yang tepat ditambah satu kali pembacaan lebih murah sekaligus benar, dan satu delay serta pembacaan kedua adalah cadangan yang baik. Delay panjang di sini luar biasa murah, karena delay di atas sepuluh detik menangguhkan eksekusi alih-alih menduduki worker, dan waktu tertangguh tidak diperhitungkan terhadap batas waktu eksekusi.
Bagaimana perbandingannya dengan n8n, Make.com atau Zapier?
Permintaannya identik di keempat alat itu. Yang berbeda adalah rintangan yang ditaruh masing-masing di depannya.
- Untuk n8n rintangannya adalah jaringan container, dan panduan alur kerja n8n membahasnya sampai tuntas.
- Untuk Make.com rintangannya adalah sertifikat yang dituntut modul HTTP-nya, dan panduan langkah demi langkah Make.com membahasnya secara lengkap.
- Untuk Zapier rintangannya adalah batas waktu eksekusi pada langkah Code, yang dijelaskan di panduan Zapier.
Activepieces menambahkan dua rintangan miliknya sendiri: mode sandbox yang menentukan apakah npm ada sama sekali, dan penjaga SSRF yang bisa menolak alamat privat begitu saja.
Versi singkatnya
Bangun pemecahannya di atas piece HTTP, karena piece ini bekerja di semua mode sandbox sedangkan jalur langkah Code tidak. Kirim ke endpoint submit, beri delay lebih dari sepuluh detik supaya eksekusinya ditangguhkan alih-alih menduduki worker, lalu baca hasilnya sekali dan simpan. Taruh kuncinya di variabel proyek. Jika instance-nya self-hosted dengan mode jaringan yang ketat, tambahkan pemecah ke daftar izin SSRF, dan jika Activepieces berjalan di mana pun selain komputer pemecah itu sendiri, alihkan CapSkip ke mode Server. Jangan pernah menunggu pemecahan pada webhook sinkron.
- Kotak centang reCAPTCHA v2 itu sendiri dibahas di halaman pemecah reCAPTCHA v2.
- Versi satu panggilan yang setara dalam Python, Node.js, PHP dan C# tercantum di halaman SDK pemecahan CAPTCHA.
Satu hal yang layak ditimbang sebelum Anda menjadwalkan alur ini setiap beberapa menit: CapSkip adalah pemecah captcha tanpa batas yang berjalan di hardware yang sudah Anda miliki, jadi flow yang berjalan terus-menerus dan yang berjalan sesekali biayanya persis sama.
