
invisible_playwright v0.7.0
Navigateur antidetect gratuit et furtif pour Playwright : empreinte Firefox headless non détectée. Scraping Python, contournement de recaptcha et de détection de bots. Open source.
Furtivité antidetect gratuite pour navigateur Playwright : empreinte Firefox non détectée, avec ou sans tête.
Scraping web Python et contournement de captcha. Open source, et réussit tous les tests de détection de bots.

Comment ça fonctionne
Les anti-bots posent deux questions, et reCAPTCHA, hCaptcha et Cloudflare Turnstile notent les réponses. invisible_playwright répond oui aux deux.
1. Est-ce un vrai navigateur ? Oui. C'est Firefox, patché au niveau du code source C++.
- L'empreinte du navigateur est définie dans le moteur, pas injectée dans la page : navigator, écran, GPU/WebGL, canvas, polices, audio, WebRTC, fuseau horaire, réseau. Avec ou sans tête, les mêmes valeurs dans les deux cas.
- Aucun shim JS, aucune surcharge, aucune couture à lire.
2. Une vraie personne l'utilise-t-elle ? Oui. Les actions sont humanisées dans le pilote.
- Chaque clic, survol et glisser suit un tracé de souris naturel avec un timing humain, pas de curseur téléporté.
- Chaque saisie est octet pour octet identique à une vraie souris : source d'entrée réelle, pression, événements de confiance.
Piloté par l'API Playwright standard. Analyse complète : feder-cr/firefox_antidetect_patch.
Vous voyez encore des captchas ou des anti-bots ? C'est le proxy.
Une fois le navigateur géré, il cesse d'être la variable. Si vous êtes toujours bloqué, l'indice n'est plus le navigateur, c'est l'IP d'où vous venez. Environ 90 % des proxys sont publics : n'importe qui peut louer la même adresse, elle est donc déjà connue et figure sur les listes d'IP bloquées que les sites consultent. Un navigateur parfait sur une IP connue perd quand même.
Installation
pip install invisible-playwright
python -m invisible_playwright fetch # téléchargement unique ~238 Mo (~544 Mo décompressé), vérifié par sha256
Plateformes prises en charge : Windows x86_64, Linux x86_64 / arm64. macOS n'est plus pris en charge (les versions se sont arrêtées à firefox-20) ; sur un Mac, le paquet refuse au lancement avec un message clair plutôt que de télécharger un binaire qui n'existe plus.
Utilisation
Empreinte aléatoire par session
100 % compatible Playwright - synchrone et asynchrone, toutes les méthodes, zéro changement d'API. Si vous utilisez déjà Playwright, le passage se fait en deux lignes :
- from playwright.sync_api import sync_playwright
- with sync_playwright() as p:
- browser = p.firefox.launch()
+ from invisible_playwright import InvisiblePlaywright
+ with InvisiblePlaywright() as browser:
Chaque session obtient une empreinte distincte (GPU, audio, polices, écran, ~200 champs) et un mouvement de souris en courbe de Bézier.
Synchrone
from invisible_playwright import InvisiblePlaywright
with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
page = browser.new_page()
page.goto("https://example.com")
page.click("#submit") # la souris trace un arc vers le bouton sur une courbe de Bézier
Asynchrone
from invisible_playwright.async_api import InvisiblePlaywright
async with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
page = await browser.new_page()
await page.goto("https://example.com")
await page.click("#submit")
L'objet browser est un playwright.sync_api.Browser / playwright.async_api.Browser - chaque méthode Playwright fonctionne telle quelle.
Journalisez la graine pour rejouer une exécution :
sf = InvisiblePlaywright()
with sf as browser:
print("seed =", sf.seed)
# ...
Empreinte reproductible
with InvisiblePlaywright(seed=42) as browser:
... # même GPU, même hash canvas, même contexte audio, à chaque exécution
Proxys
proxy = {
"server": "socks5://gate.example.com:1080",
"username": "user",
"password": "pass",
}
with InvisiblePlaywright(proxy=proxy) as browser:
...
Schémas pris en charge : socks5, socks4, http, https. Le DNS est routé via le proxy par défaut, aucune fuite locale.
Fuseau horaire
Le fuseau horaire du navigateur suit timezone= :
# par défaut : le fuseau horaire est dérivé automatiquement de l'IP de sortie (sortie du proxy si un
# proxy est défini, sinon l'IP publique propre de l'hôte)
with InvisiblePlaywright(proxy=proxy) as browser:
...
# une zone IANA explicite l'emporte toujours, la seule façon de forcer une zone spécifique
with InvisiblePlaywright(proxy=proxy, timezone="America/New_York") as browser:
...
Épinglage de champs d'empreinte spécifiques
Par défaut, tout vient de seed. Pour forcer des valeurs spécifiques tandis que le reste reste dérivé de la graine :
with InvisiblePlaywright(
seed=42,
pin={
"gpu.renderer": "ANGLE (NVIDIA, NVIDIA GeForce RTX 4090 Direct3D11)",
"gpu.vendor": "Google Inc. (NVIDIA)",
"screen.width": 2560,
"screen.height": 1440,
"hardware.concurrency": 16,
},
) as browser:
...
La liste complète des clés épinglables, comment l'épinglage interagit avec l'échantillonneur bayésien, et les schémas courants se trouvent dans docs/pinning.md.
CLI
La commande installée est invisible-playwright, avec un trait d'union. python -m invisible_playwright fonctionne de manière identique et ne nécessite rien dans le PATH.
invisible-playwright fetch # télécharge le moteur s'il manque, vérifie chaque moteur en cache
# contre le sceau, affiche le chemin
invisible-playwright version # versions du wrapper, du cœur et du moteur, et où le
# moteur est mis en cache
Documentation, guides et comparaisons
Tout se lit mieux, et est consultable, dans le wiki, organisé en quatre sections plutôt qu'une seule liste plate :
- Documentation - installation, le passage en deux lignes depuis Playwright standard, la configuration proxy/fuseau horaire, l'épinglage de champs spécifiques, la CLI.
- Guides - comment la détection fonctionne réellement, en sept groupes : identité du navigateur, canvas/WebGL/polices/ audio, réseau et WebRTC, la couche d'automatisation, les agents IA, les détecteurs eux-mêmes expliqués depuis la source, et les tests.
- Comparaisons - contre Camoufox, Patchright, nodriver et playwright-stealth, et l'argument en faveur de Firefox plutôt que Chromium en général.
- Intégrations - Scrapy, Crawlee, Robot Framework, CodeceptJS, exécuteurs de tests, Playwright MCP, et les frameworks auxquels il ne convient pas, par nom.
Si vous ne savez pas par où commencer : Trois façons de rendre Playwright non détecté est la carte vers laquelle la plupart des autres pages renvoient, Playwright détecté comme bot sur un site est l'ordre de dépannage, et navigator.webdriver n'est pas l'indice que vous croyez explique la propriété la plus célèbre de ce domaine et pourquoi la patcher seule ne vous apporte quasiment rien.
- furtivité crawl4ai et moteurs de navigateur personnalisés - browser_type accepte firefox mais il n'y a pas d'executable_path ; où se trouve la couture de l'adaptateur
- Pourquoi les navigateurs sans tête rendent des polices différentes - les trois causes, les ensembles de polices par plateforme, et pourquoi la solution n'est pas d'installer plus de polices
- Comment faire rapporter à Linux et macOS de vraies polices Windows - un manifeste, trois backends de polices convaincus de ne pas demander à l'hôte, et les quatre coutures encore ouvertes
- measureText et TextMetrics comme surface d'empreinte - plus de dix nombres issus d'un seul appel ne nécessitant aucune invite de permission, et les deux erreurs que nous avons commises en le corrigeant
- Ce que fait réellement privacy.resistFingerprinting - et pourquoi ce projet le définit à false délibérément
- La variable cdc_ de ChromeDriver - pourquoi la renommer n'est pas la supprimer, et ce que cela généralise
- Ce que bot.sannysoft.com vérifie réellement - ligne par ligne, et le test canvas-dans-iframe que personne ne lit
- Comment CreepJS décide que vous mentez - quatre techniques de détection, et pourquoi bloquer la sonde est lui-même enregistré
- Les préférences Firefox qui ne font silencieusement rien - cinq raisons, en commençant par celle qui nous a coûté un vrai bug
- Ce que BotD détecte réellement - vingt détecteurs, et pourquoi la plupart ne concernent pas les bots du tout
- Pourquoi un ID visiteur FingerprintJS change - c'est un hash de 41 composants, donc un qui bouge fait bouger tout l'ensemble
Projets connexes
Les voisins open source, et à quoi sert chacun.
Côté Firefox
- Camoufox - un Firefox anti-détection qui patche aussi au niveau C++. Il couvre une surface plus large et fournit sa propre base de données d'empreintes ; ce projet dérive une empreinte d'une graine avec un échantillonneur bayésien, donc un nombre reproduit une machine. Comparaison complète.
- LibreWolf - un fork de Firefox avec des paramètres de confidentialité par défaut. Il fournit un binaire configuré pour que les gens naviguent ; celui-ci fournit des patches source plus un wrapper d'automatisation.
- arkenfox/user.js - durcissement de Firefox via les préférences. Là où une préférence suffit, utilisez-la ; ce projet patche le C++ là où une ne suffit pas.
Côté Chromium
- Patchright - un fork Playwright patché, donc le travail de furtivité atterrit dans le pilote plutôt que dans le binaire du navigateur. Comparaison complète.
- nodriver - le successeur de
undetected-chromedriver, pilotant Chrome via CDP directement et supprimant les indices de type WebDriver. Comparaison complète. - playwright-stealth - un patch de script d'initialisation appliqué avant le chargement de la page. Son propre mainteneur l'appelle une preuve de concept ; comparaison complète.
- puppeteer-extra-plugin-stealth - l'original de cette lignée de scripts d'initialisation, encore largement recommandé. Le dernier commit substantiel de son dépôt date de mi-2024 ; ce que cela signifie en pratique.
- selenium-stealth - la même approche sur Selenium/CDP. Le dernier commit de son dépôt date de décembre 2021 ; ce que cela signifie en pratique.
- pyppeteer - le port Python non officiel de Puppeteer. Son propre README dit qu'il n'est plus maintenu et renvoie vers
playwright-pythonà la place ; ce que cette recommandation signifie réellement. - rebrowser-patches - corrige la fuite CDP
Runtime.enablesur Chromium, convergeant indépendamment vers presque le même correctif que Patchright. Comparaison complète. - fingerprint-suite - génère une empreinte cohérente avec un réseau bayésien, proche de l'approche de génération de ce projet, puis l'injecte dans une page Playwright ou Puppeteer sur Chromium ou Firefox. Comparaison complète.
- playwright-with-fingerprints - injecte des valeurs d'empreintes provenant d'un service payant distant, Windows uniquement, épinglé à une version Chromium spécifique. Comparaison complète.
Lequel de ces outils convient dépend de la couche à laquelle se situe votre problème, et de si vous avez besoin de Firefox ou de Chromium. Trois façons de rendre Playwright non détecté passe en revue ce que chaque couche peut et ne peut pas atteindre, y compris ce que celui-ci coûte.
Si vous choisissez entre des moteurs plutôt que des outils, notez qu'une grande part des frameworks d'agents IA pilotent Chromium via CDP, ce qui tranche la question pour vous : Agents navigateurs IA et furtivité.
Licence
MIT - voir LICENSE. Le binaire Firefox patché est distribué sous MPL-2.0 (licence amont de Firefox). Les patches C++ contre mozilla-central qui produisent ce binaire se trouvent sur feder-cr/firefox_antidetect_patch.
Avertissement
Ce projet est uniquement à des fins éducatives. Il est fourni tel quel, sans aucune garantie. Je n'assume aucune responsabilité quant à son utilisation. Utilisez-le à vos propres risques et conformément aux lois de votre juridiction.
Construit par Federico Elia