Activepieces'te CAPTCHA Nasıl Çözülür (HTTP Piece)

Activepieces'te bir captcha çözümü üç adımdır: doğrulamayı gönderin, bekleyin, token'ı okuyun. Bunu bir Code step yerine HTTP piece üzerine kurun, çünkü bir Code step'in npm'i kullanıp kullanamayacağı kurulumunuzun hangi sandbox modunda çalıştığına bağlıdır ve Activepieces Cloud'un kullandığı modda npm yoktur. HTTP piece her modda çalışır. Koddan daha önemli olan ikinci bir ayar daha vardır ve akışınızın özel bir adresteki bir çözücüye hiç ulaşıp ulaşamayacağına o karar verir.
Neye ihtiyacınız var
- Bulutlarında veya kendi sunucunuzda barındırılan, içinde bir akış yayımlayabileceğiniz bir Activepieces projesi.
- Bir Windows makinesinde çalışan CapSkip. Local modu yalnızca Activepieces aynı makinede çalışıyorsa uygundur; bu da pratikte kendi sunucunuzda barındırılan bir kurulum demektir. Diğer her şey Server modu gerektirir.
- Otomatikleştirdiğiniz sitenin sitekey'i ve sayfa URL'si.
- Çözücü anahtarını tutan bir proje değişkeni; böylece anahtar akış gövdesinin içinde durmaz.
- Ağı sıkılaştırılmış, kendi sunucunuzda barındırılan bir kurulumda, SSRF izin listesinde bir kayıt. Adım 3 bunu ele alır.
Neden Code step değil de HTTP piece
Code step düzenleyicisinde bir Add npm package iletişim kutusu vardır. Paketi npm kayıt defterinde arar, en son sürümü sabitler ve Code step’in bağımlılık listesine yazar. Activepieces Cloud'da bu liste sonra çöpe atılır.
Activepieces bir Code step'i, kaynağınızı bir TypeScript dosyasına yazarak, bağımlılıklarını kurarak ve sonucu paketleyerek derler. Derleme, bağımlılıklarınızı yalnızca kurulumun çalıştırma modu paketlere izin veriyorsa ister. Activepieces’in kendi bulutunun çalıştırdığı mod olarak belgelediği V8 sandboxing modunda paketlere izin verilmez; bu yüzden derleme yerine boş bir bağımlılık kümesi koyar ve yine de derler. Adım sorunsuz dağıtılır. İçe aktarma ise akış çalıştığında başarısız olur.
| Çalıştırma modu | Code step'te npm | Bu akış için anlamı |
|---|---|---|
| V8 sandboxing, yani SANDBOX_CODE_ONLY değeri | npm paketleri yok | HTTP piece'i kullanın. Activepieces Cloud bu moddadır |
| Birleşik sandboxing, SANDBOX_CODE_AND_PROCESS | npm paketleri yok | HTTP piece'i kullanın |
| Çekirdek ad alanları, SANDBOX_PROCESS | npm paketleri çalışır | Node SDK çalışır ve yoklamayı sizin için yapar |
| Sandboxing yok, UNSANDBOXED | npm paketleri çalışır | Node SDK çalışır ve yoklamayı sizin için yapar |
Yani bunu yapmanın iki dürüst yolu vardır ve hangisine sahip olacağınız sizin değil, yöneticinizin seçimidir. Aşağıdaki HTTP piece yolu dördünde de çalışır. Bu kılavuzun sonundaki Code step’i kullanan yol bunlardan ikisinde çalışır ve elinizde olduğunda çok daha kısadır.
Adım 1: doğrulamayı gönderin
CapSkip, 8080 numaralı bağlantı noktasında 2captcha uyumlu API'yi konuşur; bu yüzden HTTP piece, kurulacak bir konnektör olmadan onunla iletişim kurar. Bir Send HTTP Request eylemi ekleyin, yöntemi POST, URL'yi de çözücünüzdeki gönderim uç noktası olarak ayarlayın.
{
"key": "{{variables['CAPSKIP_KEY']}}",
"method": "userrecaptcha",
"googlekey": "YOUR_SITEKEY",
"pageurl": "https://example.com/page-with-recaptcha",
"json": 1
}Yanıt, request alanı yoklama yapacağınız id'yi tutan küçük bir JSON nesnesidir.
{ "status": 1, "request": "2122988149" }Bu, reCAPTCHA v2'dir. CapSkip'in desteklediği diğer türler, farklı parametrelerle yapılan aynı çağrıdır: invisible veya 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. Parametrelerin tam listesi şurada: CapSkip API dokümantasyonu.
Anahtarı yapıştırmak yerine proje değişkeni söz dizimiyle referans verin. Değişkenler beklemede şifrelenir ve değişkenler listesinde size geri gösterilmez; birini döndürmek de her akışı tek tek taramak yerine tek bir düzenlemeden ibarettir.
Adım 2: bekleyin, ardından token'ı okuyun
Bir Delay For eylemi, ardından sonucu okuyan ikinci bir HTTP isteği ekleyin. Bir reCAPTCHA v2 onay kutusu için yirmi saniye makul bir ilk beklemedir. Görüntü CAPTCHA'ları yaklaşık bir saniyede, v3 on ila on beş saniyede, GeeTest ise yaklaşık beş saniyede geri döner.
# 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
İki yanıt mümkündür. Hazır bir sonuç, gönderim yanıtıyla aynı biçimde, token'ı request alanında tutan bir JSON nesnesidir. Henüz hazır olmayan bir sonuç ise T harfi olmadan yazılan CAPCHA_NOT_READY dizesidir ve bir şeylerin ters gittiği değil, beklemeye devam edin anlamına gelir. Bu yazımın hikâyesi şurada: CAPCHA_NOT_READY yanıtının tam yazısı.
Delay piece, on saniyenin iki yanında farklı davranır ve yoklama biçimini burada ucuz kılan ayrıntı da budur. On saniye veya daha kısa bir gecikme, worker sürecinin içinde uyur. Daha uzun olan her şey bir bekleme noktası oluşturur, çalıştırmayı askıya alır ve süre dolduğunda kaldığı yerden devam ettirir. Askıda geçen süre çalıştırma süresi değildir ve Activepieces, Delay ya da Wait for Approval ile duraklatılan akışların çalıştırma zaman aşımına sayılmadığını belgeler. Dolayısıyla yirmi saniyelik bir bekleme, on dakikalık bütçenizden hiçbir şey götürmez; ikinci bir bekleme de götürmez.
Tek bir okuma yetmiyorsa, bir döngüye başvurmak yerine bir Delay ve bir okuma daha ekleyin. Bunun iki nedeni var. Loop on Items listedeki her öğeyi çalıştırır; yani token gelmiş olsa da olmasa da yinelemeler gerçekleşir ve içine koyduğunuz bir Router, döngü turunu değil yalnızca daldaki işi size kazandırır. Daha da önemlisi, bir CapSkip sonucu yalnızca bir kez okunabilir; dolayısıyla zaten toplamış olduğu bir id'yi yeniden okuyan bir döngü token'ı iki kez almaz, ikinci okumada bir hata alır.
Adım 3: yerel bir çözücüyü engelleyen ağ ayarı
İnsanları yakalayan kısım budur ve bu, genel orkestratör tavsiyesi değil, Activepieces'e özgü bir konudur. Activepieces'in akış kodu için, AP_NETWORK_MODE adlı bir değişkenle denetlenen bir SSRF koruması vardır. Varsayılan değeri UNRESTRICTED'dır. STRICT olarak ayarlandığında motor, herhangi bir akış kodu çalışmadan önce Node’un DNS aramasını ve soket bağlantısını yamalar ve adresi loopback, RFC1918 özel, link-local veya bulut meta verisi olan her bağlantıyı reddeder. SSRFBlockedError adlı bir hata fırlatır.
Kendi ağınızdaki bir CAPTCHA çözücü, tam da o korumanın engellediği biçimdedir. Hem 127.0.0.1 hem de 192.168.1.40 gibi bir LAN adresi bu listededir. Bu, korumanın işini yapması demektir, bir hata değil; ve Activepieces bunun için belgelenmiş istisnayı size sunar: çözücünün adresini AP_SSRF_ALLOW_LIST’e koyun. Bu ayar virgülle ayrılmış IP'ler ve CIDR aralıkları alır ve hem akış koduna hem de sunucunun kendi giden isteklerine aynı şekilde uygulanır. Değiştirdikten sonra sunucuyu yeniden başlatın.
# 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
Korumadan ayrı olarak, akışın makineye zaten ulaşabiliyor olması gerekir. CapSkip'in bunun için iki bağlantı modu vardır. Local modu 127.0.0.1'e bağlanır ve yalnızca o cihaza hizmet eder. Server modu ağ adresinize veya genel IP'nize bağlanır; böylece başka bir makine, bir konteyner ana bilgisayarı veya barındırılan bir platform aynı Windows makinesine API üzerinden ulaşabilir. Her ikisi de şu bölümün altındadı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.
| Activepieces'in çalıştığı yer | Hangi mod ve başka ne gerekir |
|---|---|
| CapSkip ile aynı Windows makinesinde, kendi sunucunuzda barındırılan | Local modu; host 127.0.0.1 olarak kalır. Ağ modu STRICT ise bu adresi izin listesine ekleyin |
| Docker'da veya ağınızdaki başka bir makinede, kendi sunucunuzda barındırılan | Çözücünün LAN adresiyle Server modu. Bu adresi de AP_SSRF_ALLOW_LIST’e ekleyin |
| Activepieces Cloud | Statik bir genel IP ve bir güvenlik duvarı kuralıyla Server modu. SSRF koruması yine çalışır ama engellemez, çünkü genel bir adres onun engelleme listesinde değildir |
Adım 4: zaman aşımları ve yeniden denemeler
Yavaş bir çözümün ayakta kalıp kalmayacağına üç sayı karar verir ve bunlardan yalnızca birini akışta siz ayarlarsınız.
| Hangi limit | Değer | Bir çözüm için neden önemli |
|---|---|---|
| Çalıştırmanın tamamı ve herhangi bir tek eylem birbirinden bağımsız olarak sınırlanır | Her biri on dakika; ikisi de tek bir değişkenle, AP_FLOW_TIMEOUT_SECONDS ile ayarlanır | Rahat, çünkü gecikme süresi akış çalıştırma zaman aşımına sayılmaz |
| Senkron webhook yanıt zaman aşımı | Otuz saniye, AP_WEBHOOK_TIMEOUT_SECONDS ile ayarlanır | Tuzak burada. Aşağıdaki paragrafa bakın |
| Adım başına Retry on Failure | Dört deneme; beklemeler dört, sekiz ve on altı saniyedir | Yeniden başlamakta olan bir çözücüyü kapsar, yalnızca yavaş olanı değil |
Canınızı yakan sayı webhook sayısıdır. Sonu sync kelimesiyle biten bir webhook URL’si, HTTP bağlantısını açık tutar ve akışın sonucuyla yanıt verir; otuz saniye sonra da pes eder. Bir reCAPTCHA v2 çözümü otuz saniye içinde güvenilir biçimde bitmez; dolayısıyla akışı senkron olarak tetikleyip token bekleyen bir çağıran, akış arkasında çalışmayı sürdürürken HTTP 408 alır. Akışı asenkron tetikleyin ve token'ı ihtiyacınız olan yere göndermesini sağlayın ya da işi bölün, böylece senkron yarısı hiçbir zaman bir çözümü beklemesin.
Retry on Failure'ı gönderim adımı için açmaya değer, okuma adımı için değil. Geri çekilmesi iki saniyelik bir tabandan üsteldir; yani dört deneme boyunca beklemeler kabaca dört, sekiz ve on altı saniyedir. Bu, reddedilmiş bir bağlantı için doğrudur. Zaten toplamış olduğunuz bir token için ise yanlıştır, çünkü yukarıdaki bir kez okuma kuralı geçerlidir.
Kendi sunucunuzda barındırılan bir kurulumda her şey tek adımda
Yöneticiniz sandboxing olmadan ya da çekirdek ad alanı sandboxing'i ile çalıştırıyorsa, yukarıdaki akış tek bir Code step'e indirgenir, çünkü yoklamayı SDK sizin için yapar. npm iletişim kutusunda capskip paketini ekleyin, ardından adımı yazın. Code step'ler TypeScript'tir ve çalışmadan önce paketlenir; bu yüzden sıradan bir import çalışır.
// 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 };
};capskipKey değerini, proje değişkeni referansını tutan bir adım girdisi olarak geçirin; böylece anahtar çalışma zamanında çözümlenir ve kaynakta hiç görünmez. SDK, sabit bir aralıkta uyumak yerine 250 milisaniyede yoklamaya başlar ve geri çekilir; bu yüzden bu sürüm genellikle Delay tabanlı akıştan daha erken döner. reCAPTCHA, Turnstile ve GeeTest için tavanı 300 saniyedir ve bu, on dakikalık eylem zaman aşımının epey içinde kalır.
Token'ı hemen ardından gelen adımda gönderin. Bir reCAPTCHA token'ı yaklaşık iki dakika geçerlidir; bu yüzden çözen, bir onay adımında bekleyen ve sonra gönderen bir akış, üretildiği anda kusursuz geçerli olan bir token yüzünden başarısız olur. Bu hata biçimi şu kılavuzda ele alınır: reCAPTCHA token süresinin dolması.
Sık görülen hatalar ve anlamları
| Gördüğünüz | Neden | Düzeltme |
|---|---|---|
| Çalıştırma günlüğünde SSRFBlockedError | Ağ modu STRICT ve çözücü özel bir adreste | Adresi AP_SSRF_ALLOW_LIST'e ekleyin ve sunucuyu yeniden başlatın |
| Akış çalıştığında capskip modülü bulunamıyor | Sandbox modu, derleme sırasında bağımlılığı attı | Adımı HTTP piece çağrıları olarak yeniden kurun ya da paketlere izin veren bir modda kendi sunucunuzda barındırın |
| 8080 numaralı bağlantı noktasında bağlantı reddedildi | CapSkip loopback'e bağlı ve worker başka bir yerde | CapSkip’i Server moduna geçirin ve çözücünün ağ adresini kullanın |
| Okuma her seferinde CAPCHA_NOT_READY döndürüyor | Gecikme, çözümün sürdüğü süreden kısa | İlk Delay'i artırın ya da ikinci bir gecikme ve okuma ekleyin |
| Aynı id'nin ikinci okuması başarısız oluyor | Bir CapSkip sonucu yalnızca bir kez okunabilir | Token'ı bir adım çıktısında saklayın, id'yi asla yeniden okumayın |
| Yanıtta ERROR_WRONG_USER_KEY | Proje değişkeni boş bir dizeye çözümlendi | Değişken adını, büyük ve küçük harflerine kadar kontrol edin |
| Senkron bir webhook'tan HTTP 408 | Çözüm, otuz saniyelik webhook zaman aşımından uzun sürdü | Asenkron tetikleyin ya da çözümü senkron yoldan çıkarın |
| Geçerli bir token hedef site tarafından reddediliyor | Çözüm adımı ile gönderim adımı arasında süresi doldu | Bir sonraki adımda gönderin, aralarında onay veya gecikme olmadan |
FAQ
CapSkip'i Activepieces Cloud'dan kullanabilir miyim?
Evet, Server modu ile. Worker'lar sizin değil Activepieces altyapısındadır; bu yüzden çözücünün onların ulaşabileceği bir adreste dinlemesi gerekir: tercihen statik bir genel IP ve trafiklerini kabul eden bir güvenlik duvarı kuralı. Çözücüyle ilgili hiçbir şey değişmez, yalnızca nerede dinlediği değişir. Kendi bulutlarında yapamayacağınız şey, bir Code step'te Node SDK'yı kullanmaktır, çünkü o modda npm yoktur; bu yüzden akışı HTTP piece üzerine kurun.
npm paketini eklemek neden işe yaramış gibi göründü?
Çünkü iletişim kutusu bir arayüz özelliğidir ve süzme işlemi sunucuda gerçekleşir. İletişim kutusu paketi npm kayıt defterine karşı çözümler ve kaydeder. Derleme sırasında sunucu, çalıştırma modunun paketlere izin verip vermediğini sorar; izin vermiyorsa kurulumdan önce yerine boş bir bağımlılık kümesi koyar. Adım hiçbir uyarı olmadan derlenir ve dağıtılır. Bunu çalışma zamanında, import hiçbir şeye çözümlendiğinde öğrenirsiniz.
Akış, token gelene kadar döngüye girmeli mi?
Genellikle hayır. Loop on Items tüm öğe listesini çalıştırır; yani yapılandırdığınız her yineleme için bedel ödersiniz ve her yineleme, yalnızca bir kez okunabilen bir id'yi yeniden okumaya çalışır. Doğru uzunlukta bir gecikme artı tek bir okuma hem daha ucuz hem de doğrudur; ikinci bir gecikme ve okuma da gayet iyi bir yedektir. Uzun gecikmeler burada alışılmadık biçimde ucuzdur, çünkü on saniyeyi aşan bir gecikme bir worker'ı meşgul etmek yerine çalıştırmayı askıya alır ve askıda geçen süre çalıştırma zaman aşımına sayılmaz.
Bu, n8n, Make.com veya Zapier ile karşılaştırıldığında nasıl?
İstekler dört aracın hepsinde aynıdır. Farklı olan, her birinin bunların önüne koyduğu engeldir.
- n8n için engel konteyner ağıdır ve n8n iş akışı kılavuzu bunu baştan sona ele alır.
- Make.com için engel, HTTP modülünün talep ettiği sertifikadır ve bunu Make.com anlatımı eksiksiz olarak ele alır.
- Zapier için engel, bir Code step'teki çalışma zamanı tavanıdır ve bu, şurada açıklanır: Zapier kılavuzu.
Activepieces kendine ait iki engel daha ekler: npm'in hiç var olup olmadığına karar veren bir sandbox modu ve özel bir adresi doğrudan reddedebilen bir SSRF koruması.
Kısa özet
Çözümü HTTP piece üzerine kurun, çünkü o her sandbox modunda çalışır, Code step yolu ise çalışmaz. Gönderim uç noktasına gönderin, çalıştırma bir worker'ı meşgul etmek yerine askıya alınsın diye on saniyeyi aşan bir gecikme koyun, sonra sonucu bir kez okuyun ve saklayın. Anahtarı bir proje değişkenine koyun. Kurulum kendi sunucunuzdaysa ve ağ modu katıysa, çözücüyü SSRF izin listesine ekleyin; Activepieces, çözücünün kendi makinesi dışında herhangi bir yerde çalışıyorsa CapSkip’i Server moduna geçirin. Senkron bir webhook üzerinde asla bir çözümü beklemeyin.
- reCAPTCHA v2 onay kutusunun kendisi şurada ele alınır: reCAPTCHA v2 çözücü sayfası.
- Python, Node.js, PHP ve C# dillerindeki eşdeğer tek çağrılık sürümler şurada listelenir: CAPTCHA çözme SDK sayfası.
Bu akışı birkaç dakikada bir zamanlamadan önce tartmaya değer bir şey: CapSkip bir sınırsız captcha çözücü olup zaten sahip olduğunuz donanımda çalışır; dolayısıyla sürekli tetiklenen bir akış ile ara sıra tetiklenen bir akış tam olarak aynı maliyettedir.
