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. Une seule 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 (synchrone et asynchrone), Node et .NET, sur PyPI, npm et NuGet. Les trois ont la même bibliothèque : geoip, saisie humanisée, Widevine, profils enregistrés, vérifications de cohérence du rendu et les helpers de l’agent. Les outils en ligne de commande sont fournis avec 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, 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. Cela fonctionne sur tous les builds à partir de la 151, build ouvert gratuit compris ; les builds ouverts antérieurs à la 151 ne peuvent 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.

Le diff

38 921 lignes entre Chromium d'origine et Clearcote Pro.

C'est l'écart entre le build Pro et le Chromium livré par Google. Chaque valeur qu'un site peut lire est définie là où Chromium la calcule, si bien que la page, ses workers et ses iframes décrivent tous le même appareil.

  • Canvas
  • WebGL
  • WebGPU
  • Audio
  • Polices
  • Écran et fenêtre
  • WebRTC
  • TLS
  • Client hints
  • Timing des saisies
  • Voix et codecs
Lire les patchs du build ouvert sur GitHub

Build Pro, compté sur sa pile de patchs r57 (Chromium 156.0.8078.47). Le build ouvert gratuit est un ensemble de patchs plus restreint et public.

Chromium 156.0.8078.47 → Clearcote Pro r57

345 files changed, 35915 insertions(+), 3006 deletions(-)

240 patchs

Fichiers modifiés, par domaine

  • Moteur de rendu (Blink)118
  • Navigateur (chrome/)52
  • Couche content42
  • Composants39
  • Pile réseau22
  • Interface et fenêtres14
  • TLS (BoringSSL)11
  • V8 et URL17
  • Tout le reste30

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 synchrone et asynchrone), Node.js et .NET. Depuis le SDK 0.58.0, les trois ont la même bibliothèque : correspondance geoip, saisie humanisée (une option de lancement, avec aussi des appels explicites de type HumanClickAsync en .NET), profils enregistrés, vérifications de cohérence du rendu, Widevine et l’agent IA intégré au navigateur. Les outils en ligne de commande clearcote sont fournis avec les paquets Python et Node.

Comment garder la même identité d'une exécution à l'autre ?

Réutilisez la 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 la seed de l'identifiant de votre propre compte ou tenant la 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 : GitHub, une vérification de carte ou un compte Google d'entreprise. Jamais débité.