Cara Memecahkan CAPTCHA di Code Step Pipedream (Node.js)

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

Memecahkan captcha di Pipedream lebih mudah daripada pekerjaan yang sama di Zapier atau Make.com, karena code step adalah runtime Node.js v20 sungguhan dengan impor npm. Anda tidak menginstal apa pun, Anda menulis JavaScript biasa, dan SDK CapSkip bekerja persis seperti di laptop Anda. Ada dua hal yang berbeda, dan keduanya soal di mana kodenya berjalan. Pipedream mengeksekusi di cloud miliknya sendiri, jadi pemecah harus bisa dijangkau dari internet. Dan satu eksekusi workflow punya batas waktu yang lebih pendek daripada satu pemecahan reCAPTCHA, yang menentukan apakah Anda menulis satu langkah atau dua.

Apa yang Anda butuhkan

  • Workflow Pipedream dengan code step. Node.js adalah runtime yang dipakai di bawah ini. Versi Python ada lebih jauh di bawah.
  • CapSkip berjalan dalam mode Server, di mesin yang bisa dijangkau dari internet, dengan IP publik statis.
  • Sitekey dan URL halaman dari situs yang Anda otomatisasi.
  • Dua variabel lingkungan Pipedream yang menyimpan alamat pemecah dan key-nya.

Mengapa alamat loopback tidak bisa bekerja di sini

Workflow Pipedream berjalan di infrastruktur milik Pipedream sendiri, di jaringan AWS us-east-1. Permintaan ke 127.0.0.1 dari dalam code step mengarah ke container tempat langkah itu berjalan, bukan ke meja Anda. Tidak ada yang mendengarkan di sana, dan SDK memunculkan NetworkException.

CapSkip punya dua mode koneksi dan mode yang kedua adalah jawabannya. Local mengikat ke 127.0.0.1 dan hanya melayani perangkat itu, yang tepat ketika otomatisasi dan pemecah berbagi satu mesin. Server mengikat ke alamat jaringan atau IP publik Anda, sehingga platform hosted bisa menjangkau mesin Windows yang sama lewat API. IP publik statis disarankan, karena alamat residensial yang berganti-ganti akan merusak workflow pada pukul tiga pagi tanpa memberi tahu Anda. Kedua mode disiapkan di bagian pengaturan koneksi.

mode Server hanya mengubah di mana pemecah berjalan dan tidak lebih dari itu. Itu tetap hardware Anda dan tetap tanpa batas pemakaian, jadi workflow yang berjalan sepuluh ribu kali sebulan biayanya sama dengan yang berjalan sepuluh kali.

Langkah 1: taruh alamatnya di variabel lingkungan

Jangan menulis IP publik secara hardcode di dalam langkah itu. Pipedream punya variabel lingkungan workspace, dan code step membacanya dari environment proses biasa. Buat dua variabel.

Nama variabelNilai
Yang bernama CAPSKIP_HOSTIP publik mesin pemecah Anda, tanpa skema dan tanpa port
Yang bernama CAPSKIP_API_KEYKey yang Anda buat di aplikasi CapSkip untuk workflow ini

Beri workflow ini key-nya sendiri alih-alih berbagi satu key. Mencabut key yang bocor ke workspace bersama seharusnya tidak ikut menjatuhkan sisa otomatisasi Anda.

Langkah 2: seluruh pemecahan dalam satu code step

Pipedream menginstal paket npm begitu Anda mengimpornya, jadi tidak ada langkah instalasi dan tidak ada file paket. Specifier impor juga menjadi tempat Anda mengunci versi, yang layak dilakukan pada apa pun yang berjalan tanpa pengawasan.

// 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
  },
});

Itu saja keseluruhannya. Setiap varian reCAPTCHA memakai metode yang sama dengan objek options: invisible disetel ke 1, enterprise disetel ke 1, atau version disetel ke v3 dengan nama action. Turnstile dan GeeTest punya metodenya sendiri dengan bentuk yang sama, dan daftar parameter lengkapnya ada di dokumentasi API CapSkip.

Apa pun yang dikembalikan langkah itu masuk ke exports workflow, jadi langkah berikutnya membaca token dari nama langkah itu sendiri. Jika Anda lebih suka memberinya label, gunakan helper export.

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

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

Timeout eksekusi, dan kapan satu langkah tidak lagi cukup

Inilah batasan yang membentuk semua hal lainnya. Eksekusi Pipedream punya batas waktu default 30 detik untuk trigger HTTP dan email, dan 60 detik untuk trigger cron. Anda bisa menaikkannya di pengaturan workflow, hingga 300 detik pada tier gratis dan 750 detik pada tier berbayar.

Pemecahan reCAPTCHA v2 biasanya selesai jauh di bawah 30 detik, tetapi biasanya tidak berarti selalu, dan batas atas milik SDK sendiri adalah recaptchaTimeout pada 300 detik. Jadi versi satu langkah di atas persis seandal pengaturan timeout Anda. Jika batas workflow lebih rendah daripada waktu pemecahan, eksekusi dihentikan di tengah polling dan Anda mendapat proses yang gagal tanpa isi yang berguna.

Situasi AndaApa yang harus dilakukan
Volume rendah, dan Anda bisa menaikkan batas eksekusi ke 300 detikPertahankan versi satu langkah. Naikkan timeout di pengaturan workflow
Volume tinggi, atau Anda membayar waktu eksekusiPisahkan, dan gunakan helper rerun yang dijelaskan di bawah
Halaman tantangan Turnstile atau GeeTest, yang memakan waktu lebih lamaPisahkan. Jenis inilah yang paling mungkin melampaui batas waktu yang pendek

Langkah 3: pisahkan dengan helper rerun

Pipedream punya primitif polling yang tidak dimiliki sebagian besar platform otomatisasi. Helper flow rerun mengakhiri langkah saat ini, menunggu, lalu menjalankan langkah yang sama lagi dengan sepotong state yang Anda berikan. Workflow tidak sedang dieksekusi selama menunggu, jadi pemecahan yang lambat tidak membebani Anda dan tidak bisa menabrak batas waktu.

Tiga hal membuatnya bekerja. Penghitung run mulai dari 1 dan bertambah pada setiap rerun. Objek context yang Anda berikan bisa dibaca pada pass berikutnya. Dan melewati batas percobaan ulang membuat workflow lanjut ke langkah berikutnya alih-alih gagal, jadi lemparkan error jika itu bukan yang Anda inginkan.

// 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);
  },
});

Penulisan respons pending itu sering menjebak orang. Bentuknya CAPCHA_NOT_READY, kurang satu huruf T, dan itu bukan error: artinya jawabannya belum selesai dan Anda harus melakukan polling lagi. Memperlakukannya sebagai kegagalan adalah bug paling umum dalam loop polling tulisan tangan, dan ada ulasan lengkap tentang respons CAPCHA_NOT_READY.

Satu hal lagi tentang endpoint itu. Hasilnya hanya bisa dibaca tepat satu kali. Jika Anda mencatat body responsnya lalu membacanya lagi di langkah berikutnya, pembacaan kedua kembali kosong dan tampak seperti pemecahan yang gagal.

Kirim token segera

Token reCAPTCHA berlaku sekitar dua menit. Di dalam workflow, waktu itu lebih mudah habis daripada kedengarannya, karena langkah delay, panggilan HTTP yang lambat, atau rerun yang menunggu terlalu lama semuanya memakan jatah yang sama. Taruh langkah yang mengirim token tepat setelah langkah yang menghasilkannya, dan jangan menyiapkan token untuk dipakai nanti. Gambaran lengkapnya ada di panduan kedaluwarsa token reCAPTCHA.

Versi Python

Pipedream juga menjalankan code step Python 3.12, dan ia menginstal paket pip dari impor Anda dengan cara yang sama. SDK tidak membaca variabel lingkungan dengan sendirinya, jadi langkah di bawah membaca CAPSKIP_HOST, CAPSKIP_PORT dan CAPSKIP_API_KEY lalu meneruskannya ke konstruktor.

# 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"]}

Setel CAPSKIP_PORT ke 8080 bersama dua variabel lainnya jika Anda menempuh jalur ini. Satu keterbatasan yang perlu diketahui sebelum Anda memutuskan: helper rerun dan delay hanya didokumentasikan untuk Node.js, jadi langkah Python hanya tersedia dalam versi sekali jalan. Jika Anda butuh bentuk polling yang dipisah, tulis langkah itu di Node.

Mengamankan port yang baru saja Anda buka

mode Server menempatkan listener di internet publik, jadi perlakukan seperti layanan terbuka lainnya. Ada tiga hal yang layak dilakukan sejak hari pertama.

  • Aktifkan validasi API key di aplikasi CapSkip dan beri workflow ini key-nya sendiri. Tanpa itu, string apa pun diterima sebagai key.
  • Tempatkan pemecah di balik aturan firewall alih-alih membiarkan 8080 terbuka untuk semua.
  • Tentukan bagaimana Anda akan menyusun aturan itu. Lalu lintas keluar biasa dari Pipedream berasal dari rentang AWS us-east-1 standar, yang jauh terlalu luas untuk dimasukkan ke allowlist secara berguna. Jika Anda butuh aturan yang sempit, Pipedream menyediakan VPC dengan IP keluar statis khusus per workspace, dan itulah alamat yang Anda masukkan ke allowlist.

Kesalahan umum dan artinya

Apa yang Anda lihatPenyebabPerbaiki
NetworkException, atau koneksi ditolak di port 8080Pemecah berada dalam mode Local, atau variabel host salahBeralihlah ke mode Server dan setel variabel host ke IP publik
Eksekusi dihentikan di tengah proses pemecahanBatas waktu workflow lebih pendek daripada waktu yang dibutuhkan pemecahanNaikkan di pengaturan workflow, atau pindah ke versi rerun
Langkah itu mengembalikan respons pending secara harfiah sebagai hasilnyaCabang polling memperlakukan CAPCHA_NOT_READY sebagai jawabanPeriksa secara eksplisit lalu jalankan rerun alih-alih mengembalikannya
ERROR_WRONG_USER_KEY dari endpoint mentahVariabel key kosong, jadi yang terkirim adalah string kosongPeriksa nama variabel lingkungannya, termasuk huruf besar kecilnya
Token kosong pada pembacaan keduaHasil hanya bisa dibaca satu kaliBaca sekali, simpan di sebuah variabel, lalu teruskan variabel itu
Token yang valid ditolak oleh situs targetToken kedaluwarsa di antara pemecahan dan pengirimanPindahkan langkah pengiriman tepat setelah langkah pemecahan
Cannot use import statement outside a moduleLangkah itu mencampur import dan requirePilih satu gaya per langkah. Code step adalah modul ES

FAQ

Bisakah saya memakai CapSkip dari Pipedream tanpa mengekspos apa pun?

Tidak secara langsung, karena komputasi Pipedream adalah milik Pipedream. Sesuatu harus menerima koneksi masuk. mode Server dengan validasi key dan aturan firewall adalah jawaban yang paling lugas. Jika kebijakan Anda melarang port terbuka sama sekali, alternatifnya adalah menjaga pekerjaan CAPTCHA di mesin yang Anda kendalikan dan meminta Pipedream memanggil endpoint milik mesin itu, yang memindahkan paparan alih-alih menghilangkannya.

Apakah rerun dihitung sebagai eksekusi terpisah?

Langkahnya berjalan lagi, jadi kodenya dieksekusi lebih dari sekali, dan justru itulah alasan penghitungnya ada. Inti dari helper ini adalah workflow tidak ditahan tetap terbuka selama penantian, sehingga pemecahan yang lambat tidak mendorong satu eksekusi melewati batas waktu. Periksa perhitungan pada paket Anda sendiri jika penagihan penting, tetapi masalah timeout tetap terselesaikan.

Sebaiknya saya memakai SDK atau endpoint mentah?

SDK ketika satu langkah mengerjakan seluruh pekerjaan, karena ia menangani polling, melambat mulai dari 250 milidetik alih-alih tidur pada interval datar, dan memberi Anda error bertipe. Endpoint mentah ketika Anda memisahkannya ke beberapa rerun, karena langkahnya keluar di antara polling dan tidak ada client yang tersisa di memori untuk memegang task itu. Keduanya berbicara ke layanan yang sama di port yang sama.

Apa bedanya ini dengan melakukannya di n8n atau Zapier?

Sebagian besar soal runtime. Pipedream memberi Anda Node.js sungguhan dengan impor npm, jadi SDK langsung bisa dipakai, dan helper rerun menangani pemecahan yang lambat dengan rapi. Code step Zapier tidak bisa menginstal paket, jadi panduan CAPTCHA Zapier dibangun di sekitar batas waktunya. Make.com sama sekali tidak punya code step, itulah sebabnya panduan langkah demi langkah Make.com disusun dari modul HTTP. n8n bisa di-self-host berdampingan dengan pemecah, jadi panduan n8n sering kali bisa tetap memakai mode Local.

Versi singkatnya

Jalankan CapSkip dalam mode Server, simpan alamat dan key-nya di variabel lingkungan Pipedream, dan impor SDK langsung ke dalam code step Node.js. Jika batas waktu workflow cukup longgar di atas pemecahan Anda yang paling lambat, satu langkah sudah menjadi keseluruhan integrasinya. Jika tidak, pisahkan langkahnya: kirim ke endpoint mentah, serahkan id ke helper rerun, lalu lakukan polling saat masuk kembali. Kirim token segera setelah Anda mendapatkannya, karena token kedaluwarsa dalam sekitar dua menit.

Sisi Node.js dibahas di halaman pemecah CAPTCHA Node.js, tantangan checkbox di halaman pemecah reCAPTCHA v2, dan panggilan yang setara di Python, PHP, dan C# ada di halaman SDK pemecahan CAPTCHA.

Perlu diketahui sebelum Anda memasang ini ke sesuatu yang berjalan sepanjang hari: CapSkip melakukan bypass captcha di hardware yang sudah Anda miliki, jadi workflow yang berjalan terus-menerus dan yang berjalan sesekali biayanya persis sama.