
Anti-detect browser stealth for Playwright: undetected headless Firefox fingerprint spoofing. Python web scraping and automation, Cloudflare, captcha and anti-bot detection bypass.

Anti-bots दो सवाल पूछते हैं, और reCAPTCHA, hCaptcha तथा Cloudflare Turnstile जवाबों को स्कोर करते हैं। invisible_playwright दोनों का जवाब हाँ में देता है।
1. क्या यह असली ब्राउज़र है? हाँ। यह Firefox है, जिसे C++ सोर्स स्तर पर पैच किया गया है।
2. क्या इसे कोई असली व्यक्ति इस्तेमाल कर रहा है? हाँ। ड्राइवर में क्रियाएँ humanized हैं।
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
Python 3.11 या नया आवश्यक है।
समर्थित प्लेटफ़ॉर्म: Windows x86_64, Linux x86_64 / arm64।
Playwright का API, sync और async, बिना कोई कोड बदले। वही ऑब्जेक्ट, वही कॉल, वही रिटर्न वैल्यू। कुछ सतहें दायरे से बाहर हैं - tracing, HAR, CDP, API request context - और go_back() तथा go_forward() restored pages में एक दोष के कारण रोके गए हैं; हर एक चुपचाप गलत व्यवहार करने के बजाय कारण बताते हुए मना कर देता है। अगर आप पहले से 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, audio, fonts, screen, ~200 फ़ील्ड) और Bezier-curve माउस मोशन मिलता है।
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")
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 pin मुक्त स्ट्रिंग सेट करने के बजाय मान्य personas में से एक चुनता है,
क्योंकि ~81 getParameter मान और extension सूची renderer नाम के साथ चलते हैं
और एक डिटेक्टर उन्हें उसके विरुद्ध क्रॉस-चेक करता है। पूल में मौजूद न होने वाला
नाम त्रुटि उठाता है, और त्रुटि उन नामों की सूची देती है जो मौजूद हैं।
pinnable keys की पूरी सूची, pinning Bayesian sampler के साथ कैसे काम करता है, और सामान्य पैटर्न 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
अगर आप स्क्रिप्ट लिखने के बजाय प्रॉम्प्ट करना पसंद करें। यह पेज इंजन है, एक Python
लाइब्रेरी के रूप में। बिना कोड लिखे इसे इस्तेमाल करने के दो तरीके, दोनों एक लाइन के: आपके पास
पहले से मौजूद MCP क्लाइंट से (Claude Code, Claude Desktop, Cursor),
claude mcp add stealth -- uvx aihawk, देखें
the MCP server page; या एक
इंटरफ़ेस और मॉडल सहित, जिसके लिए केवल OpenRouter key चाहिए,
uvx aihawk ui --openrouter-key sk-or-..., देखें
AIHawk। नीचे वही इंजन है, और दूसरा
पहले का क्लाइंट है।
यह सब बेहतर पढ़ा जाता है, और खोजा जा सकता है, the wiki में, जो एक सपाट सूची के बजाय चार खंडों में व्यवस्थित है:
अगर आपको नहीं पता कि कहाँ से शुरू करें: Three ways to make Playwright undetected वह नक्शा है जिससे बाकी ज़्यादातर पेज लिंक करते हैं, Playwright detected as a bot on one site समस्या-निवारण का क्रम है, और navigator.webdriver is not the tell you think it is इस क्षेत्र की सबसे प्रसिद्ध प्रॉपर्टी समझाता है और यह क्यों अकेले उसे पैच करने से लगभग कुछ नहीं मिलता।
detectors खंड अब व्यावसायिक anti-bot उत्पादों को नाम के साथ कवर करता है, हर एक अपने दस्तावेज़ीकरण या पुष्ट reverse engineering से पढ़ा गया: Cloudflare Bot Management और Turnstile, DataDome, Kasada, Akamai Bot Manager, PerimeterX, hCaptcha, Imperva, और the rest of the set।
इसी के अन्य हिस्से। इंजन तीन में से बीच वाला है, और उसके आसपास के दो वे हैं जिनसे ज़्यादातर लोग इस तक पहुँचते हैं:
uvx aihawk, किसी भी ऐसे क्लाइंट के लिए जो अपना
मॉडल लाता है) और, उसी पैकेज में, एक कमांड से मॉडल सहित एक इंटरफ़ेस।
इंटरफ़ेस सर्वर का क्लाइंट है, ब्राउज़र तक कोई निजी रास्ता नहीं।ओपन-सोर्स पड़ोसी। कौन सा फ़िट होता है यह इस पर निर्भर है कि आपकी समस्या किस लेयर पर है, और क्या आपको Firefox चाहिए या Chromium: three ways to make Playwright undetected यह समझाता है कि हर लेयर क्या पा सकती है, और AI browser agents and stealth उन फ़्रेमवर्क को कवर करता है जो आपके लिए CDP के बजाय Chromium चुनते हैं।
Firefox की ओर
Chromium की ओर
undetected-chromedriver का उत्तराधिकारी, CDP के ज़रिए Chrome चलाता है। Comparison।Runtime.enable CDP लीक ठीक करता है। Comparison।playwright-python की ओर इशारा करता है। What that recommendation is about।नीचे दी गई हर चीज़ पर दो नियम लागू होते हैं। हर मान किसी पेज के पूछने से पहले तय हो जाता है, ब्राउज़र के अंदर, इसलिए खोजने के लिए कोई JavaScript shim नहीं है। और हर मान एक ही प्रोफ़ाइल से आता है, इसलिए कोई दो सतहें एक-दूसरे का खंडन नहीं करतीं, जिससे आमतौर पर एक spoofed ब्राउज़र पकड़ा जाता है। सोर्स: feder-cr/firefox_antidetect_patch।
पहचान
navigator, user agent और client hints एक साथ व्युत्पन्न होते हैं, इसलिए वे असहमत नहीं हो सकते: does Playwright set navigator.webdriver, client hints and Sec-Fetch।navigator.languages और Accept-Language हेडर एक ही घोषणा हैं, भेजी और पढ़ी जाती: Accept-Language and navigator.languages।devicePixelRatio और उसे उजागर करने वाली media queries घोषित हैं, होस्ट से पढ़ी नहीं जातीं: devicePixelRatio and the Firefox pref, CSS media query fingerprinting।रेंडरिंग
measureText एक कॉल से दस से अधिक संख्याएँ लौटाता है, बिना किसी permission prompt के: measureText and TextMetrics।ऑडियो और मीडिया
नेटवर्क
ऑटोमेशन लेयर
isTrusted सच है क्योंकि यह वास्तव में सच है: Playwright clicks and isTrusted।null पढ़ता है: closed shadow roots।MIT - देखें LICENSE। पैच किया गया Firefox बाइनरी MPL-2.0 (Firefox upstream लाइसेंस) के अंतर्गत वितरित किया जाता है। उस बाइनरी को बनाने वाले mozilla-central के विरुद्ध C++ पैच feder-cr/firefox_antidetect_patch पर हैं।
यह प्रोजेक्ट केवल शैक्षिक उद्देश्यों के लिए है। यह जैसा है वैसा प्रदान किया गया है, बिना किसी वारंटी के। इसके उपयोग की मैं कोई ज़िम्मेदारी नहीं लेता। इसका उपयोग अपने जोखिम पर और अपने क्षेत्राधिकार के कानूनों के अनुपालन में करें।
Built by Federico Elia