CaptchaNo
[ INTÉGRATION ]

Solveur de captcha pour
Puppeteer

Résolvez le défi pendant l'exécution au lieu de faire échouer la tâche. Un exemple Node.js fonctionnel, et les trois points qui décident si votre token est accepté.

Puppeteer · Node.js
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"]');

Ce qui décide si le token est accepté

  1. Transmettez votre proxy. Le token doit être généré derrière la même IP de sortie que celle qui le soumet. Pour les systèmes qui notent la session, c'est obligatoire, pas une simple optimisation.
  2. Utilisez le même user agent. Turnstile et plusieurs systèmes anti-bot lient le token à un user agent. Nous renvoyons celui utilisé pour que vous puissiez le reproduire exactement.
  3. Demandez-le au dernier moment. Les tokens expirent au bout d'environ 120 secondes. Demandez-en un quand vous êtes prêt à soumettre.

Appel bloquant ou polling

L'exemple utilise ?wait=60 : l'appel renvoie la résolution terminée et votre étape Puppeteer reste linéaire. Si vous préférez ne pas garder une connexion ouverte, retirez le paramètre, conservez l'id renvoyé et interrogez GET /v1/task/{id} toutes les cinq secondes. Un token que vous avez payé reste récupérable pendant dix minutes : une connexion interrompue ne vous fait donc pas perdre la résolution.

Coût

$0.00598 par résolution réussie de reCAPTCHA v2, les résolutions échouées n'étant jamais facturées. Consultez les tarifs pour chaque type de défi, ou la référence de l'API pour le format complet des requêtes.

[ INTÉGRATION DANS LE FLUX ]

Comment la résolution s'intègre à Puppeteer

Puppeteer pilote Chromium depuis Node.js. La résolution tient en un seul fetch entre page.goto et le clic d'envoi, et page.evaluate place le token là où la page l'attend.

  1. 01
    Lancer avec votre proxy

    Démarrez Chromium avec --proxy-server et définissez le user agent que vous indiquerez à la résolution.

  2. 02
    Lire la sitekey

    page.$eval('[data-sitekey]', el => el.dataset.sitekey), ainsi que le nom du callback s'il est présent.

  3. 03
    Résoudre

    Appelez l'API avec fetch et ?wait=60 ; la réponse contient le token et le user agent utilisé.

  4. 04
    Injecter et envoyer

    Utilisez page.evaluate pour écrire le token et déclencher le callback, puis cliquez sur le bouton d'envoi.

Injecter le token dans la page

page.evaluate renseigne le champ de réponse et appelle le callback dans le contexte de la page.

[ PIÈGES ]

Là où les intégrations échouent le plus souvent

Authentification du proxy

Chromium ignore les identifiants passés dans --proxy-server. Utilisez page.authenticate pour le navigateur et transmettez l'URL complète du proxy à la résolution.

Widgets en iframe

Le widget se trouve dans une iframe, mais le champ de réponse est dans le frame principal. Injectez dans le frame principal.

Token périmé lors d'une nouvelle tentative

Les tokens sont à usage unique. Si l'envoi échoue, relancez une résolution au lieu de réutiliser le premier token.

[ FAQ ]

FAQ captcha Puppeteer

Ai-je besoin de puppeteer-extra ou d'un plugin captcha ?

Non. Un seul fetch vers l'API et un appel à page.evaluate suffisent, et vous gardez le contrôle total sur le moment de la résolution et sur son coût.

Cela fonctionne-t-il en mode headless ?

Oui. Le token est produit par notre infrastructure, pas par votre navigateur : le mode headless ou avec interface ne change rien à la résolution elle-même. Les sites peuvent toutefois se méfier davantage des navigateurs headless, donc transmettre un user agent réaliste reste utile.

Puis-je l'utiliser avec Playwright pour Node ?

Oui. Le code est presque identique ; page.evaluate et page.locator de Playwright remplacent leurs équivalents Puppeteer.

Comment résoudre Cloudflare Turnstile dans Puppeteer ?

Lisez la sitekey dans le widget Turnstile, envoyez le type turnstile avec l'URL de la page, puis renseignez l'input cf-turnstile-response et appelez le callback si la page en déclare un.

[ À LIRE ENSUITE ]

Guides utiles

Prêt à développer ?

Commencez par un essai gratuit de 3 jours, puis payez par résolution réussie à mesure que votre trafic augmente. Aucune carte requise pour l'essai.

Voir nos offres
Vous êtes un agent IA ? Voir les options de configuration →