
invisible_playwright v0.7.0
Playwright के लिए मुफ़्त एंटीडिटेक्ट ब्राउज़र स्टील्थ: अनडिटेक्टेड हेडलेस फ़ायरफ़ॉक्स फ़िंगरप्रिंट। Python स्क्रैपिंग, रीकैप्चा और बॉट डिटेक्शन बाईपास। ओपन सोर्स
Playwright एंटी-बॉट्स और कैप्चा द्वारा पकड़ा जाता है।
यह वाला एक एंटी-डिटेक्ट Firefox पर अनडिटेक्टेड फिंगरप्रिंट के साथ चलता है, और आपके मौजूदा Playwright कोड के साथ संगत है।

यह कैसे काम करता है
एंटी-बॉट्स दो सवाल पूछते हैं, और reCAPTCHA, hCaptcha तथा Cloudflare Turnstile इनके जवाबों को स्कोर करते हैं। invisible_playwright दोनों का जवाब हाँ में देता है।
1. क्या यह एक असली ब्राउज़र है? हाँ। यह Firefox है, जिसे C++ स्रोत स्तर पर पैच किया गया है।
- ब्राउज़र फिंगरप्रिंट इंजन के अंदर सेट होता है, पेज में इंजेक्ट नहीं किया जाता: navigator, screen, GPU/WebGL, canvas, फ़ॉन्ट्स, ऑडियो, WebRTC, टाइमज़ोन, नेटवर्क। हेडलेस हो या हेडेड, दोनों में मान समान रहते हैं।
- कोई JS शिम नहीं, कोई ओवरराइड नहीं, पढ़ने के लिए कोई सीम नहीं।
2. क्या इसे कोई असली व्यक्ति इस्तेमाल कर रहा है? हाँ। ड्राइवर में क्रियाएँ मानवीय बनाई गई हैं।
- हर क्लिक, हॉवर और ड्रैग प्राकृतिक माउस पथ और मानवीय समय-निर्धारण का पालन करता है, कर्सर कहीं छलांग नहीं लगाता।
- प्रत्येक इनपुट असली माउस के बाइट-समान होता है: असली इनपुट स्रोत, दबाव, विश्वसनीय इवेंट।
इंस्टॉल करें
Windows पर, PowerShell में:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
uv init --python ">=3.11" my-project
cd my-project
uv add invisible-playwright
uv run invisible-playwright fetch # one-time download, sha256-verified: 240 MB, about 550 MB unpacked
Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv init --python ">=3.11" my-project
cd my-project
uv add invisible-playwright
uv run invisible-playwright fetch # one-time download, sha256-verified: 262 MB (x86_64) / 253 MB (arm64), about 550 MB unpacked
समर्थित प्लेटफ़ॉर्म: Windows x86_64, Linux x86_64 / arm64।
फिर नीचे दिए गए उदाहरणों में से एक को my-project में main.py के रूप में सहेजें और इसे uv run main.py से चलाएँ।
उपयोग
प्रति सत्र यादृच्छिक फ़िंगरप्रिंट
Playwright का API, sync और async, बिना किसी कोड परिवर्तन के। वही ऑब्जेक्ट, वही कॉल, वही रिटर्न मान। कुछ सतहें दायरे से बाहर हैं - tracing, HAR, CDP, API request context - और हर एक चुपचाप गलत व्यवहार करने के बजाय यह बताते हुए मना कर देती है कि ऐसा क्यों है। यदि आप पहले से Playwright का उपयोग करते हैं, तो स्विच करना दो पंक्तियों का काम है:
- 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:
प्रत्येक सत्र को एक अलग फ़िंगरप्रिंट (GPU, ऑडियो, फ़ॉन्ट, स्क्रीन, ~200 फ़ील्ड) और बेज़ियर-कर्व माउस मोशन मिलता है।
सिंक
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")
browser ऑब्जेक्ट एक playwright.sync_api.Browser / playwright.async_api.Browser है - हर Playwright विधि जैसी है वैसे ही काम करती है।
किसी रन को दोबारा चलाने के लिए seed को लॉग करें:
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:
...
समर्थित स्कीम: socks5, socks4, http, https। DNS डिफ़ॉल्ट रूप से प्रॉक्सी के माध्यम से रूट किया जाता है, कोई स्थानीय लीक नहीं।
टाइमज़ोन
ब्राउज़र टाइमज़ोन 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:
...
विशिष्ट फ़िंगरप्रिंट फ़ील्ड्स को पिन करना
डिफ़ॉल्ट रूप से सब कुछ seed से आता है। विशिष्ट मानों को बाध्य करने के लिए, जबकि शेष seed-व्युत्पन्न रहता है:
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:
...
GPU पिन मुक्त स्ट्रिंग सेट करने के बजाय मान्य किए गए पर्सोना में से एक चुनता है,
क्योंकि ~81 getParameter मान और एक्सटेंशन सूची रेंडरर नाम के साथ चलते हैं और
एक डिटेक्टर उन्हें उसके विरुद्ध क्रॉस-चेक करता है। पूल में मौजूद न होने वाला नाम
त्रुटि उत्पन्न करता है, और त्रुटि उन नामों को सूचीबद्ध करती है जो मौजूद हैं।
पिन करने योग्य कुंजियों की पूरी सूची, पिनिंग बायेसियन सैंपलर के साथ कैसे इंटरैक्ट करती है, और सामान्य पैटर्न docs/pinning.md में हैं।
CLI
इंस्टॉल किया गया कमांड invisible-playwright है, हाइफ़न के साथ। python -m invisible_playwright समान रूप से काम करता है और 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