
invisible_playwright v0.20.0
Playwright, das Anti-Bots nicht sehen können, also keine Captchas: gleiche API, Anti-Detect-Stealth-Headless-Firefox, unentdeckter Fingerprint, Umgehung der Bot-Erkennung, Python-Web-Scraping und Browser-Automatisierung.
Playwright wird von Anti-Bots und Captchas erkannt.
Dieses hier läuft auf einem Anti-Detect-Firefox mit unerkennbarem Fingerprint und ist mit deinem bestehenden Playwright-Code kompatibel.

Wie es funktioniert
Anti-Bots stellen zwei Fragen, und reCAPTCHA, hCaptcha und Cloudflare Turnstile bewerten die Antworten. invisible_playwright beantwortet beide mit Ja.
1. Ist das ein echter Browser? Ja. Es ist Firefox, gepatcht auf C++-Quellcode-Ebene.
- Der Browser-Fingerprint wird innerhalb der Engine gesetzt, nicht in die Seite injiziert: navigator, screen, GPU/WebGL, canvas, fonts, audio, WebRTC, timezone, network. Headless oder headed, in beiden Fällen dieselben Werte.
- Kein JS-Shim, kein Override, keine Naht zum Auslesen.
2. Wird er von einer echten Person benutzt? Ja. Die Aktionen werden im Driver humanisiert.
- Jeder Klick, Hover und Drag folgt einem natürlichen Mauspfad mit menschlichem Timing, kein teleportierender Cursor.
- Jede Eingabe ist byte-identisch mit einer echten Maus: echte Input-Quelle, Druck, vertrauenswürdige Events.
Installation
pip install invisible-playwright
python -m invisible_playwright fetch # one-time download, sha256-verified: 240 MB (Windows) / 262 MB (Linux x86_64) / 253 MB (Linux arm64), about 550 MB unpacked
Erfordert Python 3.11 oder neuer.
Unterstützte Plattformen: Windows x86_64, Linux x86_64 / arm64.
Verwendung
Zufälliger Fingerprint pro Session
Playwrights API, sync und async, ohne Codeänderungen. Dieselben Objekte, dieselben Aufrufe, dieselben Rückgabewerte. Einige Oberflächen liegen außerhalb des Geltungsbereichs - tracing, HAR, CDP, der API request context - und jede davon verweigert mit einem Satz, der den Grund nennt, statt sich still falsch zu verhalten. Wenn du Playwright bereits nutzt, besteht der Wechsel aus zwei Zeilen:
- 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:
Jede Session erhält einen eigenen Fingerprint (GPU, audio, fonts, screen, ~200 Felder) und Bezier-Kurven-Mausbewegung.
Sync
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") # mouse arcs to the button on a Bezier curve
Async
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")
Das browser-Objekt ist ein playwright.sync_api.Browser / playwright.async_api.Browser - jede Playwright-Methode funktioniert unverändert.
Protokolliere den Seed, um einen Lauf zu wiederholen:
sf = InvisiblePlaywright()
with sf as browser:
print("seed =", sf.seed)
# ...
Reproduzierbarer Fingerprint
with InvisiblePlaywright(seed=42) as browser:
... # same GPU, same canvas hash, same audio context, every run
Proxies
proxy = {
"server": "socks5://gate.example.com:1080",
"username": "user",
"password": "pass",
}
with InvisiblePlaywright(proxy=proxy) as browser:
...
Unterstützte Schemata: socks5, socks4, http, https. DNS wird standardmäßig über den Proxy geleitet, kein lokales Leck.
Zeitzone
Die Browser-Zeitzone folgt timezone=:
# default: timezone is auto-derived from the egress IP (proxy egress if a
# proxy is set, otherwise the host's own public IP)
with InvisiblePlaywright(proxy=proxy) as browser:
...
# explicit IANA zone always wins, the only way to force a specific zone
with InvisiblePlaywright(proxy=proxy, timezone="America/New_York") as browser:
...
Festlegen bestimmter Fingerprint-Felder
Standardmäßig stammt alles aus seed. Um bestimmte Werte zu erzwingen, während der Rest seed-abgeleitet bleibt:
with InvisiblePlaywright(
seed=42,
pin={
"gpu.renderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0, D3D11)",
"gpu.vendor": "Google Inc. (AMD)",
"screen.width": 2560,
"screen.height": 1440,
"hardware.concurrency": 16,
},
) as browser:
...
Ein GPU-Pin wählt eine der validierten Personas aus, statt einen freien String zu setzen,
weil die ~81 getParameter-Werte und die Extension-Liste mit dem
Renderer-Namen einhergehen und ein Detektor sie dagegen abgleicht. Ein Name, den der Pool
nicht enthält, löst einen Fehler aus, und die Fehlermeldung listet die auf, die er enthält.
Die vollständige Liste der pinnbaren Keys, wie Pinning mit dem Bayesian-Sampler interagiert und gängige Muster findest du in docs/pinning.md.
CLI
Der installierte Befehl ist invisible-playwright, mit Bindestrich. python -m invisible_playwright funktioniert identisch und benötigt nichts im PATH.
invisible-playwright fetch # download the engine if missing, check every cached
# one against the seal, print the path
invisible-playwright version # wrapper, core and engine versions, and where the
# engine is cached
Dokumentation, Anleitungen und Vergleiche
Wenn du lieber promptest als skriptest. Diese Seite ist die Engine, als Python-
Bibliothek. Zwei Wege, sie ohne Code zu nutzen, beide einzeilig: aus einem MCP-Client,
den du bereits hast (Claude Code, Claude Desktop, Cursor),
claude mcp add stealth -- uvx aihawk, siehe
die MCP-Server-Seite; oder mit einer
Oberfläche und einem enthaltenen Modell, wobei nur ein OpenRouter-Key nötig ist,
uvx aihawk ui --openrouter-key sk-or-..., siehe
AIHawk. Dieselbe Engine darunter, und der zweite
ist ein Client des ersten.
Alles davon liest sich besser, und ist durchsuchbar, in dem Wiki, organisiert in vier Abschnitte statt einer flachen Liste:
- Dokumentation - Installation, der Zwei-Zeilen-Wechsel von reinem Playwright, Proxy-/Zeitzonen- Konfiguration, Pinning bestimmter Felder, die CLI.
- Anleitungen - wie Erkennung tatsächlich funktioniert, in sieben Gruppen: Browser-Identität, canvas/WebGL/fonts/ audio, Netzwerk und WebRTC, die Automatisierungsschicht, KI-Agenten, die Detektoren selbst aus dem Quellcode erklärt, und Testing.
- Vergleiche - gegen Camoufox, Patchright, nodriver und playwright-stealth, und das Argument für Firefox gegenüber Chromium allgemein.
- Integrationen - Scrapy, Crawlee, Robot Framework, CodeceptJS, Test-Runner, Playwright MCP, und die Frameworks, zu denen es nicht passt, namentlich.