Utiliser un solveur de CAPTCHA avec Puppeteer

Par solvethree4 min de lecture

Utilisez le SDK JavaScript officiel pour obtenir un jeton reCAPTCHA v3 Enterprise, puis transmettez solution.token à votre formulaire via Puppeteer. Le SDK résout la tâche ; il n’applique pas la solution à un navigateur et ne fournit pas d’extension de navigateur.

L’exemple ci-dessous cible un formulaire HTTPS que vous contrôlez, avec une zone de texte g-recaptcha-response et un bouton d’envoi. Ce sont les exigences du formulaire de démonstration, et non une interface universelle pour les pages protégées par reCAPTCHA.

Sur cette page

Préparer les dépendances et le formulaire que vous contrôlez

  1. 1.

    Installer Puppeteer et le SDK

    Utilisez Node.js 22 ou une version ultérieure. Avec npm, installez puppeteer et l’archive tar du SDK officiel disponible à l’adresse https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. Le SDK s’importe sous le nom @solvethree/sdk ; utilisez l’URL de téléchargement plutôt que de supposer qu’une version est publiée dans le registre npm. Enregistrez l’exemple en tant que module ES, par exemple dans un fichier se terminant par .mjs.

  2. 2.

    Configurer le profil du site

    Configurez le nom d’hôte que vous contrôlez dans la console solvethree et assurez-vous que son profil est actif pour votre espace de travail. L’envoi d’un nom d’hôte et d’une action ne crée pas ce profil. L’exemple utilise l’action login ; remplacez-la par l’action configurée pour votre application.

  3. 3.

    Définir les variables d’environnement

    Définissez TARGET_URL sur le formulaire HTTPS que vous contrôlez, SOLVETHREE_PROXY sur l’URL de votre proxy HTTP ou HTTPS et SOLVETHREE_API_KEY sur la clé de votre espace de travail. Conservez la clé dans le processus Node.js, et non dans le JavaScript de la page. L’exemple utilise un seul proxy pour la résolution et l’envoi depuis le navigateur.

Le champ site de la tâche est le nom d’hôte extrait de TARGET_URL, et non l’URL complète de la page. Pour reCAPTCHA, envoyez site, action et un seul des champs proxy ou proxyCandidates ; n’ajoutez pas de champ type ou url. Cet exemple utilise proxy afin que Puppeteer puisse utiliser directement ce même proxy.

Résoudre, puis ouvrir Puppeteer avec la même identité

Puppeteer + Node.js · résoudre un formulaire HTTPS dont vous êtes propriétaire
// Install puppeteer and the official solvethree SDK first.
import puppeteer from 'puppeteer';
import { Solvethree } from '@solvethree/sdk';

const target = new URL(process.env.TARGET_URL); // Your configured HTTPS page.
const proxy = new URL(process.env.SOLVETHREE_PROXY);
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const result = await client.solve({
  site: target.hostname, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
});
const browser = await puppeteer.launch({
  args: [`--proxy-server=${proxy.protocol}//${proxy.host}`],
});
try {
  const page = await browser.newPage();
  if (proxy.username) await page.authenticate({
    username: decodeURIComponent(proxy.username),
    password: decodeURIComponent(proxy.password),
  });
  await page.setUserAgent({ userAgent: result.solution.userAgent });
  await page.setExtraHTTPHeaders({ 'sec-ch-ua': result.solution.secChUa });
  await page.goto(target.href);
  // Adapt these selectors and any required callback to your own form.
  await page.waitForSelector('[name="g-recaptcha-response"]');
  await page.$eval('[name="g-recaptcha-response"]', (field, token) => {
    field.value = token;
    field.dispatchEvent(new Event('input', { bubbles: true }));
  }, result.solution.token);
  await Promise.all([
    page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
    page.click('button[type="submit"]'),
  ]);
  // Check your application's success response here.
} finally {
  await browser.close();
}

client.solve crée la tâche une seule fois et interroge son état jusqu’à ce qu’elle soit prête ou qu’une exception soit levée. Cet exemple ne lance Puppeteer qu’après le retour de cet appel. Le navigateur utilise le proxy de la tâche, s’authentifie si des identifiants de proxy sont présents et applique solution.userAgent et solution.secChUa avant la navigation.

Ne remplacez pas ce proxy ou cette identité de navigateur par des valeurs sans rapport lors de l’envoi du jeton. Si vous passez ensuite à proxyCandidates, utilisez la fonction utilitaire successfulProxy du SDK pour sélectionner, pour le navigateur, le proxy d’origine ayant réussi.

Si la résolution échoue, inspectez les champs errorCode et error de la tâche plutôt que de réessayer avec les mêmes données d’entrée. Les erreurs de requête HTTP sont distinctes des échecs définitifs des tâches. Le bloc finally ferme le navigateur local après les opérations effectuées dans celui-ci ; fermer des pages n’est pas un mécanisme d’annulation de tâche distante.

Adapter les hypothèses du formulaire de démonstration

  • [name="g-recaptcha-response"] sélectionne la zone de texte de démonstration. Remplacez-le si votre application reçoit le jeton via un autre champ ou paramètre de requête. La valeur à envoyer est solution.token, et non l’identifiant de la tâche.
  • button[type="submit"] sélectionne le bouton d’envoi de la démonstration. Utilisez le contrôle ou le mécanisme d’envoi réel de votre application.
  • L’exemple affecte le jeton et déclenche un événement input. Cela ne remplace pas une fonction de rappel propre à l’application. Ajoutez toute fonction de rappel, valeur CSRF, champs de connexion et configuration de session nécessaires avant l’envoi.
  • Remplacez le commentaire final de vérification de réussite par une assertion portant sur la réponse de votre application ou sur l’état obtenu. Une tâche de résolution prête ne prouve pas que l’application a accepté le jeton.

Si vous réutilisez un navigateur en cours d’exécution, choisissez son BrowserContext de manière réfléchie : une nouvelle page ne constitue pas automatiquement une session distincte. Regroupez les éléments nécessaires à la session du formulaire plutôt que de mélanger des pages issues de flux sans rapport.

Lancez votre première tâche.

Démarrez avec $5 de crédit dans votre espace de travail.

Créer un espace de travail
Utiliser un solveur de CAPTCHA avec Puppeteer · solvethree