
Kostenloser Antidetect-Browser-Stealth für Playwright: unerkannter Headless-Firefox-Fingerprint. Python-Scraping, Umgehung von reCAPTCHA und Bot-Erkennung. Open Source

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.
2. Wird er von einer echten Person verwendet? Ja. Die Aktionen werden im Driver humanisiert.
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.
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 go_back() und go_forward() werden durch einen Defekt in wiederhergestellten Seiten zurückgehalten; jede verweigert mit einem Satz, der den Grund nennt, statt sich still falsch zu verhalten. Wenn Sie Playwright bereits verwenden, ist der Wechsel 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.
Protokollieren Sie den Seed, um einen Lauf wiederholen zu können:
sf = InvisiblePlaywright()
with sf as browser:
print("seed =", sf.seed)
# ...
with InvisiblePlaywright(seed=42) as browser:
... # same GPU, same canvas hash, same audio context, every run
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.
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:
...
Standardmäßig kommt 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 Erweiterungsliste 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 Schlüssel, wie Pinning mit dem Bayesian-Sampler interagiert, und gängige Muster finden Sie in docs/pinning.md.
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
Wenn Sie lieber prompten als skripten möchten. Diese Seite ist die Engine, als
Python-Bibliothek. Zwei Möglichkeiten, sie ohne Code zu verwenden, beide einzeilig: aus einem MCP-Client,
den Sie bereits haben (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, das nur einen OpenRouter-Key benötigt,
uvx aihawk ui --openrouter-key sk-or-..., siehe
AIHawk. Dieselbe Engine darunter, und die zweite
ist ein Client der ersten.
All das liest sich besser, und ist durchsuchbar, im Wiki, organisiert in vier Abschnitte statt einer flachen Liste:
Wenn Sie nicht wissen, wo Sie anfangen sollen: Drei Wege, Playwright unentdeckt zu machen ist die Karte, auf die die meisten anderen Seiten zurückverweisen, Playwright wird auf einer Website als Bot erkannt ist die Reihenfolge zur Fehlerbehebung, und navigator.webdriver ist nicht das Verräter-Merkmal, für das Sie es halten erklärt die berühmteste Eigenschaft in diesem Bereich und warum das alleinige Patchen fast nichts bringt.
Der Detektoren-Abschnitt behandelt jetzt die kommerziellen Anti-Bot-Produkte namentlich, jedes aus der eigenen Dokumentation oder aus bestätigtem Reverse Engineering gelesen: Cloudflare Bot Management und Turnstile, DataDome, Kasada, Akamai Bot Manager, PerimeterX, hCaptcha, Imperva, und der Rest des Sets.
Die anderen Teile dieses Projekts. Die Engine ist die Mitte von dreien, und die beiden um sie herum sind der Weg, über den die meisten sie erreichen:
uvx aihawk, für jeden Client, der sein eigenes
Modell mitbringt) und, im selben Paket, eine Oberfläche mit enthaltenem Modell, mit
einem Befehl. Die Oberfläche ist ein Client des Servers, ohne privaten Pfad
zum Browser.Die Open-Source-Nachbarn. Welcher passt, hängt davon ab, auf welcher Ebene Ihr Problem liegt, und ob Sie Firefox oder Chromium benötigen: drei Wege, Playwright unentdeckt zu machen arbeitet durch, was jede Ebene erreichen kann, und KI-Browser-Agenten und Stealth behandelt die Frameworks, die Chromium über CDP für Sie auswählen.
Auf der Firefox-Seite
Auf der Chromium-Seite
undetected-chromedriver, der Chrome über CDP steuert. Vergleich.Runtime.enable-CDP-Leck. Vergleich.playwright-python verweist. Worum es bei dieser Empfehlung geht.Zwei Regeln gelten für alles Folgende. Jeder Wert wird entschieden, bevor eine Seite fragen kann, innerhalb des Browsers, sodass es kein JavaScript-Shim zu finden gibt. Und jeder Wert stammt aus einem Profil, sodass sich keine zwei Oberflächen widersprechen, was üblicherweise der Weg ist, wie ein gespoofter Browser auffliegt. Quelle: feder-cr/firefox_antidetect_patch.
Identität
navigator, der User Agent und die Client Hints werden gemeinsam abgeleitet, sodass sie nicht widersprechen können: setzt Playwright navigator.webdriver, Client Hints und Sec-Fetch.navigator.languages und der Accept-Language-Header sind dieselbe Deklaration, gesendet und gelesen: Accept-Language und navigator.languages.devicePixelRatio und die Media Queries, die sie offenlegen, werden deklariert, nicht vom Host gelesen: devicePixelRatio und die Firefox-Pref, CSS-Media-Query-Fingerprinting.Rendering
measureText liefert zehn-plus Zahlen aus einem Aufruf, ohne Berechtigungsabfrage: measureText und TextMetrics.Audio und Medien
Netzwerk
Die Automatisierungsschicht
isTrusted wahr ist, weil es wahr ist: Playwright-Klicks und isTrusted.null liest: Closed Shadow Roots.MIT - siehe LICENSE. Das gepatchte Firefox-Binary wird unter der MPL-2.0 (Firefox-Upstream-Lizenz) vertrieben. Die C++-Patches gegen mozilla-central, die dieses Binary erzeugen, finden sich unter feder-cr/firefox_antidetect_patch.
Dieses Projekt dient ausschließlich Bildungszwecken. Es wird wie besehen bereitgestellt, ohne Gewährleistung. Ich übernehme keine Verantwortung für die Art und Weise seiner Verwendung. Nutzen Sie es auf eigenes Risiko und in Übereinstimmung mit den Gesetzen Ihrer Jurisdiktion.
Built by Federico Elia