Comment fonctionne la détection de bots — et pourquoi Clearcote patche le moteur
L’approche habituelle consiste à patcher navigator.webdriver, à falsifier le vendor WebGL et à surcharger navigator.plugins depuis un script. Les détecteurs la repèrent quand même — et la raison en est structurelle : il ne s’agit pas d’une propriété de plus restée sans couverture.
Une falsification JavaScript se trahit d’elle-même
Une falsification JS, c’est une fonction installée là où devrait se trouver une fonction native. Un détecteur met de côté la valeur renvoyée et cherche à savoir si ce qui la renvoie est natif :
| L’indice | Pourquoi il démasque une falsification JS |
|---|---|
toString qui se trahit | Une méthode native se convertit en chaîne sous la forme function get vendor() { [native code] } ; une surcharge se convertit en son propre code source — un seul .toString() suffit à la démasquer. |
Descripteur / hasOwnProperty | getOwnPropertyDescriptor expose les propriétés redéfinies, et hasOwnProperty('toString') renvoie true sur une fonction modifiée, là où une fonction native renvoie false. |
TypeError sur un mauvais this | Les getters natifs lèvent une TypeError bien précise quand le receveur n’est pas le bon ; un shim naïf reste muet, et c’est ce silence qui constitue le signal. |
| Réacquisition depuis un autre realm | Un détecteur récupère un Function.prototype.toString intact dans une nouvelle iframe ou un nouveau Web Worker et l’applique à votre getter — depuis un autre realm que celui de votre patch dans le monde principal. Il renvoie votre code source. Démasqué. |
Clearcote n’a aucune couche de ce genre. Le getter de navigator.userAgent est le getter C++ : il affiche [native code] parce qu’il est du code natif, identique dans tous les realms — frame principale, iframe et worker. Il n’y a aucun détournement JavaScript à détecter.
Les trois couches de la détection de bots
Les systèmes anti-bot modernes lisent trois surfaces de nature structurellement différente, à trois endroits distincts. Il est rare qu’un seul outil corrige les trois :
| Couche | Les indices | Où se trouve la correction | Clearcote |
|---|---|---|---|
| A · driver / binaire | variables ChromeDriver cdc_, surface du protocole WebDriver | Piloter en CDP brut, sans chromedriver | ✅ un binaire Chromium standard — aucun artefact de driver |
| B · effets de bord CDP | fuites de Runtime.enable, init-scripts injectés, exécution dans le monde principal, viewport par défaut des outils d’automatisation | La couche de contrôle / client CDP | ✅ le moteur neutralise la fuite Runtime.enable, le SDK n’injecte aucun script par défaut, et, au lancement, les valeurs par défaut évitent le viewport typique des outils d’automatisation (l’endroit où votre client exécute ses propres scripts ne dépend que de lui) |
| C · surface d’empreinte | canvas, WebGL, audio, polices, navigator, TLS — dans la frame principale, les iframes et les workers | Le moteur (C++), parce que les surcharges JS se trahissent d’elles-mêmes | ✅ c’est ce que fait Clearcote |
Ce qui compte le plus : aucun raccord entre le faux et le vrai
Comme les contrôles se trouvent dans le moteur, le JavaScript que voit une page et le handshake réseau sous-jacent proviennent d’un seul et même vrai Chromium. Il n’y a aucun raccord entre un JS falsifié et un vrai TLS qu’une vérification croisée pourrait repérer — précisément le défaut qui trahit les outils à base d’injection. Une seule seed --fingerprint produit une machine unique et cohérente en interne, à travers canvas, WebGL, audio, polices et matériel. Le handshake TLS et HTTP/2 sous-jacent est celui du moteur lui-même, et il concorde parce que la persona annonce la version réelle du moteur — laissez brandVersion non défini pour qu’il en reste ainsi.
Et quand c’est le bruit lui-même qui trahit, désactivez-le — canvas et WebGL renvoient leurs valeurs naturelles tandis que la falsification d’identité reste active (l’audio rendu et les client rects ne sont de toute façon jamais perturbés, et les scalaires de fréquence/latence AudioContext continuent de suivre la persona ; voici pourquoi) :
await launch({ fingerprint: "u1", fingerprintNoise: false }); // identity on, per-site farbling offBruit désactivé, les identités d’une même machine partagent un seul hash canvas. canvasNoise: false ne désactive que le canvas 2D et conserve le bruit WebGL (build sous licence, 150 r12+).
Cohérence du réseau et de la locale
La persona n’est qu’une moitié du problème : le fuseau horaire, la langue et l’adresse WebRTC doivent aussi concorder avec la provenance du trafic. Derrière un proxy, lancez avec geoip — le SDK recherche l’IP de sortie du proxy, définit le fuseau horaire, la liste des langues, la géolocalisation et l’adresse WebRTC de cette région, et interrompt le lancement s’il ne parvient pas à la déterminer. Sans cette option, le fuseau horaire suit la langue (en-US signifie New York), quel que soit le pays du proxy. Consultez Playwright & Puppeteer pour les options.
C’est pourquoi Clearcote patche le moteur C++ au lieu d’injecter du JavaScript. Consultez Flags d’empreinte pour voir ce que vous contrôlez, et Architecture pour comprendre comment le moteur garde tous les signaux cohérents entre eux.
À lire aussi