Pipedream Kod Adımında CAPTCHA Nasıl Çözülür (Node.js)

pipedream captcha - How to Solve CAPTCHAs in a Pipedream Code Step (Node.js)

Bir Pipedream captcha çözümü, aynı işi Zapier veya Make.com'da yapmaktan daha kolaydır, çünkü bir kod adımı npm içe aktarmalarına sahip gerçek bir Node.js v20 çalışma zamanıdır. Hiçbir şey kurmazsınız, sıradan JavaScript yazarsınız ve CapSkip SDK'sı tam olarak dizüstünüzdeki gibi çalışır. İki şey farklıdır ve ikisi de kodun nerede çalıştığıyla ilgilidir. Pipedream kendi bulutunda çalışır, bu yüzden çözücünün internetten erişilebilir olması gerekir. Ayrıca bir workflow yürütmesinin süre sınırı bir reCAPTCHA çözümünden kısadır; bu da bir adım mı yoksa iki adım mı yazacağınızı belirler.

Neye ihtiyacınız var

  • Kod adımı olan bir Pipedream workflow'u. Aşağıda kullanılan çalışma zamanı Node.js. Daha aşağıda bir Python sürümü de var.
  • İnternetten erişilebilen, statik genel IP'ye sahip bir makinede Server modunda çalışan CapSkip.
  • Otomatikleştirdiğiniz sitenin sitekey'i ve sayfa URL'si.
  • Çözücünün adresini ve anahtarını tutan iki Pipedream ortam değişkeni.

Loopback adresi burada neden çalışamaz

Pipedream workflow’ları, AWS us-east-1 ağında, Pipedream’in kendi altyapısında çalışır. Bir kod adımının içinden 127.0.0.1 adresine yapılan bir istek, sizin masanıza değil adımın çalıştığı konteynere çözümlenir. Orada dinleyen hiçbir şey yoktur ve SDK bir NetworkException fırlatır.

CapSkip'in iki bağlantı modu var ve cevap ikincisi. Local, 127.0.0.1 adresine bağlanır ve yalnızca o cihaza hizmet verir; otomasyon ile çözücü aynı makineyi paylaştığında doğru olan budur. Server ise ağ adresinize veya genel IP'nize bağlanır; böylece barındırılan bir platform aynı Windows makinesine API üzerinden ulaşabilir. Statik bir genel IP önerilir, çünkü dönüşümlü değişen bir ev IP'si workflow'unuzu gecenin üçünde, size haber vermeden bozar. Her iki modun kurulumu şurada anlatılıyor: bağlantı ayarları.

Server modu yalnızca çözücünün nerede çalıştığını değiştirir, başka bir şeyi değil. Donanım hâlâ sizindir ve hâlâ ölçümsüzdür; dolayısıyla ayda on bin kez tetiklenen bir workflow, on kez tetiklenenle aynı maliyettedir.

Adım 1: adresi bir ortam değişkenine koyun

Genel IP'yi adımın içine sabit olarak yazmayın. Pipedream'in çalışma alanı ortam değişkenleri var ve bir kod adımı bunları sıradan process ortamından okur. İki tane oluşturun.

Değişken adıDeğer
CAPSKIP_HOST adlı olanÇözücü makinenizin genel IP’si; şema ve port olmadan
CAPSKIP_API_KEY adlı olanBu workflow için CapSkip uygulamasında oluşturduğunuz anahtar

Anahtar paylaşmak yerine bu workflow'a kendi anahtarını verin. Paylaşılan bir çalışma alanına sızmış bir anahtarı iptal etmek, otomasyonunuzun geri kalanını da beraberinde götürmemeli.

Adım 2: çözümün tamamı tek bir kod adımında

Pipedream, bir npm paketini siz içe aktardığınız anda kurar; dolayısıyla kurulum adımı ve paket dosyası yoktur. İçe aktarma belirteci aynı zamanda bir sürümü sabitlediğiniz yerdir ki gözetimsiz çalışan her şeyde bunu yapmakta fayda var.

// npm install capskip - Pipedream installs it from this import.
// The package is CommonJS, so take the default and destructure.
import capskip from "capskip";

const { CapSkip } = capskip;

export default defineComponent({
  async run({ steps, $ }) {
    const solver = new CapSkip({
      host: process.env.CAPSKIP_HOST,
      port: 8080,
      apiKey: process.env.CAPSKIP_API_KEY,
    });

    const result = await solver.recaptcha(
      "YOUR_SITEKEY",
      "https://example.com/page-with-recaptcha"
    );

    return result.code;   // the token, for the next step
  },
});

İşin tamamı bu. Her reCAPTCHA varyantı, bir seçenek nesnesiyle aynı metottur: invisible 1 yapılır, enterprise 1 yapılır ya da version v3 yapılıp bir action adı verilir. Turnstile ve GeeTest'in aynı biçimde kendi metotları vardır ve tam parametre listesi şuradadır: CapSkip API dokümantasyonu.

Adım ne döndürürse workflow’un dışa aktarımlarına düşer; böylece sonraki bir adım token’ı adımın kendi adından okur. Ona bir etiket vermeyi tercih ederseniz, export yardımcısını kullanın.

// A named export reads better downstream than a bare return.
$.export("token", result.code);

// The next step then reads steps.solve_captcha.token

Yürütme zaman aşımı ve tek adımın ne zaman yetmez olduğu

İşte geri kalan her şeyi şekillendiren kısıt. Bir Pipedream yürütmesinin varsayılan süre sınırı, HTTP ve e-posta tetikleyicileri için 30 saniye, cron tetikleyicileri için 60 saniyedir. Bunu workflow ayarlarından, ücretsiz katmanlarda 300 saniyeye, ücretli katmanlarda 750 saniyeye kadar yükseltebilirsiniz.

Bir reCAPTCHA v2 çözümü genellikle 30 saniyenin epey altında biter, ama genellikle her zaman demek değildir ve SDK’nın kendi üst sınırı 300 saniyelik recaptchaTimeout değeridir. Yani yukarıdaki tek adımlı sürüm, tam olarak zaman aşımı ayarınız kadar güvenilirdir. Workflow sınırı çözümden düşükse, yürütme yoklamanın ortasında sonlandırılır ve elinizde işe yarar hiçbir şey olmayan başarısız bir koşu kalır.

DurumunuzNe yapmalı
Düşük hacim ve yürütme sınırını 300 saniyeye çıkarabiliyorsunuzTek adımlı sürümü koruyun. Zaman aşımını workflow ayarlarından yükseltin
Yüksek hacim ya da yürütme süresi için ödeme yapıyorsunuzBölün ve aşağıda anlatılan rerun yardımcısını kullanın
Daha uzun süren Turnstile doğrulama sayfaları veya GeeTestBölün. Kısa bir sınırı aşma olasılığı en yüksek türler bunlar

Adım 3: rerun yardımcısıyla bölün

Pipedream'de çoğu otomasyon platformunda bulunmayan bir yoklama ilkeli var. flow rerun yardımcısı mevcut adımı bitirir, bekler ve ona verdiğiniz bir parça durumla aynı adımı yeniden çalıştırır. Beklerken workflow yürütülmediği için yavaş bir çözüm size hiçbir şeye mal olmaz ve sınıra takılamaz.

Bunu üç şey mümkün kılıyor. Çalıştırma sayacı 1'den başlar ve her rerun'da artar. Geçirdiğiniz context nesnesi bir sonraki geçişte okunabilir. Ve yeniden deneme üst sınırını aşmak, workflow'u başarısız kılmak yerine bir sonraki adıma taşır; istediğiniz bu değilse hata fırlatın.

// No SDK here. The raw endpoints suit a step that exits
// between polls, because nothing has to stay in memory.
const MAX_RETRIES = 20;
const DELAY = 15000;   // 15s, the recommended first wait for v2

export default defineComponent({
  async run({ steps, $ }) {
    const { run } = $.context;
    const base = `http://${process.env.CAPSKIP_HOST}:8080`;
    const key = process.env.CAPSKIP_API_KEY;

    if (run.runs === 1) {
      const params = new URLSearchParams({
        key,
        method: "userrecaptcha",
        googlekey: "YOUR_SITEKEY",
        pageurl: "https://example.com/page-with-recaptcha",
        json: "1",
      });
      const submitted = await fetch(`${base}/in.php?${params}`);
      const { request: id } = await submitted.json();

      // The id survives into the next run through the context.
      return $.flow.rerun(DELAY, { id }, MAX_RETRIES);
    }

    const { id } = $.context.run.context;
    const polled = await fetch(
      `${base}/res.php?key=${key}&action=get&id=${id}&json=1`
    );
    const data = await polled.json();

    if (data.request !== "CAPCHA_NOT_READY") {
      return data.request;   // the token
    }
    if (run.runs === MAX_RETRIES + 1) {
      throw new Error("Solve did not finish in time");
    }
    return $.flow.rerun(DELAY, { id }, MAX_RETRIES);
  },
});

O bekleme yanıtının yazılışı insanları yanıltıyor. Adı CAPCHA_NOT_READY, bir T eksik ve bu bir hata değil: yanıtın henüz bitmediği ve tekrar yoklamanız gerektiği anlamına geliyor. Bunu bir başarısızlık gibi ele almak, elle yazılmış bir yoklama döngüsündeki en yaygın hatadır ve şu kaynak da var: CAPCHA_NOT_READY yanıtının tam açıklaması.

O uç nokta hakkında bir şey daha. Bir sonuç tam olarak bir kez okunabilir. Yanıt gövdesini günlüğe yazıp sonra onu daha sonraki bir adımda tekrar okursanız, ikinci okuma boş döner ve çözüm başarısız olmuş gibi görünür.

Token'ı hemen gönderin

Bir reCAPTCHA token'ı yaklaşık iki dakika geçerlidir. Bir workflow'da bunu kaybetmek kulağa geldiğinden daha kolaydır, çünkü bir bekleme adımı, yavaş bir HTTP çağrısı ya da fazla bekleyen bir rerun aynı bütçeyi yer. Token'ı gönderen adımı, onu üreten adımın hemen ardına koyun ve token'ları sonrası için biriktirmeyin. Tam resim şurada: reCAPTCHA token ömrü kılavuzu.

Python sürümü

Pipedream ayrıca Python 3.12 kod adımları da çalıştırır ve pip paketlerini içe aktarmalarınızdan aynı şekilde kurar. SDK ortam değişkenlerini kendi başına okumaz; bu yüzden aşağıdaki adım CAPSKIP_HOST, CAPSKIP_PORT ve CAPSKIP_API_KEY değerlerini okuyup yapıcıya geçirir.

# pip install capskip - Pipedream installs it from this import
import os
from capskip import CapSkip

def handler(pd: "pipedream"):
    # Your Pipedream environment variables. The SDK does not read
    # them by itself, so pass them to the constructor.
    solver = CapSkip(
        host=os.environ["CAPSKIP_HOST"],
        port=int(os.environ["CAPSKIP_PORT"]),
        apiKey=os.environ["CAPSKIP_API_KEY"],
    )

    page_url = pd.steps["trigger"]["event"]["body"]["url"]
    result = solver.recaptcha(sitekey="YOUR_SITEKEY", url=page_url)

    # Downstream steps read pd.steps["solve"]["token"]
    return {"token": result["code"]}

Bu yolu seçerseniz diğer ikisinin yanına CAPSKIP_PORT değerini 8080 olarak ekleyin. Karar vermeden önce bilinmesi gereken bir kısıt: rerun ve delay yardımcıları Node.js için belgelenmiştir, dolayısıyla bir Python adımı yalnızca tek seferlik sürümdür. Bölünmüş yoklama biçimine ihtiyacınız varsa, o tek adımı Node ile yazın.

Az önce açtığınız portu kilitlemek

Server modu genel internete bir dinleyici koyar; bu yüzden ona dışarı açık diğer servisler gibi davranın. İlk günden yapılmaya değer üç şey var.

  • CapSkip uygulamasında API anahtarı doğrulamasını açın ve bu workflow'a kendi anahtarını verin. Bu olmadan herhangi bir dize anahtar olarak kabul edilir.
  • 8080'i her şeye açık bırakmak yerine çözücüyü bir güvenlik duvarı kuralının arkasına koyun.
  • O kuralı nasıl ifade edeceğinize karar verin. Pipedream’in sıradan giden trafiği standart AWS us-east-1 aralıklarından gelir ve bunlar işe yarar bir izin listesi için fazlasıyla geniştir. Dar bir kurala ihtiyacınız varsa, Pipedream çalışma alanı başına ayrılmış statik bir giden IP’si olan bir VPC sunuyor ve izin listesine alacağınız adres de odur.

Sık görülen hatalar ve anlamları

GördüğünüzNedenDüzeltme
NetworkException ya da 8080 portunda bağlantı reddedildiÇözücü Local modunda ya da host değişkeni yanlışServer moduna geçin ve host değişkenini genel IP olarak ayarlayın
Yürütme, çözümün ortasında sonlandırılıyorWorkflow süre sınırı, çözümün sürdüğü süreden kısaWorkflow ayarlarından yükseltin ya da rerun sürümüne geçin
Adım, sonuç olarak bekleme yanıtının kendisini döndürüyorYoklama dalı CAPCHA_NOT_READY yanıtını bir cevap olarak işlediOnu döndürmek yerine açıkça sınayın ve rerun yapın
Ham uç noktadan ERROR_WRONG_USER_KEYAnahtar değişkeni boş, bu yüzden boş bir dize gönderildiOrtam değişkeni adını, büyük küçük harf durumu dahil kontrol edin
İkinci okumada token boşBir sonuç yalnızca bir kez okunabilirBir kez okuyun, bir değişkende tutun ve onu aktarın
Geçerli bir token hedef site tarafından reddediliyorÇözüm ile gönderim arasında süresi dolduGönderim adımını doğrudan çözüm adımının ardına taşıyın
Cannot use import statement outside a moduleAdım, import ile require'ı karıştırıyorAdım başına tek bir stil seçin. Kod adımları ES modülleridir

FAQ

Hiçbir şeyi dışarı açmadan Pipedream'den CapSkip kullanabilir miyim?

Doğrudan hayır, çünkü Pipedream’in hesaplama gücü Pipedream’e aittir. Bir şeyin gelen bağlantıyı kabul etmesi gerekir. Anahtar doğrulaması ve bir güvenlik duvarı kuralıyla Server modu, açık yanıttır. Politikanız açık bir portu tamamen yasaklıyorsa, alternatif, CAPTCHA işini kontrol ettiğiniz bir makinede tutmak ve Pipedream’in o makinenin kendi uç noktasını çağırmasını sağlamaktır ki bu, riski ortadan kaldırmaz, yalnızca yerini değiştirir.

Bir rerun ayrı bir yürütme sayılır mı?

Adım yeniden çalışır, dolayısıyla kod birden fazla kez yürütülür; sayacın var olmasının nedeni de tam budur. Yardımcının amacı, bekleme boyunca workflow’un açık tutulmaması ve böylece yavaş bir çözümün tek bir yürütmeyi süre sınırının ötesine itmemesidir. Faturalandırma sizin için önemliyse kendi planınızın hesaplama biçimini kontrol edin, ama zaman aşımı sorunu her hâlükârda çözülmüş olur.

SDK'yı mı yoksa ham uç noktaları mı kullanmalıyım?

Tek bir adım işin tamamını yapıyorsa SDK; çünkü yoklamayı o halleder, sabit bir aralıkta uyumak yerine 250 milisaniyeden geri çekilir ve size tipli hatalar verir. İşi rerun'lara bölüyorsanız ham uç noktalar; çünkü adım yoklamalar arasında çıkar ve görevi tutacak, bellekte kalmış bir istemci olmaz. İkisi de aynı porttaki aynı servisle konuşur.

Bunun n8n veya Zapier'da yapmaktan farkı ne?

Çoğunlukla çalışma zamanı. Pipedream size npm içe aktarmalarıyla gerçek Node.js verir; böylece SDK doğrudan yerine oturur ve rerun yardımcısı yavaş çözümleri temiz biçimde halleder. Zapier’ın kod adımı paket kuramaz, bu yüzden Zapier CAPTCHA rehberi onun zaman aşımı etrafında kurulmuştur. Make.com'un ise hiç kod adımı yok; bu yüzden Make.com anlatımı HTTP modüllerinden bir araya getirilmiştir. n8n, çözücünün yanında kendi sunucunuzda barındırılabilir, bu yüzden n8n rehberi çoğu zaman Local modunda kalabilir.

Kısa özet

CapSkip’i Server moduna alın, adresini ve anahtarını Pipedream ortam değişkenlerinde tutun ve SDK’yı doğrudan bir Node.js kod adımına aktarın. Workflow’un süre sınırı en yavaş çözümünüzün rahatça üzerindeyse, tek adım entegrasyonun tamamıdır. Değilse adımı bölün: ham uç noktaya gönderin, id’yi rerun yardımcısına verin ve geri dönerken yoklayın. Token’ı aldıktan hemen sonra gönderin, çünkü yaklaşık iki dakikada süresi doluyor.

Node.js tarafı şurada ele alınıyor: Node.js CAPTCHA çözücü sayfası, onay kutusu doğrulaması şurada: reCAPTCHA v2 çözücü sayfası, Python, PHP ve C# içindeki eşdeğer çağrılar ise şurada: CAPTCHA çözme SDK sayfası.

Bunu gün boyu çalışan bir şeye bağlamadan önce bilmekte fayda var: CapSkip, captcha atlatma işini zaten sahip olduğunuz donanımda yapar; dolayısıyla sürekli tetiklenen bir workflow ile ara sıra tetiklenen bir workflow tam olarak aynı maliyettedir.