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

retool workflows captcha - How to Solve CAPTCHAs in Retool Workflows (REST Blocks)

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ışıyorHangi mod ve başka ne gerekir
CapSkip ile aynı Windows makinesinde, kendi sunucunuzda barındırılanLocal 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 CloudStatik 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 limitDeğerBir çözüm için neden önemli
Resource query block, asenkron çalışma10 dakikaya kadarRahat. Tek bir okuma bir saniyenin çok altında döner
Resource query block, senkron çalışma2 dakikaya kadarBir okuma için yine de yeterli, çünkü bekleme bir Wait block içinde gerçekleşir
Loop blockVarsayılan olarak 10 saniye, en fazla 2 dakikaBir sorgulama döngüsünün burada yanlış bir yaklaşım olmasının nedeni
Çalışmanın tamamı, asenkron30 saat, Wait block’ları ile sınırsızBir çözümün hiçbir yanı buna yaklaşmaz
Çalışmanın tamamı, senkronİlk webhook Response block’una kadar 15 dakikaTuzak burada. Aşağıdaki paragrafa bakın
Workflow başına eşzamanlı dış istekAynı anda 50Tek bir çalışmadaki toplu çözümlerin gerçek üst sınırı
Zamanlanmış tetikleyici aralığıEn az bir dakikaSorun 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üzNedenDüzeltme
Bir code block, bir LAN adresine ulaşmaya çalışırken zaman aşımına uğruyorKendi 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ı reddedildiCapSkip loopback’e bağlı ve Retool başka bir yerdeCapSkip’i Server moduna geçirin ve çözücünün ağ adresini kullanın
Retool Cloud resource’a hiç ulaşamıyorGüvenlik duvarı Retool’un giden adreslerine izin vermiyorBölgeniz için yayımlanan aralıklara 8080 portunda izin verin
readResult her seferinde CAPCHA_NOT_READY döndürüyorWait 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üyorBir CapSkip sonucu yalnızca bir kez okunabilirToken’ı blok çıktısında tutun, id’yi asla yeniden okumayın
Yanıtta ERROR_WRONG_USER_KEYkey parametresi boş bir dizeye çözümlendiSecret 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 dolduBir sonraki blokta gönderin, aralarında Wait olmasın
Toplu çözümler yarı yolda takılıyorBir workflow aynı anda 50 dış isteği açık tutabilirLoop 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.

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.