Retool Workflows İçinde CAPTCHA Nasıl Çözülür (REST Blokları)

Retool Workflows içinde bir captcha çözümü üç bloktan oluşur: gönderme, bekleme, okuma. Bunları JavaScript ya da Python code block yerine REST resource query block olarak kurun, çünkü Retool code block’ları ayrı ve izole edilmiş bir serviste çalıştırır ve bu servisin varsayılan güvenlik duvarı kuralları özel adresleri reddeder. Bir resource query özel kod değil yapılandırmadır, bu yüzden o servisten geçmez ve kendi ağınızdaki bir çözücüye hiçbir tartışmaya girmeden ulaşır.
Neye ihtiyacınız var
- Retool Cloud üzerinde ya da kendi sunucunuzda barındırılan, Workflows özelliğine sahip bir Retool organizasyonu. Her ikisi de çalışır, ağ kurulumları farklıdır.
- Bir Windows makinesinde çalışan CapSkip. O makine aynı zamanda kendi barındırdığınız bir Retool kurulumunu da çalıştırıyorsa Local modu, diğer tüm durumlarda Server modu.
- Çözdüğünüz CAPTCHA’nın sitekey değeri ve sayfa URL’si.
- API anahtarını koyacak bir yer. Retool secrets hem code block’lardan hem de resource yapılandırmasından erişilebilir, bu yüzden hiçbir şeyin bir bloğun içine yapıştırılması gerekmez.
CapSkip 8080 portunda 2captcha uyumlu API’yi konuşur, bu yüzden Retool’un ne bir connector’a ne de özel bir entegrasyona ihtiyacı olur. Bu, sahip olduğunuz bir makineye yönlendirilmiş sıradan bir REST resource’udur.
Adım 1: bir REST resource’unu çözücüye yönlendirin
CapSkip’i çalıştıran makinenin temel URL’si ile bir REST API resource’u oluşturun. Kimlik doğrulama alanını boş bırakın. API anahtarı her istekte sıradan bir parametre olarak taşınır, 2captcha uyumlu protokol böyle çalışır.
# 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
Bir şey çözen her workflow bundan sonra bu tek resource’u yeniden kullanır. İşin tamamı için iki query bloğu yeterlidir.
Adım 2: CAPTCHA’yı gönderin
Bir resource query block ekleyin, adını submitCaptcha koyun, action tipini POST ve yolu gönderme uç noktası olarak ayarlayın. Gövde küçük bir JSON nesnesidir.
{
"key": "YOUR_KEY",
"method": "userrecaptcha",
"googlekey": "YOUR_SITEKEY",
"pageurl": "https://example.com/page-with-recaptcha",
"json": 1
}Yanıt, sorgulama yaparken kullanacağınız id’yi taşır.
{ "status": 1, "request": "2122988149" }Bu gövde reCAPTCHA v2 içindir. CapSkip’in desteklediği diğer türler, aynı çağrının farklı parametrelerle kullanılmış halidir: invisible ya da enterprise değerini 1 yapın, ya da version değerini bir action adıyla birlikte v3 yapın, ya da method değerini turnstile veya geetest olarak değiştirin. Tam parametre listesi şurada: CapSkip API dokümantasyonu.
Bir resource query block, kendisinden sonra gelen her şeye üç özellik aktarır. Yanıt gövdesi data olarak gelir, hata mesajı error olarak gelir ve geri kalanını metadata taşır. Yani az önce topladığınız id, sonraki bloğa submitCaptcha.data.request olarak sunulur.
Adım 3: bekleyin, sonra token’ı bir kez okuyun
Bir Wait block ekleyin. Bir reCAPTCHA v2 onay kutusu için on beş saniye makul bir ilk bekleme süresidir. Görsel CAPTCHA’lar yaklaşık bir saniyede, v3 on ila on beş saniyede, GeeTest yaklaşık beş saniyede döner. Bir Wait block bir sayı ya da bir JavaScript ifadesi alır; saniye, dakika, saat veya gün cinsinden yapılandırılabilir, altmış günlük bir üst sınırı vardır ve yalnızca doğrudan kendisinden sonra gelen blokları duraklatır.
Ardından readResult adında, GET olarak ayarlanmış ikinci bir resource query block ekleyin.
# GET, with the id from step 2 in the query string.
/res.php?key=YOUR_KEY&action=get&id={{ submitCaptcha.data.request }}&json=1İki yanıt mümkündür. Hazır bir sonuçta status 1 olur ve token request alanında bulunur. Hâlâ çalışan bir sonuçta ise status 0 olur ve request alanında, T harfi olmadan yazılmış CAPCHA_NOT_READY dizesi bulunur; bu, bir şeylerin ters gittiği değil beklemeye devam edin anlamına gelir. Bu yazımın geçmişi şurada anlatılıyor: CAPCHA_NOT_READY yanıtının tam yazısı.
İki durumu bir Branch block ile ele alın. Koşullar, yukarıdaki bir bloğa karşı yazılan düz JavaScript ifadeleridir, yani test readResult.data.status === 1 şeklinde olur. If yolu token’ı ileri taşır. Else yolu ise yirmi saniyelik ikinci bir Wait ve ikinci bir okuma alır.
Bunu bir Loop block ile değiştirme dürtüsüne direnin. İki neden var ve asıl canınızı yakan ikincisi. Bir Loop block’un varsayılan zaman aşımı on saniye, üst sınırı iki dakikadır; bu, CapSkip’in bir reCAPTCHA çözümüne tanıdığı üç yüz saniyenin epey altındadır, yani bir döngü yavaş kuyruğu zaten kapsayamaz. Daha da önemlisi, bir CapSkip sonucu yalnızca bir kez okunabilir. Zaten topladığı bir id’yi yeniden okuyan bir döngü, token’ı ikinci kez alamaz.
Adım 4: her şeyi belirleyen ağ kuralı
Burası Retool’a özgü kısım ve bu kılavuzun çözümü resource query block’ları üzerine kurmasının nedeni de bu.
Retool, JavaScript ve Python kodunuzu NsJail ile izole edilmiş ayrı bir code executor servisinde çalıştırır. Kendi sunucunuzda barındırılan bir kurulumda bu servis, link local adresleri ve 192.168.0.0/16 aralığının tamamını kapsayan iptables kurallarıyla gelir ve Retool bunları kapatan tek bir anahtarı belgeler: DISABLE_IPTABLES_SECURITY_CONFIGURATION. Retool ayrıca, özel kodun izole kalması için code executor’ı privileged olarak çalıştırmayı önerdiğini açıkça belirtir. Yani 192.168.1.40 adresindeki bir çözücüye uzanan bir code block, sizden tüm örnek için sandbox’ı zayıflatmanızı istiyor demektir. Bir resource query ise özel kod değildir ve orada çalışmaz.
Bundan ayrı olarak, çözücüye erişilebiliyor olması da gerekir. CapSkip’in bunun için iki bağlantı modu vardır. Local, 127.0.0.1 adresine bağlanır ve yalnızca o cihaza hizmet eder. Server ise ağ adresinize ya da genel IP’nize bağlanır, böylece başka bir makine, bir konteyner sunucusu ya da barındırılan bir platform aynı Windows makinesine API üzerinden ulaşabilir. Her ikisi de şurada yer alır: bağlantı ayarları. Server modu yalnızca çözücünün hangi adreste dinlediğini değiştirir. Donanım yine sizindir ve çözüm yine sayaçsızdır.
| Retool nerede çalışıyor | Hangi mod ve başka ne gerekir |
|---|---|
| CapSkip ile aynı Windows makinesinde, kendi sunucunuzda barındırılan | Local modu. Temel URL loopback üzerinde kalır |
| Ağınızdaki başka bir makinede ya da Docker içinde kendi barındırdığınız kurulum | Çözücünün LAN adresiyle Server modu. Bir code block değil, resource query block kullanın |
| Retool Cloud | Statik bir genel IP ile Server modu, ayrıca Retool’un giden adresleri için bir gelen güvenlik duvarı kuralı |
Retool Cloud, resource’larınızı sabit ve yayımlanmış bir adres kümesinden çağırır; dokümantasyon, bulut örneklerinin yapılandırılmış resource’ların bu adreslerden erişime izin verdiğinden emin olması gerektiğini söyler. Varsayılan bölge AWS us-west-2’dir.
# 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
8080 portunun önündeki güvenlik duvarında bu adreslere izin verin ve diğer her şeyi reddedin. Bu, göründüğünden çok daha küçük bir açıklıktır ve Retool Cloud hikâyesinin tamamı bundan ibarettir.
Adım 5: yavaş bir çözümün hayatta kalıp kalmayacağını belirleyen zaman aşımları
Retool farklı blok türleri için farklı üst sınırlar yayımlar ve bunlar burada önemlidir, çünkü bir çözüm doğası gereği yavaştır.
| Hangi limit | Değer | Bir çözüm için neden önemli |
|---|---|---|
| Resource query block, asenkron çalışma | 10 dakikaya kadar | Rahat. Tek bir okuma bir saniyenin çok altında döner |
| Resource query block, senkron çalışma | 2 dakikaya kadar | Bir okuma için yine de yeterli, çünkü bekleme bir Wait block içinde gerçekleşir |
| Loop block | Varsayılan olarak 10 saniye, en fazla 2 dakika | Bir sorgulama döngüsünün burada yanlış bir yaklaşım olmasının nedeni |
| Çalışmanın tamamı, asenkron | 30 saat, Wait block’ları ile sınırsız | Bir çözümün hiçbir yanı buna yaklaşmaz |
| Çalışmanın tamamı, senkron | İlk webhook Response block’una kadar 15 dakika | Tuzak burada. Aşağıdaki paragrafa bakın |
| Workflow başına eşzamanlı dış istek | Aynı anda 50 | Tek bir çalışmadaki toplu çözümlerin gerçek üst sınırı |
| Zamanlanmış tetikleyici aralığı | En az bir dakika | Sorun değil ve bu sıklıkta çalıştırmanın hiçbir maliyeti yok |
Planlama yaparken esas alınması gereken sayı senkron olanıdır. Bağlantıyı açık tutan ve bir Response block ile yanıt veren bir webhook tetikleyicisi size on beş dakika verir; bu, açık bir HTTP bağlantısı üzerinde iki dakika boyunca bir reCAPTCHA bekleyen bir çağıranın kendi başına kötü bir tasarım olduğunu hatırlayana kadar cömert görünür. Workflow’u asenkron olarak tetikleyin ve token’ı gereken yere göndermesini sağlayın, ya da webhook’a hemen yanıt verip çözümü onun arkasında yapın.
Resource query blokları kendi yeniden deneme sayısı ve üstel geri çekilme ayarlarını da taşır. Bunları submitCaptcha için açın, readResult için ise yukarıdaki bir kez okunabilme nedeniyle kapalı bırakın.
Kod yazmayı tercih ediyorsanız
Code executor’ın çözücüye ulaşabildiği, kendi barındırdığınız bir kurulumda akışın tamamı tek bir Python bloğuna sığar, çünkü sorgulamayı SDK sizin yerinize yapar. Önce Libraries sekmesinden workflow’un requirements.txt dosyasına capskip ekleyin.
# 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 sorgulamaya 250 milisaniyede başlar ve sabit bir aralıkta beklemek yerine beş saniyeye kadar geri çekilir, bu yüzden bu sürüm genellikle Wait tabanlı akıştan daha erken döner. reCAPTCHA, Turnstile ve GeeTest için üst sınırı üç yüz saniyedir; bu da asenkron code block’un on dakikalık zaman aşımının içinde kalır. Retool Cloud varsayılan olarak Python 3.10 çalıştırır ve Node.js, PHP ile C# için eşdeğer tek çağrılık sürümler şurada: CAPTCHA çözme SDK sayfası.
Token’ı hemen ardından gelen blokta gönderin. Bir reCAPTCHA token’ı yaklaşık iki dakika geçerlidir, bu yüzden çözen, uzun bir Wait block’unda bekleyen ve sonra gönderen bir workflow, üretildiği anda geçerli olan bir token yüzünden başarısız olur. Bu hata biçimi şu kılavuzda ele alınıyor: reCAPTCHA token süresinin dolması.
Sık görülen hatalar ve anlamları
| Gördüğünüz | Neden | Düzeltme |
|---|---|---|
| Bir code block, bir LAN adresine ulaşmaya çalışırken zaman aşımına uğruyor | Kendi barındırdığınız code executor’ın varsayılan iptables kuralları 192.168.0.0/16 aralığını kapsıyor | Çağrıyı bir REST resource query block içine taşıyın |
| 8080 numaralı bağlantı noktasında bağlantı reddedildi | CapSkip loopback’e bağlı ve Retool başka bir yerde | CapSkip’i Server moduna geçirin ve çözücünün ağ adresini kullanın |
| Retool Cloud resource’a hiç ulaşamıyor | Güvenlik duvarı Retool’un giden adreslerine izin vermiyor | Bölgeniz için yayımlanan aralıklara 8080 portunda izin verin |
| readResult her seferinde CAPCHA_NOT_READY döndürüyor | Wait block, çözümün sürdüğü süreden kısa | İlk beklemeyi artırın ya da Else yoluna ikinci bir bekleme ve okuma ekleyin |
| Aynı id’nin ikinci okuması boş dönüyor | Bir CapSkip sonucu yalnızca bir kez okunabilir | Token’ı blok çıktısında tutun, id’yi asla yeniden okumayın |
| Yanıtta ERROR_WRONG_USER_KEY | key parametresi boş bir dizeye çözümlendi | Secret adını, büyük küçük harflerine kadar kontrol edin |
| Geçerli bir token hedef site tarafından reddediliyor | Çözüm ile gönderim arasında süresi doldu | Bir sonraki blokta gönderin, aralarında Wait olmasın |
| Toplu çözümler yarı yolda takılıyor | Bir workflow aynı anda 50 dış isteği açık tutabilir | Loop block’u gruplara bölün ya da işi birden fazla çalışmaya yayın |
FAQ
CapSkip’i Retool Cloud üzerinden kullanabilir miyim?
Evet, Server modu ile. Retool Cloud resource’larınızı kendi altyapısından çağırır, bu yüzden çözücünün ulaşabilecekleri bir adreste dinlemesi gerekir: genel bir IP, tercihen statik olanı. Retool çağrı yaptığı giden aralıkları yayımlar, bu yüzden güvenlik duvarı kuralı dünyaya açık değil dar olur. Çözücüyle ilgili hiçbir şey değişmez ve hiçbir şey ücretlendirilmeye başlamaz. Tek fark, dinlediği adrestir.
Neden axios ile birlikte bir JavaScript bloğu kullanmıyoruz?
Çünkü o kodun nerede çalıştığı belirleyici. Retool code block’ları NsJail ile izole edilmiş ayrı bir serviste çalıştırır ve kendi barındırdığınız bir kurulumda bu servis, özel aralıkları kapsayan güvenlik duvarı kuralları kurar. Bunları kapatmak belgelenmiş bir anahtardır, ama tek bir workflow’u kolaylaştırmak için alınan, tüm örneği ilgilendiren bir karardır ve Retool bunu önermez. Bir resource query block aynı çözücüye böyle bir tartışma olmadan ulaşır. Mantık için code block’ları, ağ için resource query block’ları kullanın.
Workflow token gelene kadar döngüye girmeli mi?
Hayır. Bir Loop block iki dakikada tavan yapar; bu, bir reCAPTCHA çözümüne tanınan üç yüz saniyenin epey altındadır ve döngü erken durmak yerine kendisine verdiğiniz her yinelemeyi çalıştırır. Üstelik bir sonuç yalnızca bir kez okunabilir, yani aynı id’nin tekrar tekrar okunması boşa giden turlardır. Doğru uzunlukta bir Wait block artı tek bir okuma hem doğru hem ucuzdur ve arkasına ikinci bir bekleme ile okuma konulmuş bir Branch yavaş durumları karşılar.
Bunun n8n ya da Pipedream ile karşılaştırması nasıl?
İki istek de üç aracın hepsinde aynıdır. Farklı olan, her birinin bu isteklerin önüne koyduğu engeldir.
- n8n için engel konteyner ağıdır ve şurada ayrıntılı işleniyor: n8n iş akışı kılavuzu.
- Pipedream için engel, adım çalışma ortamı ve secret’ların nerede tutulduğudur; şurada ele alınıyor: Pipedream kılavuzu.
- Retool için engel, code executor’ın kendi güvenlik duvarıdır; yukarıdaki akışın bir HTTP çağrısını asla bir code block içine koymamasının nedeni de budur.
Kısa özet
Bir REST resource’unu çözücüye yönlendirin, CAPTCHA’yı POST edin, on beş saniye Wait uygulayın, sonucu GET ile alın ve hazır olup olmadığına göre Branch yapın. HTTP’yi code block’ları yerine resource query block’larında tutun, çünkü code executor’ın varsayılan güvenlik duvarı kuralları özel adresleri kapsar ve bunları gevşetmek tüm örneği ilgilendiren bir karardır. Retool çözücünün kendi makinesinde değilse CapSkip’i Server moduna alın ve Retool Cloud üzerinde 8080 portuna yalnızca yayımlanmış giden aralıkların geçmesine izin verin. Senkron bir webhook içinde bir çözümü asla beklemeyin.
- reCAPTCHA v2 onay kutusunun kendisi şurada ele alınır: reCAPTCHA v2 çözücü sayfası.
- Bu code block yolunda kullanılan Python istemcisi şurada belgelenmiştir: Python CAPTCHA çözücü sayfası.
Zamanlanmış bir workflow’u her dakika buna yönlendirmeden önce tartmaya değer bir nokta: CapSkip bir yerel captcha çözücü olarak zaten sahip olduğunuz donanımda çalışır, bu yüzden her dakika tetiklenen bir workflow ile günde iki kez tetiklenen bir workflow tam olarak aynı maliyeti taşır.
