Aller au contenu

Défis

Les navigateurs hébergés gèrent seuls les défis à curseur et à case à cocher. Le service de résolution de défis, désactivé sauf si vous l'activez, prend en charge ceux qu'ils ne savent pas traiter.

Défis à curseur

Certains sites répondent par un défi « glisser pour vérifier » : une poignée à faire glisser jusqu’au bout d’une barre, ou une pièce de puzzle à amener dans son emplacement. Un navigateur hébergé s’en charge pour vous, dans n’importe quel onglet et jusque dans les frames. C’est activé par défaut ; passez solveSliders: false si votre script s’en occupe lui-même.

  • Ce qu’il fait. Un curseur simple est glissé jusqu’au bout. Un puzzle est glissé jusqu’à ce que la pièce soit dans son emplacement : le navigateur trouve l’emplacement dans l’image, vérifie où la pièce est réellement arrivée, puis corrige. Le glissement est un mouvement de souris bouton enfoncé, à un rythme humain, pas un saut.
  • Quand il s’abstient. S’il ne trouve pas l’emplacement avec certitude, il laisse le puzzle tel quel plutôt que de deviner, car un mauvais glissement peut jouer contre la session. Il essaie au plus trois fois par page, et attend pendant que quelqu’un pilote la session depuis la vue en direct ou pendant un passage de relais.
  • Ce que vous voyez. Chaque tentative est un événement slider dans la chronologie des événements de la session, qui indique si le défi a disparu ensuite (passed) ou non (failed), ou pourquoi un puzzle a été laissé tel quel (skipped).
  • Seuls les défis sont touchés : un curseur en est un quand la page ou le widget qui l’entoure l’indique (un captcha ou une vérification). Les champs de plage, carrousels et filtres de prix ne sont pas touchés. Les actions de souris de votre script et un glissement en cours peuvent s’entremêler : mettez les clics en pause tant qu’un défi est affiché, ou désactivez l’option.

Défis à case à cocher

Certains sites demandent d’abord de cocher une case « vérifiez que vous êtes humain ». Un navigateur hébergé la coche pour vous, dans n’importe quel onglet et jusque dans les frames, y compris les widgets qui cachent la case aux scripts de la page. C’est une option distincte de celle des curseurs, elle aussi activée par défaut ; passez solveCheckboxes: false pour gérer ces cases vous-même.

  • Quelles cases. Seulement une case dont le libellé indique qu’il s’agit d’une vérification humaine (humain, robot, captcha, vérifiez que vous…). Une case « se souvenir de moi » ou « j’accepte les conditions » n’est jamais cochée, quoi que dise le reste de la page.
  • Le clic. Un mouvement du pointeur à un rythme humain jusqu’à la case, une courte pause, et un appui maintenu aussi longtemps que celui d’une personne. Si la case ouvre ensuite un curseur, il est traité comme un curseur.
  • Ce que vous voyez. Chaque tentative est un événement checkbox dans la chronologie des événements de la session : passed quand la case a disparu ou a été cochée, failed quand elle attendait encore. Au plus trois tentatives par page, et aucune pendant que quelqu’un pilote la session depuis la vue en direct ou pendant un passage de relais.

Service de résolution de défis

Pour les sites qui continuent d’afficher des défis après les actions gratuites de curseur et de case à cocher, un navigateur hébergé peut confier les défis les plus difficiles à un service de résolution. C’est désactivé sauf si vous le demandez : passez challengeService: true pour le laisser choisir lui-même, ou un objet pour choisir ce qu’il a le droit de faire. Il utilise votre propre clé de service de résolution, ou la nôtre (facturée par défi résolu).

Choisir les défis qu’il prend en charge

Vous ne lui indiquez jamais quel widget ni quel fournisseur un site utilise. Le navigateur hébergé reconnaît lui-même chaque défi de la page, d’après son balisage, ses frames et son comportement, et le range dans l’une de cinq catégories. Vous choisissez des catégories, pas des widgets.

CatégorieCe qui en relèveInclus dans auto
tokenUn widget qui remet un token à la page : une case « Je ne suis pas un robot » qui se transforme en puzzle d’images, un widget invisible dont le puzzle s’affiche, une vérification interactive « vérifiez que vous êtes humain » qui reste sans réponse.Oui
clearanceUne attente pleine page « vérification de votre navigateur » qui ne se lève pas d’elle-même.Oui
block-pageLa page de blocage d’un site, avec un puzzle ou une vérification de l’appareil.Oui
imageUn code en texte déformé à côté d’un champ de texte, et un puzzle dont le navigateur n’a pas pu trouver l’emplacement lui-même.Oui
scoreUne vérification de score invisible que la page exécute elle-même.Non : ajoutez-la vous-même
  • Sélection automatique. challengeService: true, ou un objet sans categories (ou avec categories: "auto") : chaque défi qu’il reconnaît parmi token, clearance, block-page et image est pris en charge, sur tous les sites. score est exclu, car le navigateur obtient déjà son propre token de score : y répondre depuis l’extérieur coûte une résolution à chaque appel, cela ne vaut donc la peine que pour un site qui rejette les scores de vos sessions.
  • Choisir des catégories. categories: ["token", "image"] ne prend en charge que celles-ci. Un défi d’une autre catégorie est tout de même signalé dans la chronologie (en tant que category_off), mais jamais payé.
  • Choisir des sites. sites: ["shop.example"] le limite à ces hôtes et à leurs sous-domaines ; ailleurs, rien n’est signalé ni demandé. Combinez-le avec categories pour « ce type de défi sur ce site ».
  • Vous ne savez pas ce qu’un site utilise ? Faites un premier passage avec mode: "report" : rien n’est demandé ni payé, et la chronologie liste chaque défi affiché par les pages sous la forme challenge.detected, avec sa category et s’il peut être résolu. Activez ensuite exactement ces catégories pour ce site.
javascript
// In the body of POST /api/v1/browsers, or in the SDK's launch options (cloud: true)

// Auto-select: every challenge it recognises (all categories but score), on every site
challengeService: true

// Only widgets that hand out a token, only on one site, at most EUR 0.20 per session
challengeService: { categories: ["token"], sites: ["shop.example"], maxSpendEur: 0.2 }

// Only full-page waits and block pages, with your own solving-service key
challengeService: { categories: ["clearance", "block-page"], key: "own" }

// Auto-select plus the score check, on one site
challengeService: { categories: ["token", "clearance", "block-page", "image", "score"], sites: ["shop.example"] }

// First find out what a site uses: report only, nothing asked or paid for
challengeService: { mode: "report" }

Tous les champs

ChampTypePar défautSignification
categories"auto" ou une liste de token, score, clearance, block-page, image"auto"Les types de défi qui peuvent recevoir une réponse. auto les inclut tous sauf score.
sitesliste de noms d’hôtetous les sitesSeulement sur ces hôtes et leurs sous-domaines (50 au plus).
key"own" ou "managed"votre clé enregistrée si vous en avez une, la nôtre sinonLa clé de service de résolution utilisée : la vôtre, ou la nôtre (facturée par défi résolu).
apiKeychaîneaucuneVotre clé de service de résolution pour cette session uniquement (stockée chiffrée, plus jamais affichée). Implique key: "own".
mode"solve" ou "report""solve"report se contente de reconnaître et de signaler ; rien n’est demandé ni payé, et aucune clé n’est nécessaire.
maxSolvesnombre entier, de 1 à 10010Demandes par session ; les demandes s’arrêtent une fois ce nombre atteint.
maxSpendEurnombre, de 0.01 à 1000.50Ce qu’une session peut dépenser en résolutions (avec notre clé, ce que vous payez) ; les demandes s’arrêtent là.

Fonctionnement

  • Le gratuit d’abord. Les actions de curseur et de case à cocher passent toujours en premier. Le service n’est sollicité que si un défi est toujours là après avoir eu sa chance : un puzzle d’images est apparu, un widget invisible a ouvert son puzzle, un widget est resté sans réponse pendant environ 15 à 25 secondes, une attente pleine page ne s’est pas levée en 20 secondes environ, ou la page est une page de blocage ou un code texte.
  • Comment la réponse est insérée. Comme la page l’attend : un token dans le champ de réponse du widget et son callback, un cookie pour le site puis un rechargement, un code saisi dans son champ, une pièce de puzzle glissée à sa place. Il vérifie ensuite que le défi a disparu, comme les actions gratuites.
  • La même IP. Les attentes pleine page et les pages de blocage doivent être résolues depuis l’IP qui utilise la réponse : le service les résout via l’IP de sortie de votre session, sur une connexion éphémère à usage unique. Un token rejeté par un site est redemandé une fois de la même manière.
  • Votre clé ou la nôtre. key: "own" utilise votre clé de service de résolution : enregistrez-la une fois dans le tableau de bord (Settings), ou passez apiKey avec la requête. Elle est stockée chiffrée, n’est plus jamais affichée et n’atteint jamais le navigateur ; vous payez le service directement. key: "managed" utilise la nôtre : chaque défi résolu est prélevé sur votre solde de navigateurs hébergés au prix du service lui-même × 1.5, les tentatives échouées sont gratuites. Omettez key pour utiliser votre clé enregistrée si vous en avez une, la nôtre sinon.
  • Limites. Au plus 2 demandes par défi et par page. Par session, maxSolves (10 par défaut, au plus 100) et maxSpendEur (€0.50 par défaut) : les demandes s’arrêtent dès que l’un des deux est atteint. Avec notre clé, un plafond mensuel par compte (à régler dans le tableau de bord, au plus €25). Une clé erronée ou un solde vide chez le service arrête les demandes pour cette session.
  • Ce que vous voyez. challenge.detected une fois par défi et par page, et challenge.service pour chaque demande (solved, failed ou skipped, avec la raison et le coût chez le service) dans la chronologie des événements ; challenges (quelle clé, combien de demandes, ce qu’ont coûté les résolutions avec notre clé) sur la session. Lors d’une exécution d’agent, l’agent attend pendant que le service traite une page.
  • Certains widgets sont repérés mais pas résolus : leur réponse ne peut pas être réinjectée dans une page de manière générique. Ils sont signalés avec solvable: false et ne sont jamais facturés. L’adresse de la page et les détails du défi sont transmis au service de résolution.

Ce qui se passe pour chaque type

Sur la pageCatégorieCe qui est demandé au serviceComment la réponse est insérée
Une case « Je ne suis pas un robot » dont le clic a ouvert un puzzle d’imagestokenUn token pour ce widgetDans le champ de réponse du widget, et le callback de la page est appelé avec ce token
Un widget invisible dont le puzzle d’images s’est affichétokenUn token pour ce widgetIdem
Une vérification interactive « vérifiez que vous êtes humain » qui reste sans réponsetokenUn token pour ce widgetIdem
Un code en texte déformé à côté d’un champ de texteimageLe texte de l’imageSaisi dans le champ, touche par touche, après un clic dedans
Un puzzle à curseur que le navigateur ne peut pas placer lui-même (par exemple avec un faux emplacement servant de leurre)imageOù se trouve l’emplacementLe navigateur y fait glisser la pièce, en vérifiant où elle a réellement atterri
Une attente pleine page « vérification de votre navigateur » qui ne se lève pasclearanceUn cookie de clearance, résolu via l’IP de sortie de votre sessionDéfini pour le site, puis la page est rechargée
Une page de blocage avec un puzzle ou une vérification de l’appareilblock-pageUn cookie, résolu via l’IP de sortie de votre sessionDéfini pour le site, puis la page est rechargée
Une vérification de score invisible que la page exécute elle-même (seulement si score figure dans la liste)scoreUn token de score pour l’action propre de la pageRemis à l’appel par lequel la page demande elle-même un token

Les actions gratuites passent toujours en premier : un curseur simple est glissé, un puzzle dont le navigateur peut trouver l’emplacement est mis en place, et une case qui se coche d’un clic est cliquée, le tout sans solliciter le service. Dans le widget, la case elle-même peut rester décochée après l’insertion d’un token : la page lit le champ de réponse et le callback, pas la case.

Depuis les SDK

Le SDK 0.38.0 ou plus récent accepte l’option lors d’un lancement dans le cloud (Python : challenge_service, qui accepte aussi max_solves, max_spend_eur et api_key). La chronologie indique ce qui s’est passé ; ses derniers événements arrivent quelques secondes après la fin de la session.

typescript
import { Cloud, launch } from "clearcote";

const browser = await launch({
  cloud: true,
  challengeService: { categories: ["token", "image"], sites: ["shop.example"], maxSpendEur: 0.2 },
});
const page = await browser.newPage();
await page.goto("https://shop.example/signup");
// ... your script: challenges the free actions cannot clear are answered for you
const id = browser.cloudSession.id;
await browser.close();

const { events } = await new Cloud().browsers.events(id);
for (const e of events) if (e.type.startsWith("challenge.")) console.log(e.type, e.data);
// challenge.detected { category: "token", solvable: true }
// challenge.service  { category: "token", outcome: "solved", applied: "callback", attempt: 1, ms: 12725, costUsd: 0.00013 }
python
from clearcote import Cloud, launch

browser = launch(cloud=True, challenge_service={"categories": ["token", "image"], "sites": ["shop.example"], "max_spend_eur": 0.2})
page = browser.new_page()
page.goto("https://shop.example/signup")
session_id = browser.cloud_session["id"]
browser.close()

for e in Cloud().browsers.events(session_id)["events"]:
    if e["type"].startswith("challenge."):
        print(e["type"], e["data"])