So lösen Sie reCAPTCHA v2 in Node.js, einschließlich Invisible

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

reCAPTCHA v2 hat drei Varianten, und sie alle laufen auf dieselbe Node.js-Methode hinaus. Checkbox ist der bloße Aufruf, Invisible und Enterprise sind Optionen in einem dritten Argument, und beide lassen sich kombinieren. Das Paket bringt außerdem seine eigenen TypeScript-Definitionen mit, sodass hierfür nichts Separates nötig ist @types install.

Einrichtung

npm install capskip

CapSkip löst auf Ihrem eigenen Rechner, daher muss die Desktop-App zuerst laufen. Richten Sie den Client anschließend auf den Port aus den Einstellungen aus:

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

Lesen Sie die Verbindungsdetails in der Produktion aus der Umgebung:

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

Die drei Varianten

VarianteOption zum Hinzufügen
Checkboxkeine
Invisible{ invisible: 1 }
Enterprise{ enterprise: 1 }
Invisible Enterprisebeide Schlüssel
// 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 });

Beachten Sie den Argumentstil. Node übernimmt sitekey und URL positionsbasiert, anders als das Python-SDK, das Keywords verwendet. Beim Portieren von Code zwischen beiden schleichen sich die meisten Fehler ein.

TypeScript

Typdefinitionen sind im Paket enthalten, sodass dies ohne zusätzliche Installation funktioniert:

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 trägt captchaId und code für jeden Typ, userAgent für Turnstile und die drei GeeTest-Felder. Für reCAPTCHA nur code zählt.

Den sitekey richtig ermitteln

Es ist der data-sitekey Attribut auf dem Widget-Container oder das erste Argument von grecaptcha.render wenn der Invisible-Modus bedeutet, dass es keinen sichtbaren Container gibt. Es beginnt immer mit 6L und ist öffentlich.

Die URL muss die Seite sein, auf der das Widget gerendert wird. Das Übergeben eines Formular-Handlers oder einer Weiterleitung nach dem Login ist die übliche Ursache für einen Token, der sauber gelöst wird und dann bei der Verifizierung scheitert.

Den Token übermitteln

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

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

Tokens sind einmalig verwendbar und halten etwa zwei Minuten, lösen Sie also so spät wie möglich. Wenn die Website den Token an einen JavaScript-Callback statt an ein Formularfeld übergibt, ist das Lösen dasselbe, aber die Übermittlung unterscheidet sich, was unser reCAPTCHA-v2-Callback-Löser Seite abdeckt.

Mehrere gleichzeitig lösen

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);

Das Paket exportiert außerdem AsyncCapSkip, aber in Node ist es nur ein Alias von CapSkip. Node-I/O ist bereits asynchron und jede Methode gibt bereits ein Promise zurück, es existiert also einzig dafür, dass aus dem Python-SDK portierter Code weiterhin funktioniert. Der Wechsel dorthin bringt nichts.

Fehler

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;
}

Alle vier erweitern eine gemeinsame Basis, sodass das Abfangen von CapSkipError erledigt alles in einem einzigen Zweig, wenn Sie möchten.

Häufig gestellte Fragen

Muss ich das Ergebnis abfragen?

Nein. Der Client fragt intern ab, und das Promise wird mit dem fertigen Token aufgelöst. Es beginnt nach 250ms mit der Prüfung und verlängert die Abstände in Richtung pollingInterval, was üblicherweise eine handgeschriebene Schleife schlägt.

Funktioniert es mit ESM und import-Syntax?

Ja. Die Beispiele hier verwenden require der Kürze halber, aber import { CapSkip } from 'capskip' funktioniert, und die mitgelieferten TypeScript-Definitionen kommen gleich mit.

Kann ich dies zusammen mit Puppeteer oder Playwright verwenden?

Ja. Lösen Sie das Token mit diesem SDK und injizieren Sie es dann mit in die Seite page.evaluate vor dem Übermitteln. Unser Node.js-Captcha-Löser Seite behandelt den Bereich der Browser-Automatisierung.

Zusammenfassung

Eine Methode, drei Varianten, ausgewählt mit invisible und enterprise. Argumente sind positionsabhängig, der Token landet in result.code, und Promise.all ist alles, was Sie für Nebenläufigkeit brauchen, weil AsyncCapSkip ist hier nur ein Alias.

Der umfassendere Node-Funktionsumfang befindet sich auf der Node.js-Captcha-Löser Seite, andere Sprachen auf der reCAPTCHA-v2-Löser Seite, und es gibt eine Live-v2-Demo zum Testen. CapSkip ist ein lokaler Captcha-Löser, sodass nichts pro Lösung abgerechnet wird.