Scarnox · Blog

Captcha-Solver in Node.js: ein funktionierendes Beispiel mit fetch (2026)

Ein Captcha-Solver in Node.js ist eine einzige HTTP-Anfrage. Node 18 und neuer bringen fetch mit, Sie brauchen also kein Paket, um die API aufzurufen. Senden Sie Sitekey und Seiten-URL, warten Sie auf die Antwort und legen Sie das Token in das Formular. Dieser Leitfaden zeigt den gesamten Ablauf für PopularCaptcha, das Scarnox heute proxyless löst.

Starten Sie mit einer kostenlosen Testphase, ganz ohne Karte und führen Sie den Code unten zuerst an einer Testseite aus.

Voraussetzungen

Das Solver-Modul

Das Modul unten ist eine einzelne Funktion. Sie sendet eine Anfrage an die API mit Bearer-Header, bricht nach 185 Sekunden ab und wirft einen Fehler, wenn errorId nicht 0 ist:

// solver.mjs
const API_URL = "https://api.scarnox.com/api/tasks/create";

export async function solveCaptcha(sitekey, pageUrl, { invisible = false } = {}) {
  const body = {
    captcha_type: "PopularCaptchaTaskProxyless",
    site_key: sitekey,
    site_url: pageUrl,
  };
  if (invisible) body.is_invisible = true;

  const res = await fetch(API_URL, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.SCARNOX_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
    signal: AbortSignal.timeout(185_000), // der Aufruf kehrt zurück, sobald das Token bereit ist
  });

  const data = await res.json().catch(() => null);
  if (!data) throw new Error(`HTTP ${res.status}: response was not JSON`);

  if (data.errorId !== 0) {
    throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  }
  return data.solution.token;
}

Es gibt kein Polling. Die Anfrage bleibt offen, bis das Token bereit ist, und bei Erfolg steht das Token in solution.token.

Wiederholungen

Eine fehlgeschlagene Lösung liefert errorId ungleich 0, und Sie werden dafür nicht berechnet. Eine kurze Wiederholungsschleife reicht für vorübergehende Fehler. Halten Sie die Zahl der Versuche niedrig, damit ein defekter Sitekey oder eine defekte Seiten-URL nicht unnötig Zeit verbraucht:

export async function solveWithRetry(sitekey, pageUrl, attempts = 3) {
  let lastError;
  for (let i = 1; i <= attempts; i++) {
    try {
      return await solveCaptcha(sitekey, pageUrl);
    } catch (err) {
      lastError = err;
      console.warn(`Attempt ${i} failed: ${err.message}`);
      await new Promise((r) => setTimeout(r, 1000 * i));
    }
  }
  throw lastError;
}

Eine ausführlichere Fehlerstrategie finden Sie unter Fehlerbehandlung für Captcha-Solver.

Das Token absenden

Das Token geht in das Formularfeld, das die Website erwartet. Die meisten PopularCaptcha-Seiten lesen h-captcha-response, und viele lesen außerdem g-recaptcha-response. Senden Sie beides, um auf der sicheren Seite zu sein:

// submit.mjs
import { solveWithRetry } from "./solver.mjs";

const pageUrl = "https://example.com/signup";
const token = await solveWithRetry("YOUR-SITEKEY-UUID", pageUrl);

const form = new URLSearchParams({
  email: "you@example.com",
  "h-captcha-response": token,
  "g-recaptcha-response": token,
});

const res = await fetch(pageUrl, {
  method: "POST",
  body: form,
  redirect: "manual",
});
console.log("Status:", res.status);

Ausführen mit:

SCARNOX_API_KEY=scarnox_YOURAPIKEY node submit.mjs

Cookies und Sitzungen

Einfaches fetch behält keine Cookies zwischen den Anfragen. Viele Registrierungs- und Suchseiten binden das Captcha an ein Sitzungs-Cookie, daher kann ein Token ohne das passende Cookie abgelehnt werden. Dafür gibt es zwei Wege:

Wählen Sie den ersten Weg, wenn das Formular einfach ist und die Website nicht viel JavaScript nutzt. Wählen Sie den zweiten für alles Aufwendigere.

Eine praktische Prüfung: Schauen Sie nach dem POST auf den Statuscode und die endgültige URL. Eine Weiterleitung auf eine Erfolgsseite bedeutet meist, dass das Token akzeptiert wurde. Eine Seite, die das Widget erneut zeigt, bedeutet meist, dass es abgelehnt wurde, oder dass das Cookie aus dem GET nicht mitgekommen ist. Protokollieren Sie den Antwort-Body für die ersten Läufe, damit Sie erkennen, in welchem Fall Sie sind.

Timing

Das Token läuft nach etwa zwei Minuten ab. Lösen Sie möglichst nah an dem Moment, in dem Sie absenden. Der übliche Fehler ist, zu Beginn eines langen Jobs zu lösen und später abzusenden. Lösen Sie, dann senden Sie sofort ab. Ablauf von Captcha-Tokens behandelt das ausführlicher.

Unsichtbare Captchas

Hat das Widget der Seite data-size="invisible", übergeben Sie { invisible: true }. Die Funktion sendet dann is_invisible: true mit der Anfrage:

const token = await solveCaptcha("YOUR-SITEKEY-UUID", pageUrl, { invisible: true });

Hängt die Seite außerdem einen Callback an das Widget, muss die Website diese Funktion möglicherweise mit dem Token aufrufen. Lesen Sie das Skript der Seite, um sie zu finden. Der Leitfaden unsichtbares Captcha behandelt die Muster.

Scraping mit dem Solver

Manchmal erscheint das Captcha auf einer Seite, die Sie scrapen, und nicht in einem Formular, das Sie absenden. Dasselbe Muster funktioniert: Das Widget im HTML erkennen, es lösen und an die URL senden, an die das Widget sendet. Halten Sie die Anfragerate niedrig und prüfen Sie zuerst die Nutzungsbedingungen der Website. Scrapen Sie verantwortungsvoll: Beachten Sie die robots.txt, vermeiden Sie personenbezogene Daten, die Sie nicht brauchen, und belasten Sie den Server nicht.

Preise

Scarnox rechnet pro erfolgreicher Lösung ab. Fehlgeschlagene Lösungen werden nicht berechnet. Die aktuellen Tarife finden Sie auf der Preisseite. Zum Einstieg starten Sie mit einer kostenlosen Testphase, ganz ohne Karte.

Nächste Schritte