
Playwright जिसे anti-bots देख नहीं सकते, इसलिए कोई captchas नहीं: वही API, anti-detect stealth headless Firefox, undetected fingerprint, bot detection को bypass, Python web scraping और browser automation।

एंटी-बॉट्स दो सवाल पूछते हैं, और reCAPTCHA, hCaptcha तथा Cloudflare Turnstile इनके जवाबों को स्कोर करते हैं। invisible_playwright दोनों का जवाब हाँ में देता है।
1. क्या यह एक असली ब्राउज़र है? हाँ। यह Firefox है, जिसे C++ स्रोत स्तर पर पैच किया गया है।
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 में हैं।
इंस्टॉल किया गया कमांड 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