Captcha Solver für
Puppeteer
Lösen Sie die Challenge innerhalb des Laufs, statt den Job scheitern zu lassen. Ein lauffähiges Node.js-Beispiel und die drei Faktoren, die über die Annahme Ihres Tokens entscheiden.
import puppeteer from "puppeteer";
const CAPTCHANO_KEY = "cn-YOUR_API_KEY";
async function solve(task) {
const headers = {
Authorization: `Bearer ${CAPTCHANO_KEY}`,
"Content-Type": "application/json",
};
const res = await fetch("https://api.captchano.com/v1/solve?wait=60", {
method: "POST",
headers,
body: JSON.stringify(task),
});
let data = await res.json();
// A solve can outlast the 60 s wait: poll the task until it finishes.
while (data.status === "queued" || data.status === "solving") {
await new Promise((r) => setTimeout(r, 5000));
const poll = await fetch(`https://api.captchano.com/v1/task/${data.id}`, { headers });
data = await poll.json();
}
if (data.status !== "ready") throw new Error(JSON.stringify(data.error ?? data));
return data.solution; // { token, userAgent }
}
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://example.com/signup");
const sitekey = await page.$eval("[data-sitekey]", (el) => el.getAttribute("data-sitekey"));
const { token, userAgent } = await solve({ type: "turnstile", sitekey, url: page.url() });
// Turnstile binds the token to a user agent: replay the one it was minted with.
if (userAgent) await page.setUserAgent(userAgent);
await page.evaluate((t) => {
document.querySelector('[name="cf-turnstile-response"]').value = t;
}, token);
await page.click('button[type="submit"]');Was über die Annahme des Tokens entscheidet
- Reichen Sie Ihren Proxy durch. Das Token sollte hinter derselben Exit-IP erzeugt werden, von der es auch abgeschickt wird. Bei sitzungsbasiert bewertenden Systemen ist das Pflicht, keine Optimierung.
- Verwenden Sie denselben User-Agent. Turnstile und mehrere Anti-Bot-Systeme binden das Token an einen User-Agent. Wir geben den verwendeten zurück, damit Sie ihn exakt übernehmen können.
- Fordern Sie spät an. Tokens laufen nach etwa 120 Sekunden ab. Fordern Sie eines erst an, wenn Sie zum Absenden bereit sind.
Blockierend oder Polling
Das Beispiel nutzt ?wait=60, sodass der Aufruf die fertige Lösung zurückgibt und Ihr Puppeteer-Schritt linear bleibt. Wenn Sie keine Verbindung offen halten möchten, lassen Sie den Parameter weg, speichern die zurückgegebene id und fragen GET /v1/task/{id} alle fünf Sekunden ab. Ein bezahltes Token bleibt zehn Minuten lang abrufbar, eine abgebrochene Verbindung kostet Sie also nicht die Lösung.
Kosten
$0.00598 pro erfolgreicher reCAPTCHA-v2-Lösung, fehlgeschlagene Lösungen werden nie berechnet. Unter Preise finden Sie jeden Challenge-Typ, in der API-Referenz das vollständige Request-Format.
So fügt sich die Lösung in Puppeteer ein
Puppeteer steuert Chromium aus Node.js. Die Lösung ist ein einziger fetch zwischen page.goto und dem Klick auf Absenden, und page.evaluate setzt das Token dort ein, wo die Seite es erwartet.
- 01Mit Ihrem Proxy starten
Starten Sie Chromium mit --proxy-server und setzen Sie den User-Agent, den Sie der Lösung melden.
- 02Sitekey auslesen
page.$eval('[data-sitekey]', el => el.dataset.sitekey) und den Callback-Namen, falls vorhanden.
- 03Lösen
Die API per fetch mit ?wait=60 aufrufen; die Response enthält das Token und den verwendeten User-Agent.
- 04Injizieren und absenden
Mit page.evaluate das Token schreiben und den Callback auslösen, dann auf Absenden klicken.
So kommt das Token in die Seite
page.evaluate setzt das Response-Feld und ruft den Callback im Seitenkontext auf.
Woran Integrationen meistens scheitern
Chromium ignoriert Zugangsdaten in --proxy-server. Nutzen Sie page.authenticate für den Browser und übergeben Sie die vollständige Proxy-URL an die Lösung.
Das Widget liegt in einem iframe, das Response-Feld aber im Hauptframe. Injizieren Sie im Hauptframe.
Tokens sind nur einmal verwendbar. Schlägt das Absenden fehl, lösen Sie erneut, statt das erste Token wiederzuverwenden.
FAQ zu Captchas mit Puppeteer
Brauche ich puppeteer-extra oder ein Captcha-Plugin?
Nein. Ein einzelner fetch an die API und ein page.evaluate-Aufruf genügen, und Sie behalten die volle Kontrolle darüber, wann gelöst wird und was es kostet.
Funktioniert es im Headless-Modus?
Ja. Das Token wird von unserer Infrastruktur erzeugt, nicht von Ihrem Browser – für die Lösung selbst macht headless oder headed also keinen Unterschied. Websites begegnen Headless-Browsern aber mitunter mit mehr Misstrauen, ein realistischer User-Agent hilft daher trotzdem.
Kann ich es mit Playwright für Node nutzen?
Ja. Der Code ist nahezu identisch; page.evaluate und page.locator von Playwright ersetzen die Puppeteer-Entsprechungen.
Wie löse ich Cloudflare Turnstile in Puppeteer?
Lesen Sie den Sitekey aus dem Turnstile-Widget, senden Sie type turnstile mit der Seiten-URL, setzen Sie dann das Input-Feld cf-turnstile-response und rufen Sie den Callback auf, falls die Seite einen deklariert.
Hilfreiche Anleitungen
Bereit zum Loslegen?
Starten Sie mit einer kostenlosen 3-tägigen Testphase und zahlen Sie danach pro erfolgreicher Lösung, wenn Ihr Traffic wächst. Für die Testphase ist keine Karte nötig.