Un navigateur furtif pour Playwright et Puppeteer
Clearcote est un Chromium : l'automatisation que vous avez déjà continue de fonctionner. Remplacez l'appel de lancement par le launch() du SDK et vous récupérez un handle Playwright qui se pilote comme un Browser (sur un profil jetable, donc newContext() renvoie ce même contexte), et qui exécute un build dont les contrôles d'identité sont compilés dans le moteur au lieu d'être injectés en JavaScript.
Le build ouvert ne demande aucun compte. Le dernier build est gratuit avec GitHub pour un navigateur à la fois.
Changez la ligne de lancement, gardez tout le reste
# pip install clearcote
from clearcote import launch
browser = launch(fingerprint="account-42", light_stealth=True)
page = browser.new_page()
page.goto("https://example.com")
browser.close()Points clés
Une migration en une ligne
launch() renvoie un handle Playwright sur un profil jetable : sélecteurs et page objects restent tels quels. Son newContext() renvoie ce même contexte ; passez donc ephemeralProfile: false là où vous avez besoin de contextes isolés. Puppeteer se connecte à l'endpoint CDP de serve() avec puppeteer.connect.
Un binaire vérifié, récupéré pour vous
À la première utilisation, le SDK télécharge le build correspondant et vérifie son SHA-256 : le build ouvert d'après des hashes intégrés au SDK, le build sous licence d'après le hash renvoyé par son téléchargement. La mise à jour automatique optionnelle (build ouvert uniquement) vérifie la dernière version d'après ses checksums publiés, ainsi que leur signature GPG quand gpg est installé.
L'identité en options nommées
fingerprint, platform, brand, timezone, acceptLanguage, proxy et geoip sont des arguments, pas des switches à retenir. Un seul seed garde une identité stable d'une exécution à l'autre.
Des valeurs par défaut cohérentes
Les lancements en mode headed se passent du viewport émulé pour que la taille de la page corresponde à la vraie fenêtre, WebRTC garde privée l'adresse de votre machine, et QUIC est désactivé derrière un proxy pour qu'aucun trafic UDP ne lui échappe.
Entrées humanisées, en un flag
humanize: true envoie les clics, la frappe, les glisser-déposer et les défilements sous forme d'entrées natives trusted sur des trajectoires courbes, avec navigator.webdriver laissé à false.
Trois langages
Python (sync et async), Node et .NET, sur PyPI, npm et NuGet. .NET dispose aussi de geoip, et des entrées humanisées sous forme d'appels explicites de type HumanClickAsync ; les profils enregistrés, les vérifications de cohérence du rendu, Widevine et les helpers d'agent sont pour l'instant réservés à Python et Node.
Ce que le SDK fait pour vous
Le package encapsule le binaire Clearcote pour que les options d'identité deviennent des arguments nommés. Il résout le navigateur dans un ordre fixe (un chemin explicite, la variable d'environnement CLEARCOTE_BINARY, une version que vous avez demandée, le dernier build sous licence s'il trouve une clé de licence, puis le build ouvert épinglé dans le SDK), le vérifie et le met en cache, le lance via Playwright, puis vous renvoie les objets que votre code utilise déjà.
Comme les contrôles se trouvent dans le moteur C++, il n'y a aucun plugin stealth à charger et rien n'est injecté dans la page. Un plugin patche des propriétés depuis JavaScript, et un getter patché se distingue d'un getter natif. Ici, le getter est le getter natif, dans le frame principal, dans les iframes et dans les workers. Comment fonctionne la détection explique pourquoi c'est important.
Deux comportements diffèrent de Chromium standard, tous deux volontairement. Les événements de console et d'erreur de page ne sont pas transmis au client d'automatisation, car c'est précisément cette transmission que mesure une sonde d'automatisation : collectez-les dans la page et relisez-les avec page.evaluate(). Par ailleurs, sur le build sous licence (gratuit avec GitHub), un proxy SOCKS5 avec nom d'utilisateur et mot de passe fonctionne directement, les identifiants étant passés dans des champs username et password séparés, car le moteur implémente l'authentification qui manque à Chromium standard. Le build ouvert ne peut pas s'authentifier auprès d'un proxy SOCKS5.
Un plugin stealth face à un navigateur modifié au niveau du moteur
Les plugins stealth open source sont une première étape raisonnable, et beaucoup de projets commencent par là. Consultez la comparaison avec puppeteer-extra-plugin-stealth pour une vue plus complète.
Cas d'usage
Scraping et collecte de données
Gardez votre crawler Playwright ou Puppeteer existant et changez ce qui tourne en dessous.
Tests end-to-end sur de vraies pages
Testez des parcours sur des sites qui traitent un Chromium automatisé standard différemment d'un navigateur normal.
Migrer une suite existante
Les sélecteurs et les page objects ne bougent pas, seul l'appel de lancement change. Les fixtures qui ouvrent un contexte neuf par test ont besoin de ephemeralProfile: false, car le newContext() de launch() renvoie son unique contexte de profil.
Recherche sur le fingerprinting
Exécutez les mêmes scripts avec et sans persona et comparez ce que mesure une page.
Clearcote est conçu pour la confidentialité, les tests, la recherche et l'automatisation licite. Vous êtes responsable de l'usage que vous en faites et du respect des conditions d'utilisation des sites que vous visitez.
Offres qui l'incluent
Le SDK est inclus dans les trois formules, tout comme la quasi-totalité des options d'identité (les quelques-unes qui exigent le build sous licence sont signalées dans la liste des flags d'empreinte). Sans clé, il exécute le build ouvert. Avec une clé de licence (gratuite avec un compte GitHub), il exécute le dernier build, avec les extras réservés au build sous licence présentés sur la page Tarifs.
Comparer les offresFAQ
Est-ce vraiment un remplacement transparent ?
À peu de chose près. En Python sync et en Node, launch() renvoie un handle de type navigateur sur un profil jetable : newPage() et tout ce qui suit fonctionnent comme avant, mais newContext() renvoie ce même contexte ; le code qui a besoin de contextes isolés doit donc passer ephemeralProfile: false ou lancer un navigateur par contexte. launchPersistentContext() renvoie un BrowserContext standard. Puppeteer se connecte à l'endpoint CDP de serve() avec puppeteer.connect, et le SDK .NET renvoie des objets Microsoft.Playwright standard (IBrowserContext depuis LaunchEphemeralProfileAsync, IBrowser depuis LaunchAsync).
Ai-je encore besoin de puppeteer-extra-plugin-stealth ou de playwright-stealth ?
Non, et mieux vaut ne pas en ajouter. Ces plugins patchent des valeurs depuis du JavaScript injecté, et ce patch peut lui-même être repéré. Clearcote définit les valeurs dans le moteur : il ne reste rien à patcher pour un plugin.
Fonctionne-t-il en headless ?
Oui. Le mode headed reste le choix par défaut le plus sûr là où vous pouvez l'utiliser, car le mode headless a ses propres signes révélateurs. Dans les conteneurs, l'image Docker officielle tourne par défaut en mode headed sous un affichage virtuel.
Quels langages sont pris en charge ?
Python (API sync et async), Node.js et .NET. Les trois disposent de l'alignement geoip et des entrées humanisées (un flag de lancement en Python et Node, des appels explicites de type HumanClickAsync en .NET). Les profils enregistrés, les vérifications de cohérence du rendu, Widevine et l'agent intégré au navigateur sont pour l'instant réservés à Python et Node.
Comment garder la même identité d'une exécution à l'autre ?
Réutilisez le même seed fingerprint et utilisez launchPersistentContext avec un répertoire de données utilisateur pour que les cookies et le stockage persistent. Dériver le seed de l'identifiant de votre propre compte ou tenant le rend reproductible. Voir identités persistantes.
Aller plus loin dans la documentation
Fonctionnalités associées
Une seule option donne aux clics, à la frappe, aux glisser-déposer et aux défilements de Playwright des trajectoires courbes et un timing humain, toujours sous forme d'entrées natives trusted.
Canvas, WebGL, WebGPU, audio, polices, écran et matériel dérivés d'un seul seed dans le moteur C++, avec la locale et le fuseau horaire assortis : chaque surface concorde avec toutes les autres.
Définissez un proxy avec geoip activé : le fuseau horaire, les langues et WebRTC suivent l'IP de sortie. SOCKS5 avec nom d'utilisateur et mot de passe fonctionne directement sur le build sous licence.
Exécutez Clearcote comme endpoint CDP permanent depuis l'image Docker officielle, serve() ou une CLI, et connectez n'importe quel framework sans toucher au code.
À lire aussi
Essayer Clearcote
S'utilise tel quel avec Playwright et Puppeteer, cohérent jusqu'au handshake TLS, avec un build open source comme point de départ.
Gratuit pour un navigateur avec GitHub. Sans carte.