Aller au contenu
SDK · Python · Node · .NET

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

Plugin stealth JavaScript
Clearcote
Où se situe la modification
Un script injecté dans chaque page et chaque frame
Compilée dans le moteur Chromium
Vérifications de fonctions natives
Un getter patché, converti en chaîne, révèle son propre source
Le getter est du code natif : il renvoie [native code]
Workers et iframes
Chaque realm doit être repatché, et les trous se voient
Les mêmes valeurs partout, issues d'un seul moteur
TLS et HTTP/2
Ce qu'envoie le navigateur sous-jacent, quel qu'il soit
Le handshake Chrome propre au moteur, conforme à la version déclarée par le persona
Mise en place
Un plugin, ses « evasions » et leurs options
Un seul appel à launch()

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 offres

FAQ

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

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.