So lösen Sie reCAPTCHA v3 in Node.js und setzen eine Action

reCAPTCHA v3 zeigt niemals ein Rätsel. Es bewertet den Besuch still und übergibt der Seite einen Token, den die Website auf ihrem eigenen Backend verifiziert. Von Ihrer Seite gibt es nichts anzuklicken, sodass die gesamte Aufgabe darin besteht, einen Token zu erzeugen, den die Website akzeptiert. In Node.js ist das derselbe recaptcha Methode, die für v2 verwendet wird, mit einer zusätzlichen Option.
Das Detail, das entscheidet, ob es funktioniert, ist die Action.
Einrichtung
npm install capskip
const { CapSkip } = require('capskip');
const solver = new CapSkip({
host: '127.0.0.1',
port: 8080,
recaptchaTimeout: 300, // seconds, shared with Turnstile and GeeTest
});CapSkip läuft lokal, daher muss die Desktop-App geöffnet sein, bevor ein Aufruf erfolgreich sein kann.
Der grundlegende Aufruf
const result = await solver.recaptcha(
'6Lc...YOUR_SITEKEY',
'https://example.com/checkout',
{ version: 'v3', action: 'submit' },
);
console.log(result.code); // the v3 tokenZwei Unterschiede zu v2: version: 'v3' ist erforderlich, und action sollte mit dem übereinstimmen, was die Seite übergibt an grecaptcha.execute. Lassen Sie es weg, ist der Standard verify.
Warum die Action wichtig ist
Actions sind Labels, die eine Website an jede geschützte Interaktion anhängt, sodass ein Login und ein Checkout unabhängig voneinander bewertet werden können. Die meisten Backends prüfen, ob die Action im Token mit der übereinstimmt, die sie für diesen Endpunkt erwartet haben.
Senden Sie das falsche Label, ist der Token zwar echt, kommt aber mit der Kennzeichnung für eine andere Interaktion an, was viele Prüfer ablehnen. Lesen Sie den echten Wert von der Seite aus, statt zu raten:
const html = await (await fetch('https://example.com/checkout')).text();
// Sites normally call execute() with the action as a string literal.
const match = html.match(/execute\([^,]+,\s*\{\s*action:\s*['"]([^'"]+)/);
const action = match ? match[1] : 'verify';
const result = await solver.recaptcha(sitekey, pageUrl, {
version: 'v3',
action,
});Häufige Werte sind login, submit, homepage und checkout, aber es sind willkürliche Zeichenketten, gewählt von demjenigen, der die Website gebaut hat.
Enterprise v3
const result = await solver.recaptcha(sitekey, pageUrl, {
version: 'v3',
enterprise: 1,
action: 'submit',
});Enterprise ist ein orthogonales Flag statt eines anderen Produkts, es kommt also einfach obendrauf. Unterscheiden Sie die beiden anhand des Skripts, das die Seite lädt: Enterprise lädt enterprise.js, Standard-Pulls api.js. Eine falsche Annahme lässt die Lösung fehlschlagen, anstatt ein fehlerhaftes Token zurückzugeben, sie lässt sich also günstig prüfen.
Den Token übermitteln
const response = await fetch('https://example.com/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token: result.code,
orderId: '...',
}),
});Anders als bei v2 gibt es kein Standard-Formular-Widget, daher variieren v3-Integrationen. Manche verwenden ein verstecktes g-recaptcha-response Feld, andere senden JSON mit einem benutzerdefinierten Schlüssel. Prüfen Sie, was das seiteneigene JavaScript tut, bevor Sie einen Feldnamen annehmen.
Massenweise lösen
const tokens = await Promise.all(
urls.map((url) =>
solver.recaptcha(sitekey, url, { version: 'v3', action: 'submit' })),
);
console.log(tokens.map((t) => t.code));AsyncCapSkip existiert auch in diesem Paket, ist aber ein Alias von CapSkip. Jede Methode gibt bereits ein Promise zurück, daher Promise.all ist die gesamte Concurrency-Geschichte in Node.
Fehler
const { ApiException, NetworkException } = require('capskip');
try {
const result = await solver.recaptcha(sitekey, pageUrl, { version: 'v3' });
} catch (err) {
if (err instanceof NetworkException) {
// CapSkip is not running on the configured port
} else if (err instanceof ApiException) {
// the sitekey or pageurl was rejected
} else {
throw err;
}
}Häufig gestellte Fragen
Kann ich den Score vor dem Absenden sehen?
Nein. Der Score bleibt bei Google und wird dem Website-Betreiber erst offengelegt, wenn dessen Backend den Token verifiziert. Auf der Client-Seite erhalten Sie einen Token und nichts weiter, sodass es keine Möglichkeit gibt, einen Score vorab zu inspizieren oder danach zu filtern.
Was, wenn die Seite keine sichtbare Aktion hat?
Einige Seiten rufen auf execute ohne einen, in welchem Fall der Standard verify korrekt ist. Wenn die obige Regex nichts findet, ist das meist der Grund und nicht ein Parsing-Fehler.
Wie lange ist ein v3-Token gültig?
Ungefähr zwei Minuten, für den einmaligen Gebrauch, genauso wie v2. Lösen Sie unmittelbar vor der Anfrage, die es benötigt, statt einen Pool aufzubauen.
Zusammenfassung
Übergeben Sie version: 'v3', setzen Sie action an das, was die Seite tatsächlich ausführt, und fügen Sie hinzu enterprise: 1 wenn es lädt enterprise.js, und senden Sie zügig ab, da der Token in etwa zwei Minuten abläuft.
Andere Sprachen werden behandelt auf der reCAPTCHA-v3-Löser -Seite, Enterprise-Spezifika auf der Enterprise-Löser Seite, und die breitere Node-Oberfläche auf der Node.js-Captcha-Löser Seite. Sehen Sie zu, wie ein echtes Token erscheint auf unserer v3-Demo. CapSkip ist ein Captcha-Löser das auf Ihrem eigenen Rechner läuft.
