Cara Memecahkan CAPTCHA di Retool Workflows (Blok REST)

Pemecahan captcha di Retool Workflows terdiri dari tiga blok: submit, wait, read. Bangun ketiganya sebagai REST resource query block, bukan sebagai code block JavaScript atau Python, karena Retool menjalankan code block di layanan sandbox terpisah yang aturan firewall bawaannya menolak alamat privat. Sebuah resource query adalah konfigurasi, bukan kode kustom, jadi ia tidak melewati layanan tersebut dan bisa menjangkau pemecah CAPTCHA di jaringan Anda sendiri tanpa perdebatan itu sama sekali.
Apa yang Anda butuhkan
- Organisasi Retool dengan Workflows, di Retool Cloud atau self-hosted. Keduanya bisa dipakai, dengan penyiapan jaringan yang berbeda.
- CapSkip berjalan di komputer Windows. Gunakan mode Local jika komputer itu juga menjalankan Retool self-hosted, dan mode Server untuk semua kasus lainnya.
- Sitekey dan URL halaman dari tantangan yang sedang Anda pecahkan.
- Tempat untuk menaruh API key. Retool secrets bisa diakses dari code block maupun dari konfigurasi resource, jadi tidak ada yang perlu ditempelkan ke dalam blok.
CapSkip berbicara dengan API yang kompatibel dengan 2captcha di port 8080, jadi Retool tidak memerlukan konektor maupun integrasi kustom. Ini hanya resource REST biasa yang diarahkan ke komputer milik Anda sendiri.
Langkah 1: arahkan sebuah resource REST ke pemecah CAPTCHA
Buat resource REST API dengan base URL komputer yang menjalankan CapSkip. Biarkan autentikasi kosong. API key dikirim sebagai parameter biasa pada setiap permintaan, dan memang begitulah cara kerja protokol yang kompatibel dengan 2captcha.
# Base URL for the resource. Loopback only works when Retool # is self-hosted on the same Windows box as the solver. http://127.0.0.1:8080 # Server mode, which is what you want everywhere else. http://192.168.1.40:8080
Setiap workflow yang memecahkan apa pun kemudian memakai ulang satu resource ini. Dua query block sudah cukup untuk seluruh pekerjaan.
Langkah 2: kirim tantangannya
Tambahkan sebuah resource query block, beri nama submitCaptcha, atur action type ke POST dan path ke endpoint submit. Body-nya berupa objek JSON kecil.
{
"key": "YOUR_KEY",
"method": "userrecaptcha",
"googlekey": "YOUR_SITEKEY",
"pageurl": "https://example.com/page-with-recaptcha",
"json": 1
}Respons membawa id yang Anda pakai untuk polling.
{ "status": 1, "request": "2122988149" }Body tersebut adalah untuk reCAPTCHA v2. Tipe lain yang didukung CapSkip memakai panggilan yang sama dengan parameter berbeda: tambahkan invisible atau enterprise bernilai 1, atau version bernilai v3 dengan nama action, atau ganti method menjadi turnstile atau geetest. Daftar parameter lengkapnya ada di dokumentasi API CapSkip.
Sebuah resource query block menyerahkan tiga properti kepada semua blok di bawahnya. Body respons datang sebagai data, pesan kegagalan datang sebagai error, dan metadata membawa sisanya. Jadi id yang baru saja Anda ambil tersedia untuk blok berikutnya sebagai submitCaptcha.data.request.
Langkah 3: tunggu, lalu baca token satu kali
Tambahkan sebuah Wait block. Lima belas detik adalah waktu tunggu pertama yang masuk akal untuk reCAPTCHA v2 checkbox. CAPTCHA gambar kembali dalam sekitar satu detik, v3 dalam sepuluh sampai lima belas detik, GeeTest sekitar lima detik. Wait block menerima angka atau ekspresi JavaScript dan bisa dikonfigurasi dalam satuan detik, menit, jam atau hari, sampai batas maksimum enam puluh hari, dan ia hanya menjeda blok yang langsung berada di bawahnya.
Lalu tambahkan resource query block kedua bernama readResult, disetel ke GET.
# GET, with the id from step 2 in the query string.
/res.php?key=YOUR_KEY&action=get&id={{ submitCaptcha.data.request }}&json=1Ada dua kemungkinan jawaban. Hasil yang sudah siap memiliki status bernilai 1 dan token di field request. Hasil yang masih diproses memiliki status bernilai 0 dan string CAPCHA_NOT_READY di field request, ditulis tanpa huruf T, dan itu berarti teruslah menunggu, bukan berarti ada yang salah. Riwayat penulisan itu ada di ulasan lengkap tentang respons CAPCHA_NOT_READY.
Tangani kedua kasus itu dengan sebuah Branch block. Kondisinya berupa JavaScript biasa terhadap blok di atasnya, jadi pengujiannya berbunyi readResult.data.status === 1. Jalur If meneruskan token. Jalur Else mendapat Wait kedua selama dua puluh detik dan pembacaan kedua.
Tahan keinginan untuk menggantinya dengan Loop block. Ada dua alasan, dan alasan kedua yang benar-benar menyakitkan. Loop block punya timeout bawaan sepuluh detik dan batas maksimum dua menit, jauh di bawah tiga ratus detik yang diberikan CapSkip untuk sebuah pemecahan reCAPTCHA, jadi loop tetap tidak bisa menutupi kasus yang lambat. Yang lebih penting, hasil CapSkip hanya bisa dibaca sekali. Loop yang membaca ulang id yang sudah pernah diambilnya tidak akan mendapatkan token untuk kedua kalinya.
Langkah 4: aturan jaringan yang menentukan segalanya
Ini bagian yang khusus untuk Retool, dan inilah alasan panduan ini membangun proses pemecahan dari resource query block.
Retool menjalankan JavaScript dan Python Anda di layanan code executor terpisah yang di-sandbox dengan NsJail. Pada deployment self-hosted, layanan itu disertai aturan iptables yang mencakup alamat link local dan seluruh 192.168.0.0/16, dan Retool mendokumentasikan satu sakelar untuk mematikannya, yaitu DISABLE_IPTABLES_SECURITY_CONFIGURATION. Retool juga menyatakan dengan jelas bahwa mereka menyarankan menjalankan code executor secara privileged agar kode kustom tetap ter-sandbox. Jadi sebuah code block yang menjangkau pemecah CAPTCHA di 192.168.1.40 sama saja meminta Anda melemahkan sandbox untuk seluruh instance. Sebuah resource query bukan kode kustom dan tidak berjalan di sana.
Terlepas dari itu, pemecah CAPTCHA memang harus bisa dijangkau. CapSkip punya dua mode koneksi untuk ini. Local mengikat ke 127.0.0.1 dan hanya melayani perangkat itu saja. Server mengikat ke alamat jaringan atau IP publik Anda, sehingga komputer lain, host kontainer atau platform hosting bisa menjangkau komputer Windows yang sama lewat API. Keduanya ada di pengaturan koneksi, dan mode Server hanya mengubah di alamat mana pemecah mendengarkan. Perangkat kerasnya tetap milik Anda dan pemecahannya tetap tanpa batas.
| Di mana Retool berjalan | Mode mana, dan apa lagi |
|---|---|
| Self-hosted di komputer Windows yang sama dengan CapSkip | Pakai mode Local. Base URL tetap di loopback |
| Self-hosted di komputer lain atau di Docker pada jaringan Anda | Pakai mode Server dengan alamat LAN pemecah CAPTCHA. Gunakan resource query block, bukan code block |
| Retool Cloud | Pakai mode Server dengan IP publik statis, ditambah aturan firewall masuk untuk alamat keluar Retool |
Retool Cloud memanggil resource Anda dari sekumpulan alamat tetap yang dipublikasikan, dan dokumentasinya menyebutkan bahwa instance cloud harus memastikan resource yang dikonfigurasi mengizinkan akses dari alamat tersebut. Region bawaannya adalah AWS us-west-2.
# Retool Cloud outbound ranges, us-west-2, the default region. 35.90.103.132/30 44.208.168.68/30 # eu-central-1 3.77.79.248/30
Izinkan alamat itu pada firewall di depan port 8080 dan tolak semua yang lain. Celah yang terbuka jauh lebih kecil daripada kelihatannya, dan hanya itulah keseluruhan cerita Retool Cloud.
Langkah 5: timeout yang menentukan apakah pemecahan yang lambat bisa bertahan
Retool menerbitkan batas maksimum yang berbeda untuk tipe blok yang berbeda, dan itu penting di sini karena pemecahan CAPTCHA memang lambat secara alami.
| Batas yang mana | Nilai | Mengapa ini penting bagi sebuah pemecahan |
|---|---|---|
| Resource query block, eksekusi asinkron | Hingga 10 menit | Lega. Satu kali pembacaan selesai jauh di bawah satu detik |
| Resource query block, eksekusi sinkron | Hingga 2 menit | Tetap cukup untuk sebuah pembacaan, karena penantiannya terjadi di Wait block |
| Loop block | 10 detik secara default, maksimal 2 menit | Alasan mengapa loop polling adalah bentuk yang salah di sini |
| Seluruh eksekusi, asinkron | 30 jam, dan tanpa batas dengan Wait block | Tidak ada bagian dari pemecahan CAPTCHA yang mendekati angka itu |
| Seluruh eksekusi, sinkron | 15 menit sampai Response block webhook yang pertama | Ini jebakannya. Lihat paragraf di bawah |
| Permintaan eksternal bersamaan per workflow | 50 sekaligus | Batas sebenarnya untuk sekumpulan pemecahan dalam satu eksekusi |
| Interval trigger terjadwal | Minimal satu menit | Aman, dan menjalankannya sesering itu sama sekali tidak menambah biaya |
Angka sinkron itulah yang perlu Anda jadikan patokan perencanaan. Trigger webhook yang menahan koneksi tetap terbuka dan menjawab dengan Response block memberi Anda lima belas menit, yang terdengar longgar sampai Anda ingat bahwa pemanggil yang duduk menunggu di koneksi HTTP terbuka selama dua menit demi sebuah reCAPTCHA sudah merupakan desain yang buruk dengan sendirinya. Picu workflow secara asinkron lalu biarkan ia mengirim token ke tempat yang membutuhkannya, atau jawab webhook itu segera dan lakukan pemecahan di belakangnya.
Resource query block juga punya pengaturan jumlah percobaan ulang dan exponential backoff sendiri. Aktifkan pengaturan itu untuk submitCaptcha dan biarkan nonaktif untuk readResult, karena alasan baca sekali di atas.
Jika Anda lebih suka menulis kode
Pada instance self-hosted yang code executor-nya bisa menjangkau pemecah CAPTCHA, seluruh alur bisa diringkas menjadi satu code block Python, karena SDK melakukan polling untuk Anda. Tambahkan dulu capskip ke requirements.txt milik workflow di tab Libraries.
# pip install capskip - add it in the Libraries tab instead.
from capskip import CapSkip
# host is the solver machine. Keep 127.0.0.1 only when Retool
# runs on the same Windows box as CapSkip.
solver = CapSkip(host="192.168.1.40", port=8080)
result = solver.recaptcha(
sitekey="YOUR_SITEKEY",
url="https://example.com/page-with-recaptcha",
)
# Python blocks serialize their output as JSON, so return
# the token rather than the client object.
{"token": result["code"]}SDK mulai melakukan polling pada 250 milidetik lalu melambat sampai lima detik, alih-alih tidur pada interval tetap, sehingga versi ini biasanya kembali lebih cepat daripada alur berbasis Wait. Batas maksimumnya untuk reCAPTCHA, Turnstile dan GeeTest adalah tiga ratus detik, masih di dalam timeout code block asinkron sepuluh menit. Retool Cloud menjalankan Python 3.10 secara default, dan versi satu panggilan yang setara untuk Node.js, PHP dan C# ada di halaman SDK pemecahan CAPTCHA.
Kirim token pada blok yang langsung mengikutinya. Token reCAPTCHA hanya berlaku sekitar dua menit, jadi workflow yang memecahkan, menunggu di Wait block yang panjang lalu mengirimkannya akan gagal dengan token yang tadinya valid saat dibuat. Mode kegagalan itu dibahas dalam panduan tentang kedaluwarsa token reCAPTCHA.
Kesalahan umum dan artinya
| Apa yang Anda lihat | Penyebab | Perbaiki |
|---|---|---|
| Sebuah code block timeout saat menjangkau alamat LAN | Aturan iptables bawaan pada code executor self-hosted mencakup 192.168.0.0/16 | Pindahkan panggilan itu ke dalam sebuah REST resource query block |
| Koneksi ditolak di port 8080 | CapSkip terikat ke loopback sementara Retool berada di tempat lain | Beralih ke mode Server dan gunakan alamat jaringan pemecah |
| Retool Cloud sama sekali tidak bisa menjangkau resource | Firewall tidak mengizinkan alamat keluar Retool | Izinkan rentang alamat yang dipublikasikan untuk region Anda pada port 8080 |
| readResult selalu mengembalikan CAPCHA_NOT_READY | Wait block lebih pendek daripada waktu yang dibutuhkan pemecahan | Naikkan waktu tunggu pertama, atau tambahkan tunggu dan pembacaan kedua di jalur Else |
| Pembacaan kedua atas id yang sama kembali kosong | Hasil CapSkip hanya bisa dibaca sekali | Simpan token di output blok, jangan pernah membaca ulang id-nya |
| ERROR_WRONG_USER_KEY di dalam respons | Parameter key bernilai string kosong | Periksa nama secret, termasuk persis huruf besar kecilnya |
| Token yang valid ditolak oleh situs target | Token kedaluwarsa di antara pemecahan dan pengiriman | Kirim di blok berikutnya, tanpa Wait di antara keduanya |
| Sekumpulan pemecahan macet di tengah jalan | Satu workflow hanya boleh punya 50 permintaan eksternal yang berjalan bersamaan | Buat Loop block memproses secara batch, atau bagi pekerjaannya ke beberapa eksekusi |
FAQ
Bisakah saya memakai CapSkip dari Retool Cloud?
Bisa, dengan mode Server. Retool Cloud memanggil resource Anda dari infrastruktur mereka sendiri, jadi pemecah CAPTCHA harus mendengarkan di alamat yang bisa mereka jangkau: sebuah IP publik, idealnya yang statis. Retool mempublikasikan rentang alamat keluar yang mereka pakai, jadi aturan firewall-nya sempit, bukan terbuka ke seluruh dunia. Tidak ada yang berubah pada pemecah CAPTCHA dan tidak ada yang menjadi berbayar per pemakaian. Satu-satunya perbedaan adalah alamat yang didengarkannya.
Kenapa tidak pakai blok JavaScript dengan axios saja?
Karena tempat kode itu dijalankan. Retool mengeksekusi code block di layanan terpisah yang di-sandbox dengan NsJail, dan pada deployment self-hosted layanan itu memasang aturan firewall yang mencakup rentang alamat privat. Mematikannya memang sebuah sakelar yang terdokumentasi, tetapi itu keputusan yang berlaku untuk seluruh instance dan diambil hanya demi memudahkan satu workflow, dan Retool menyarankan untuk tidak melakukannya. Sebuah resource query block menjangkau pemecah CAPTCHA yang sama tanpa perdebatan semacam itu. Pakai code block untuk logika dan resource query block untuk urusan jaringan.
Apakah workflow sebaiknya melakukan loop sampai token datang?
Tidak. Loop block mentok di dua menit, jauh lebih pendek dari tiga ratus detik yang diizinkan untuk sebuah pemecahan reCAPTCHA, dan ia menjalankan setiap iterasi yang Anda tetapkan alih-alih berhenti lebih awal. Di samping itu, sebuah hasil hanya bisa dibaca sekali, jadi pembacaan berulang atas id yang sama hanya membuang perjalanan. Wait block dengan durasi yang tepat ditambah satu kali pembacaan sudah benar dan murah, dan sebuah Branch dengan tunggu serta pembacaan kedua di belakangnya menutupi kasus yang lambat.
Bagaimana perbandingannya dengan n8n atau Pipedream?
Kedua permintaan itu identik di ketiga tool tersebut. Yang berbeda adalah hambatan yang dipasang masing-masing di depannya.
- Untuk n8n hambatannya adalah jaringan kontainer, yang dibahas tuntas di panduan alur kerja n8n.
- Untuk Pipedream hambatannya adalah runtime step dan tempat secret disimpan, yang dibahas di panduan Pipedream.
- Untuk Retool hambatannya adalah firewall milik code executor itu sendiri, dan itulah sebabnya alur di atas tidak pernah menaruh panggilan HTTP di dalam code block.
Versi singkatnya
Arahkan sebuah resource REST ke pemecah CAPTCHA, POST tantangannya, Wait lima belas detik, GET hasilnya, lalu Branch berdasarkan apakah hasilnya sudah siap. Simpan semua HTTP di resource query block, bukan di code block, karena aturan firewall bawaan code executor mencakup alamat privat dan melonggarkannya adalah keputusan yang berlaku untuk seluruh instance. Alihkan CapSkip ke mode Server setiap kali Retool tidak berada di komputer pemecah CAPTCHA itu sendiri, dan pada Retool Cloud izinkan hanya rentang alamat keluar yang dipublikasikan untuk masuk ke port 8080. Jangan pernah menunggu sebuah pemecahan di dalam webhook sinkron.
- Kotak centang reCAPTCHA v2 itu sendiri dibahas di halaman pemecah reCAPTCHA v2.
- Klien Python yang dipakai pada jalur code block didokumentasikan di halaman pemecah CAPTCHA Python.
Satu hal yang layak ditimbang sebelum Anda mengarahkan workflow terjadwal ke sini setiap menit: CapSkip adalah pemecah captcha lokal yang berjalan di perangkat keras yang sudah Anda miliki, jadi workflow yang berjalan setiap menit dan yang berjalan dua kali sehari biayanya sama persis.
