Scarnox · Blog

Résoudre un PopularCaptcha invisible : ce qui le distingue et quoi envoyer

Un PopularCaptcha invisible ressemble à l'absence de captcha. Il n'y a pas de case « Je ne suis pas un robot ». Le site appelle PopularCaptcha depuis son propre JavaScript, généralement au moment où le visiteur appuie sur envoyer, et n'affiche un défi que s'il doute du visiteur. Pour un script d'automatisation, le widget est plus difficile à repérer, mais la résolution reste une seule requête.

Scarnox résout PopularCaptcha aujourd'hui, y compris la variante invisible. Vous activez un seul flag, is_invisible, et vous envoyez la même requête que pour un widget visible. Les autres types de captcha arrivent bientôt.

Comment savoir qu'il est invisible

C'est la configuration de la sitekey qui le détermine, pas l'apparence de la page. Si vous avez un doute, trouvez la sitekey et vérifiez les options du widget dans le JavaScript de la page.

Quoi envoyer

Utilisez le même point d'accès et le même type de tâche, et ajoutez is_invisible à true :

{
  "captcha_type": "PopularCaptchaTaskProxyless",
  "site_key": "10000000-ffff-ffff-ffff-000000000001",
  "site_url": "https://example.com/login",
  "is_invisible": true
}

Envoyez-la avec votre clé dans l'en-tête Authorization: Bearer, comme dans tous les autres exemples. L'appel bloque jusqu'à ce que le jeton soit prêt, sans interrogation répétée. Utilisez un délai d'environ 185 secondes.

Renvoyer le jeton

Les intégrations invisibles utilisent presque toujours un callback plutôt qu'un champ de formulaire. Le site transmet un nom de fonction au widget, soit dans l'attribut data-callback, soit dans les options passées à render(). Appelez cette fonction avec le jeton, et le code du site continue comme si le visiteur avait réussi la vérification :

await page.evaluate((t) => {
  document.querySelectorAll('[name="h-captcha-response"]').forEach((el) => { el.value = t; });
  const cb = document.querySelector("[data-sitekey]")?.dataset.callback;
  if (cb && typeof window[cb] === "function") window[cb](t);
}, token);

Remplir aussi le champ caché est sans risque, et cela couvre les sites qui lisent ce champ à l'envoi.

Le timing compte davantage que d'habitude

Avec un widget invisible, c'est le site qui décide quand le défi s'exécute, et c'est généralement au moment où le visiteur envoie le formulaire. Résolvez donc à ce moment précis, et non plus tôt. Le schéma le plus simple consiste à déclencher la résolution juste avant d'appuyer sur le bouton dans votre script, puis à appeler le callback et à envoyer le formulaire.

Les jetons expirent au bout d'environ deux minutes. Un jeton obtenu au chargement de la page et utilisé une minute plus tard risque d'être rejeté.

Erreur fréquente

Envoyer une sitekey invisible comme une tâche visible classique peut produire un jeton que le site refuse. Si l'API renvoie un jeton mais que le site le rejette, vérifiez ces points dans l'ordre :

  1. Le paramètre is_invisible est-il à true ?
  2. Le site appelle-t-il le callback, et le fait-il avant l'envoi du formulaire ?
  3. L'URL site_url est-elle celle de la page où s'exécute le widget invisible ?
  4. Si le site refuse toujours le jeton, le problème peut être lié à l'adresse IP qui a résolu le captcha. Comparez avec résolution avec ou sans proxy.

Tester un flux invisible en toute sécurité

Les widgets invisibles sont difficiles à tester à la main, car le défi ne s'exécute qu'à l'envoi et, la plupart du temps, il passe sans rien afficher. Testez dans cet ordre :

  1. Confirmez que la résolution renvoie un jeton avec is_invisible à true, à l'aide du test rapide du guide d'essai gratuit.
  2. Déclenchez vous-même le callback du site dans la console du navigateur avec ce jeton, et observez si le formulaire continue.
  3. Envoyez le formulaire depuis votre script, et vérifiez la page qui suit.
  4. Relancez le test depuis un second réseau, si possible, pour confirmer que le jeton n'est pas lié à l'adresse IP qui a résolu le captcha.

Gardez ce test sur un formulaire qui vous appartient, ou sur une copie de préproduction du site que vous êtes autorisé à tester. Ne lancez jamais un flux invisible sur un compte réel que vous ne contrôlez pas.

L'ordre des événements lors d'un envoi invisible

Une intégration qui fonctionne suit cette séquence :

  1. Le visiteur, ou votre script, remplit le formulaire.
  2. Votre script lit la sitekey et l'URL de la page dans la page.
  3. Votre script appelle le point d'accès de résolution avec is_invisible à true et attend le jeton.
  4. Votre script écrit le jeton dans le champ de réponse et appelle le callback du site.
  5. Le code du site envoie le formulaire avec le jeton attaché.

Si l'étape 3 se produit bien plus tôt que l'étape 5, le jeton peut expirer avant l'envoi du formulaire. Réduisez autant que possible l'écart entre les deux.

Quand le site rejette un jeton invisible

Un rejet ne vient pas toujours du jeton. Vérifiez ces points avant de modifier la requête de résolution :

Ce n'est qu'après ces vérifications qu'il faut examiner la question du proxy. La plupart des rejets viennent du callback ou de la session, pas de l'adresse IP.

Prochaines étapes

Commencez avec un crédit d'essai gratuit, sans carte bancaire : créez un compte et testez une sitekey invisible sur une page qui vous appartient.