Node.js में reCAPTCHA v2 कैसे हल करें, Invisible सहित

solve recaptcha v2 in node.js - How to Solve reCAPTCHA v2 in Node.js, Including Invisible

reCAPTCHA v2 के तीन variants हैं और वे सभी एक ही Node.js method पर जाते हैं। Checkbox सिर्फ़ सीधा call है, Invisible और Enterprise तीसरे argument में options हैं, और दोनों को मिलाया जा सकता है। package अपनी खुद की TypeScript definitions भी देता है, इसलिए इनमें से किसी के लिए अलग @types इंस्टॉल।

Setup

npm install capskip

CapSkip आपकी अपनी machine पर हल करता है, इसलिए पहले desktop app का चलना ज़रूरी है। फिर client को उसकी settings से मिले port पर लगाएं:

const { CapSkip } = require('capskip');

const solver = new CapSkip({
  apiKey: 'capskip',        // any string when key validation is off
  host: '127.0.0.1',
  port: 8080,
  recaptchaTimeout: 300,    // seconds
});

प्रोडक्शन में, connection विवरण environment से पढ़ें:

const solver = new CapSkip({
  apiKey: process.env.CAPSKIP_API_KEY || 'capskip',
  host: process.env.CAPSKIP_HOST || '127.0.0.1',
  port: parseInt(process.env.CAPSKIP_PORT || '8080', 10),
});

तीन variants

Variantजोड़ने का विकल्प
Checkboxnone
Invisible{ invisible: 1 }
Enterprise{ enterprise: 1 }
Invisible Enterpriseदोनों keys
// Checkbox: sitekey and page URL, nothing else.
const result = await solver.recaptcha(
  '6Lc...YOUR_SITEKEY',
  'https://example.com/login',
);

console.log(result.code);   // g-recaptcha-response token

// Invisible.
await solver.recaptcha(sitekey, pageUrl, { invisible: 1 });

// Enterprise, and both at once.
await solver.recaptcha(sitekey, pageUrl, { enterprise: 1 });
await solver.recaptcha(sitekey, pageUrl, { enterprise: 1, invisible: 1 });

argument शैली पर ध्यान दें। Node sitekey और URL को positionally लेता है, Python SDK के विपरीत जो keywords का उपयोग करता है। दोनों के बीच कोड port करना ही वह जगह है जहां ज़्यादातर गलतियां घुस आती हैं।

TypeScript

Type definitions package के साथ आती हैं, इसलिए यह बिना किसी अतिरिक्त install के काम करता है:

import { CapSkip, SolveResult } from 'capskip';

const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });
const result: SolveResult = await solver.recaptcha(sitekey, pageUrl);

SolveResult वहन करता है captchaId और code हर प्रकार के लिए, userAgent Turnstile के लिए, और तीन GeeTest fields। केवल reCAPTCHA के लिए code मायने रखता है।

sitekey को सही करना

यह है data-sitekey widget container पर attribute, या इसका पहला argument grecaptcha.render जब Invisible mode का मतलब है कि कोई दिखने वाला container नहीं है। यह हमेशा से शुरू होता है 6L और सार्वजनिक है।

URL वही page होना चाहिए जिस पर widget render होता है। किसी form handler या किसी post-login redirect को पास करना उस token का आम कारण है जो साफ़-सुथरा हल हो जाता है और फिर verification में विफल हो जाता है।

token सबमिट करना

const body = new URLSearchParams({
  'g-recaptcha-response': result.code,
  username: '...',
  password: '...',
});

const response = await fetch('https://example.com/login', {
  method: 'POST',
  body,
});

token एक-बार उपयोग वाले होते हैं और लगभग दो मिनट तक चलते हैं, इसलिए जितना देर से हो सके उतना देर से हल करें। अगर साइट token को किसी form field के बजाय किसी JavaScript callback को पास करती है, तो हल तो वही रहता है लेकिन submission अलग होता है, जिसे हमारा reCAPTCHA v2 callback सॉल्वर page कवर करता है।

एक साथ कई हल करना

const [a, b] = await Promise.all([
  solver.recaptcha(sitekeyA, 'https://a.example.com'),
  solver.recaptcha(sitekeyB, 'https://b.example.com'),
]);

console.log(a.code, b.code);

package यह भी निर्यात करता है AsyncCapSkip, लेकिन Node में यह केवल एक alias है CapSkip। Node I/O पहले से ही असिंक्रोनस है और हर मेथड पहले से ही एक Promise लौटाता है, इसलिए यह केवल इसलिए मौजूद है ताकि Python SDK से पोर्ट किया गया कोड काम करता रहे। इस पर स्विच करने से कुछ हासिल नहीं होता।

Errors

const {
  ValidationException, NetworkException, ApiException, TimeoutException,
} = require('capskip');

try {
  const result = await solver.recaptcha(sitekey, pageUrl);
} catch (err) {
  if (err instanceof ValidationException)      { /* bad arguments */ }
  else if (err instanceof NetworkException)    { /* CapSkip not running */ }
  else if (err instanceof ApiException)        { /* bad sitekey or url */ }
  else if (err instanceof TimeoutException)    { /* polling timed out */ }
  else throw err;
}

चारों एक साझा बेस को एक्सटेंड करते हैं, इसलिए पकड़ना CapSkipError अगर आप चाहें तो सब कुछ एक ही branch में संभालता है।

अक्सर पूछे जाने वाले सवाल

क्या मुझे परिणाम के लिए पोल करने की ज़रूरत है?

नहीं। client अंदरूनी रूप से poll करता है और Promise तैयार token के साथ resolve होता है। यह 250ms के बाद जाँचना शुरू करता है और उसकी ओर धीमा होता जाता है pollingInterval, जो आमतौर पर एक हाथ से लिखे loop से बेहतर होता है।

क्या यह ESM और import सिंटैक्स के साथ काम करता है?

हाँ। यहाँ दिए उदाहरण इसका इस्तेमाल करते हैं require संक्षिप्तता के लिए, लेकिन import { CapSkip } from 'capskip' काम करता है, और bundled TypeScript definitions इसके साथ आती हैं।

क्या मैं इसे Puppeteer या Playwright के साथ इस्तेमाल कर सकता हूँ?

हां। इस SDK से token हल करें, फिर इसे पेज में inject करें page.evaluate सबमिट करने से पहले। हमारा Node.js कैप्चा सॉल्वर पेज browser ऑटोमेशन पक्ष को कवर करता है।

सारांश

एक method, तीन variants, इससे चुने गए invisible और enterprise। आर्गुमेंट स्थितीय होते हैं, टोकन इसमें आता है result.code, और Promise.all concurrency के लिए आपको बस इतना ही चाहिए क्योंकि AsyncCapSkip यहाँ बस एक alias है।

व्यापक Node सतह यहाँ है Node.js कैप्चा सॉल्वर पेज, अन्य भाषाएँ यहाँ reCAPTCHA v2 सॉल्वर पेज, और एक है लाइव v2 डेमो जिसके विरुद्ध परीक्षण किया जाए। CapSkip एक है लोकल captcha सॉल्वर, इसलिए प्रति हल कुछ भी बिल नहीं होता।