invisible_playwright : un Firefox anti-détection patché à la source pour Playwright
Automatisation de dramaturge non détectée en Python. Firefox avec patch furtif, anti-détection d'empreinte digitale du navigateur dans le moteur, non injecté. Réussit la détection des robots.
En bref
- De quoi s’agit-il ?
- Le projet feder-cr/invisible_playwright remplace le lancement standard de Playwright par un Firefox patché au niveau C++, dont l'empreinte est gravée dans le moteur plutôt qu'injectée dans la page. Analyse des mécanismes, des options seed et pin, et des limites assumées par le README.
- À qui s’adresse-t-il ?
- invisible_playwright concerne les équipes qui font du scraping Python avec Playwright et se heurtent à reCAPTCHA, hCaptcha ou Cloudflare Turnstile. Il ne convient pas aux machines macOS, plus supportées, ni à ceux qui espèrent résoudre leurs problèmes de blocage sans toucher à leurs proxys.
- Puis-je l’utiliser commercialement ?
- Oui. MIT est une licence permissive : vous pouvez utiliser, modifier et vendre un logiciel qui en dépend, à condition de conserver les mentions de droit d’auteur et de licence.
- Est-il encore maintenu ?
- Oui. Le dépôt a reçu de nouveaux commits au cours des dernières 24 heures.
- En quel langage est-il écrit ?
- Principalement Python, d’après les statistiques de langage de GitHub.
Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 15 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.
ANALYSE OPEN SOURCE APPROFONDIE
Un Firefox corrigé dans le moteur, pas une surcouche JavaScript
La thèse du projet tient dans la distinction que pose le README entre deux familles d'outils anti-détection. Les extensions du type playwright-stealth injectent du JavaScript dans la page pour masquer les signes d'automatisation, et laissent des traces lisibles. invisible_playwright prend le chemin inverse : un Firefox patché au niveau du code C++, dont l'empreinte (navigator, screen, GPU/WebGL, canvas, polices, audio, WebRTC, fuseau horaire) est fixée à l'intérieur du moteur. Le README affirme qu'il n'existe ainsi aucune surcouche JS à détecter, et que les valeurs restent identiques en mode headless et en mode fenêtré.
Le détail du patch vit dans un dépôt séparé, feder-cr/firefox_antidetect_patch, que la documentation désigne comme la référence pour comprendre ce qui est modifié. Pour qui a déjà épuisé les solutions d'injection, c'est l'argument central : la question « ce navigateur est-il réel ? » reçoit une réponse construite avant même le chargement de la page.
Deux lignes pour passer de Playwright à InvisiblePlaywright
Côté code, la promesse est une compatibilité totale avec l'API Playwright, en synchrone comme en asynchrone. Le diff du README résume la migration : on remplace « from playwright.sync_api import sync_playwright » par « from invisible_playwright import InvisiblePlaywright », et « p.firefox.launch() » par un simple constructeur. L'objet retourné reste un playwright.sync_api.Browser standard, ce qui garantit que toutes les méthodes existantes continuent de fonctionner sans adaptation.
La seconde moitié du travail se passe dans le pilote : chaque clic, survol et glissement suit une trajectoire de souris en courbe de Bézier avec un rythme calibré, et le README décrit des entrées identiques octet par octet à une souris réelle, avec événements trusted. À chaque session correspond une empreinte distincte portant sur environ 200 champs (GPU, audio, polices, écran). Ce sont des déclarations du projet, pas un résultat mesuré de façon indépendante.
seed et pin : rejouer une session ou figer des champs précis
Le paramètre seed résout un problème classique du test : comment reproduire une exécution ? InvisiblePlaywright(seed=42) produit à chaque run le même GPU, le même hash de canvas et le même contexte audio. Le README recommande aussi d'imprimer sf.seed au lancement pour rejouer une session donnée. À l'inverse, sans seed, chaque session reçoit une empreinte différente tirée d'un échantillonnage bayésien.
Le paramètre pin complète ce système en permettant de forcer des champs précis pendant que le reste reste dérivé du seed : gpu.renderer peut être fixé à « ANGLE (NVIDIA, NVIDIA GeForce RTX 4090 Direct3D11) », screen.width à 2560, hardware.concurrency à 16. La documentation renvoie à docs/pinning.md pour la liste complète des clés et pour les interactions entre pin et échantillonnage bayésien, un point que le README principal n'explicite pas.
Proxy et fuseau horaire : le couple qui décide de tout
invisible_playwright accepte les schémas socks5, socks4, http et https, avec authentification, et le README précise que le DNS passe par le proxy par défaut, sans fuite locale. Le fuseau horaire suit une logique dérivée : sans paramètre, il est déduit de l'IP de sortie, celle du proxy s'il y en a un, sinon celle de la machine. Passer timezone=« America/New_York » force une zone IANA explicite, seule façon d'imposer un choix précis.
Là où le projet se distingue, c'est dans la franchise de sa section dédiée aux proxys : si vous voyez encore des captchas, le navigateur n'est plus la variable, c'est l'IP. Le README estime qu'environ 90 % des proxys du marché sont publics, donc déjà connus des listes de blocage (chiffre auto-déclaré, sans méthode de mesure). Un navigateur parfait sur une IP grillée perd quand même : le projet documente son propre maillon faible plutôt que de le taire.
Installation : 238 Mo à télécharger, macOS hors course
L'installation se fait en deux temps : pip install invisible-playwright, puis python -m invisible_playwright fetch, qui télécharge le moteur une fois pour toutes (environ 238 Mo, 544 Mo décompressés) avec vérification sha256. Les plateformes soutenues sont Windows x86_64 et Linux x86_64 ou arm64. macOS n'est plus supporté : les publications du moteur se sont arrêtées à firefox-20, et le paquet refuse de se lancer sur un Mac avec un message clair plutôt que de chercher un binaire inexistant.
Une CLI est installée sous le nom invisible-playwright, avec un tiret, et python -m invisible_playwright fait la même chose sans dépendre du PATH. La sous-commande fetch vérifie chaque moteur en cache contre son sceau et imprime le chemin, tandis que version affiche les versions de l'enveloppe, du cœur et du moteur. Ces commandes donnent un moyen direct de diagnostiquer un cache corrompu avant d'incriminer la détection.
Une documentation qui classe les niveaux de furtivité
Le projet pousse une documentation organisée en wiki : documentation, guides (sept groupes allant de l'identité du navigateur aux détecteurs eux-mêmes), comparaisons contre Camoufox, Patchright, nodriver et playwright-stealth, et intégrations nommées avec Scrapy, Crawlee, Robot Framework, CodeceptJS ou Playwright MCP. Trois pages servent de portes d'entrée : « Three ways to make Playwright undetected » pour situer les approches, « Playwright detected as a bot on one site » pour l'ordre de dépannage, et « navigator.webdriver is not the tell you think it is », qui explique pourquoi patcher cette seule propriété ne sert presque à rien.
Le projet est actif : la v0.7.4 est publiée le 27 août 2026, quelques jours seulement avant la consultation du dépôt, avec 1 943 étoiles et seulement 3 issues ouvertes. Le rythme des releases, trois en août 2026, montre une maintenance suivie, à confronter au jour de votre lecture.
Conclusion éditoriale
invisible_playwright concerne les équipes qui font du scraping Python avec Playwright et se heurtent à reCAPTCHA, hCaptcha ou Cloudflare Turnstile. Il ne convient pas aux machines macOS, plus supportées, ni à ceux qui espèrent résoudre leurs problèmes de blocage sans toucher à leurs proxys. Avant d'adopter, lancez pip install invisible-playwright, puis python -m invisible_playwright fetch, et vérifiez avec invisible-playwright version que le moteur téléchargé correspond bien à votre plateforme.
Notes de la communauté