Scarnox · Blog

Playwright और Puppeteer में PopularCaptcha हल करना (Node.js)

PopularCaptcha दिखते ही ब्राउज़र ऑटोमेशन रुक जाता है। स्क्रिप्ट से इमेज ग्रिड पर क्लिक करना धीमा और नाज़ुक है। सॉल्विंग API से टोकन लेकर उसे पेज में डालना एक रिक्वेस्ट का काम है, और बाकी स्क्रिप्ट सामान्य रूप से चलती रहती है।

यह गाइड Node.js के साथ Playwright और Puppeteer को कवर करती है। दोनों में फ़्लो एक ही है, और उदाहरण proxyless सॉल्व इस्तेमाल करते हैं, जिन्हें Scarnox अपने नेटवर्क पर चलाता है। PopularCaptcha वह टाइप है जिसे Scarnox आज हल करता है। बाकी कैप्चा टाइप जल्द आ रहे हैं, इसलिए नीचे का कोड केवल PopularCaptcha के लिए है।

फ़्लो

  1. पेज से sitekey पढ़ें।
  2. एक ब्लॉकिंग POST रिक्वेस्ट से Scarnox से टोकन मांगें।
  3. टोकन को response फ़ील्ड में डालें, या साइट के callback को दें, फिर फॉर्म सबमिट करें।

key सेट करें

खाता बनाएं और मुफ्त ट्रायल क्रेडिट के साथ शुरू करें, कार्ड की ज़रूरत नहीं। key को environment variable में रखें, टेस्ट कोड में कभी नहीं:

export SCARNOX_KEY="scarnox_YOURAPIKEY"

Node 18 और बाद के संस्करणों में fetch पहले से शामिल है, इसलिए API कॉल के लिए कोई अतिरिक्त पैकेज नहीं चाहिए।

Playwright

import { chromium } from "playwright";

const API_KEY = process.env.SCARNOX_KEY;

async function solve(sitekey, url) {
  const r = await fetch("https://api.scarnox.com/api/tasks/create", {
    method: "POST",
    headers: { Authorization: `Bearer ${API_KEY}`, "Content-Type": "application/json" },
    body: JSON.stringify({ captcha_type: "PopularCaptchaTaskProxyless", site_key: sitekey, site_url: url }),
  });
  const data = await r.json();
  if (data.errorId !== 0) throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  return data.solution.token;
}

const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto("https://example.com/signup");

const sitekey = await page.getAttribute("[data-sitekey]", "data-sitekey");
const token = await solve(sitekey, page.url());

// टोकन को दोनों response फ़ील्ड में डालें जिन्हें साइट पढ़ सकती है।
await page.evaluate((t) => {
  for (const name of ["h-captcha-response", "g-recaptcha-response"]) {
    document.querySelectorAll(`[name="${name}"]`).forEach((el) => { el.value = t; });
  }
}, token);

await page.fill("#email", "you@example.com");
await page.click("button[type=submit]");

ध्यान दें कि site_url page.url() से आता है। वही पेज है जिस पर विजेट है, और सॉल्वर को यही चाहिए। सॉल्व पेज लोड होने के बाद होता है, इसलिए sitekey पहले से DOM में है।

Puppeteer

Puppeteer केवल selector API में अलग है। ऊपर का solve फ़ंक्शन दोबारा इस्तेमाल करें और पेज कॉल बदल दें:

const sitekey = await page.$eval("[data-sitekey]", (el) => el.dataset.sitekey);
const token = await solve(sitekey, page.url());

await page.evaluate((t) => {
  document.querySelectorAll('[name="h-captcha-response"],[name="g-recaptcha-response"]')
    .forEach((el) => { el.value = t; });
}, token);

जब साइट callback इस्तेमाल करे

कुछ साइटें छिपे फ़ील्ड को नहीं पढ़तीं। वे विजेट के JavaScript callback का इंतज़ार करती हैं। विजेट के data-callback एट्रिब्यूट में बताया गया फ़ंक्शन ढूंढें और उसे टोकन के साथ कॉल करें:

await page.evaluate((t) => {
  const name = document.querySelector("[data-sitekey]")?.dataset.callback;
  if (name && typeof window[name] === "function") window[name](t);
}, token);

अगर साइट दोनों इस्तेमाल करती है, तो फ़ील्ड भी भरें और callback भी कॉल करें। दोनों करना नुकसानदेह नहीं है।

Invisible विजेट

Invisible विजेट में कोई चेकबॉक्स नहीं होता। साइट उसे अपने कोड से शुरू करती है, आम तौर पर तब जब विज़िटर submit दबाता है। वही रिक्वेस्ट भेजें, वैकल्पिक is_invisible फ़ील्ड true पर सेट करके:

body: JSON.stringify({
  captcha_type: "PopularCaptchaTaskProxyless",
  site_key: sitekey,
  site_url: url,
  is_invisible: true,
}),

अदृश्य कैप्चा गाइड समझाती है कि ऐसे विजेट कैसे पहचानें और टोकन कैसे वापस दें।

समय के सुझाव

अपने फ़्लो का टेस्ट

उदाहरण को किसी बड़ी चीज़ पर लगाने से पहले उसे अपने फॉर्म पर चलाएं। तीन बातें जांचें: टोकन स्वीकार हुआ, फॉर्म सबमिट हुआ, और अगला पेज दिखा। जब फ़्लो शुरू से अंत तक काम करे, तो हर रन में एक असली सॉल्व के साथ CI में हरा रखें।

मुफ्त में आज़माएं

खाता बनाएं और मुफ्त ट्रायल क्रेडिट के साथ शुरू करें, कार्ड की ज़रूरत नहीं। पूरे फ़्लो को जोड़ने और जांचने के लिए यह काफी है। बड़ी मात्रा में सॉल्व की लागत के लिए मौजूदा कीमतें देखें।

अस्वीकार हुए टोकन को डीबग करना

जब साइट टोकन अस्वीकार करे, तो कुछ और बदलने से पहले एक रिक्वेस्ट और एक पेज लोड के साथ फ़्लो दोबारा चलाएं। ये क्रम में जांचें:

विफलता के समय पेज HTML await page.content() से सहेजें। उसे किसी काम करने वाले रन से तुलना करने पर अक्सर फर्क एक नज़र में दिख जाता है: अलग sitekey, गायब फ़ील्ड, या ऐसा विजेट जो दूसरे मोड में रेंडर हुआ।

अगले कदम