reCAPTCHA Enterprise mit Node.js lösen
Verwenden Sie das offizielle solvethree JavaScript SDK unter Node.js 22+. Konfigurieren Sie ein aktives Websiteprofil, geben Sie den Hostnamen und die Aktion der Website an und führen Sie den Lösungsvorgang über einen Proxy aus. Das SDK gibt das Token und die Browseridentität zurück; Ihre Anwendung übermittelt sie an das Ziel.
Auf dieser Seite
SDK installieren und Website konfigurieren
Installieren Sie das offizielle Paket direkt von solvethree.com:
npm install https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz- 1.
Websiteprofil aktivieren
Richten Sie die Zielwebsite in der Konsole ein und stellen Sie sicher, dass ihr Profil aktiv und für Ihren Workspace verfügbar ist. Das Senden eines Hostnamens und einer Aktion erstellt kein Profil. Siehe Websiteprofil einrichten.
- 2.
Serverumgebung konfigurieren
Setzen Sie SOLVETHREE_API_KEY in der Umgebung des Node.js-Prozesses auf den API-Schlüssel Ihres Workspace und SOLVETHREE_PROXY auf Ihre Proxy-URL. Bewahren Sie den API-Schlüssel auf dem Server auf; legen Sie ihn nicht im Browsercode offen.
- 3.
Skript vorbereiten
Speichern Sie das nächste Beispiel als solve.mjs. Ersetzen Sie accounts.example.com durch Ihren konfigurierten Hostnamen und login durch die tatsächliche reCAPTCHA-Aktion der Seite.
Enterprise-Token anfordern
Verwenden Sie für site einen Hostnamen, keine Seiten-URL. reCAPTCHA verwendet standardmäßig enterprise-v3, daher benötigt das Beispiel kein recaptchaType. Fügen Sie weder type noch url hinzu. Die Anfrage erfordert genau eines der Felder proxy oder proxyCandidates; dieses Beispiel verwendet einen einzelnen Proxy.
import { randomUUID } from 'node:crypto';
import { Solvethree, SolvethreeError, TaskFailedError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const request = {
site: 'accounts.example.com', // Use your configured hostname.
action: 'login', // Use the page's actual action.
proxy: process.env.SOLVETHREE_PROXY,
requestId: randomUUID(),
};
let result;
try {
result = await client.solve(request, { timeoutMs: 180_000 });
} catch (error) {
if (error instanceof TaskFailedError) {
throw new Error(`Task failed: ${error.errorCode}`);
}
if (error instanceof SolvethreeError) {
// Save these IDs; use them to recover the existing task.
console.error({ requestId: error.requestId, taskId: error.taskId });
}
throw error;
}
const { token, userAgent, secChUa } = result.solution;
console.log('Ready task:', result.id); // Keep solution credentials private.Führen Sie das Skript nach dem Setzen der Umgebungsvariablen mit Node.js aus. solve erstellt die Aufgabe einmal und fragt ihren Status wiederholt ab, bis sie fertig ist oder eine Ausnahme ausgelöst wird. Das Timeout von 180,000 ms begrenzt die Wartezeit des Clients.
Die zurückgegebenen Felder haben unterschiedliche Aufgaben:
result.ididentifiziert die Aufgabe. Es ist nicht das CAPTCHA-Token.result.solution.tokenist der Wert, der im CAPTCHA-Feld der Anwendung übermittelt werden muss.result.solution.userAgentundresult.solution.secChUabilden die Browseridentität, die mit diesem Token verwendet werden muss.
Behandeln Sie die Lösungswerte vertraulich. Wenn Sie den Vorgang nach einem Prozessneustart fortsetzen müssen, speichern Sie requestId und die exakten Aufgabeneingaben vor dem Aufruf von solve und schützen Sie dabei etwaige Proxy-Zugangsdaten.
Über denselben Proxy übermitteln
Fahren Sie im selben Skript fort, nachdem solve zurückgekehrt ist. Dieses Beispiel verwendet undici, das Sie separat installieren müssen, wie im zugehörigen Kommentar beschrieben. Es sendet das Token über request.proxy und verwendet beide zurückgegebenen Felder zur Browseridentität.
// Continue after client.solve(). Install undici separately: npm install undici@7.
import { fetch, ProxyAgent } from 'undici';
const dispatcher = new ProxyAgent(request.proxy);
try {
// Replace the URL and form fields with your application's contract.
const response = await fetch('https://accounts.example.com/login', {
method: 'POST',
dispatcher,
redirect: 'manual',
headers: {
'user-agent': result.solution.userAgent,
'sec-ch-ua': result.solution.secChUa,
},
body: new URLSearchParams({
'g-recaptcha-response': result.solution.token,
}),
signal: AbortSignal.timeout(30_000),
});
console.log('Application HTTP status:', response.status);
await response.arrayBuffer();
} finally {
await dispatcher.close();
}Ersetzen Sie die URL und die Formularfelder entsprechend den Anforderungen Ihrer Anwendung. Das Beispiel enthält nur g-recaptcha-response; ergänzen Sie alle weiteren Felder und Sitzungsdaten, die die Anwendung benötigt. Das Ziel muss mit der Website und der Aktion des Lösungsvorgangs übereinstimmen.
Da die Lösungsanfrage einen Proxy verwendet, bleibt die Übermittlung durch Wiederverwendung von request.proxy auf diesem Proxy. Wenn Sie die Anfrage auf proxyCandidates umstellen, wählen Sie stattdessen den erfolgreichen Proxy mit der SDK-Hilfsfunktion successfulProxy aus.
Eine fertige Aufgabe bedeutet, dass eine Lösung generiert wurde, nicht, dass das Ziel Ihre Anwendungsanfrage akzeptiert hat. Prüfen Sie anhand der Antwort des Ziels, ob dessen tatsächliche Erfolgsbedingung erfüllt ist; die Ausgabe eines HTTP-Status reicht nicht aus. Hinweise zur Diagnose einer Ablehnung finden Sie unter Fertiges Token abgelehnt.
Fehler behandeln und unterbrochene Anfragen fortsetzen
Das Lösungsbeispiel unterscheidet endgültige Aufgabenfehler von anderen SDK-Fehlern. Behalten Sie diese Unterscheidung bei: Eine fehlgeschlagene Aufgabe und eine fehlgeschlagene HTTP-Anfrage erfordern eine unterschiedliche Behandlung.
- solve löst TaskFailedError aus
Die Ausnahme enthält errorCode und taskId. Rufen Sie getTask(taskId) auf, wenn Sie die vollständige Antwort zur fehlgeschlagenen Aufgabe einschließlich ihres Fehlertexts benötigen.
Probiere Folgendes: Beenden Sie die Statusabfrage dieser Aufgabe und beheben Sie die gemeldete Ursache, bevor Sie eine weitere erstellen. Wiederholen Sie die Anfrage nicht mit unveränderten ungültigen Eingaben.
- Ein SolvethreeError enthält taskId
Dem SDK liegt eine ID für die vorhandene Aufgabe vor.
Probiere Folgendes: Setzen Sie die Statusabfrage mit getTask fort. Fahren Sie bei pending oder solving fort, verwenden Sie die Lösung erst bei ready und beenden Sie die Abfrage bei failed.
- Die Erstellung wird unterbrochen und nur requestId ist verfügbar
Eine Verbindungszeitüberschreitung beweist nicht, dass die Aufgabe nicht erstellt wurde.
Probiere Folgendes: Stellen Sie die Aufgabe mit createTask unter Verwendung identischer Aufgabeneingaben und derselben requestId wieder her. Die Wiederverwendung dieser ID mit anderen Eingaben führt zu einem Konflikt.
- Die API lehnt eine HTTP-Anfrage ab
Prüfen Sie den von ApiError bereitgestellten HTTP-Status, statt die Antwort als fertige oder fehlgeschlagene Aufgabe zu behandeln.
Probiere Folgendes: Beheben Sie den HTTP-Fehler, bevor Sie die Nutzdaten einer erfolgreichen Antwort verarbeiten. Gehen Sie nicht davon aus, dass jeder Fehler auf unzureichendes Guthaben zurückzuführen ist.
Das Beispiel generiert bei jedem Programmstart eine neue requestId. Eine unveränderte erneute Ausführung ist keine Wiederaufnahme: Verwenden Sie stattdessen Ihre gespeicherte Anfrage und die zugehörigen IDs. Das SDK wiederholt die Aufgabenerstellung niemals automatisch; bei vorübergehenden Fehlern während der Statusabfrage berücksichtigt es jedoch Retry-After innerhalb der Frist für den Lösungsvorgang.
Informationen zu expliziten Statusabfragen und Warteeinstellungen finden Sie unter Statusabfragen und Zeitüberschreitungen bei Aufgaben.
Quellen und API-Referenz
Führe deinen ersten Task aus.
Starte mit $5 Workspace-Guthaben.