
متصفح تخفٍّ مجاني مضاد للاكتشاف مع Playwright: بصمة Firefox غير مكتشفة في وضع headless. استخراج بيانات عبر Python وتجاوز reCAPTCHA وكشف الروبوتات. مفتوح المصدر.

تطرح أنظمة مكافحة البوتات سؤالين، وتقيّم reCAPTCHA وhCaptcha وCloudflare Turnstile الإجابات عليهما. يجيب invisible_playwright بنعم على كليهما.
1. هل هذا متصفح حقيقي؟ نعم. إنه Firefox، مُرقَّع على مستوى مصدر C++.
2. هل يستخدمه شخص حقيقي؟ نعم. الإجراءات مُحوَّلة إلى سلوك بشري داخل المشغّل.
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 البرمجية، المتزامنة وغير المتزامنة، دون أي تغيير في الكود. الكائنات نفسها، والاستدعاءات نفسها، والقيم المُعادة نفسها. بعض الأسطح خارج النطاق - التتبع (tracing)، وHAR، وCDP، وسياق طلبات API - كما أن go_back() وgo_forward() معطّلتان بسبب خلل في الصفحات المُستعادة؛ كل واحدة منهما ترفض بجملة توضح السبب بدلًا من أن تسيء التصرف بصمت. إذا كنت تستخدم 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
غير متزامن
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 يختار واحدة من الشخصيات المُتحقَّق منها بدلًا من تعيين نص حر،
لأن قيم getParameter البالغ عددها نحو 81 وقائمة الإضافات تسير مع
اسم الـ renderer ويقوم أحد الكواشف بالتحقق المتقاطع منها مقابل الاسم. أي اسم
لا تحمله المجموعة يُطلق خطأً، ويسرد الخطأ الأسماء التي تحملها.
القائمة الكاملة للمفاتيح القابلة للتثبيت، وكيفية تفاعل التثبيت مع مُعيّن بايز، والأنماط الشائعة موجودة في 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، انظر
صفحة خادم MCP؛ أو بواجهة
ونموذج مضمّنين، لا يحتاجان سوى مفتاح OpenRouter،
uvx aihawk ui --openrouter-key sk-or-...، انظر
AIHawk. المحرك نفسه في الأسفل، والثاني
عميل للأول.
كل ذلك يُقرأ بشكل أفضل، وقابل للبحث، في الويكي، منظَّمًا في أربعة أقسام بدلًا من قائمة مسطحة واحدة:
إذا لم تعرف من أين تبدأ: ثلاث طرق لجعل Playwright غير قابل للكشف هي الخريطة التي ترتبط بها معظم الصفحات الأخرى، واكتشاف Playwright كبوت على موقع واحد هو ترتيب استكشاف الأخطاء، وnavigator.webdriver ليس الدليل الذي تظنه يشرح أشهر خاصية في هذا المجال ولماذا لا يجدي ترقيعها وحدها شيئًا تقريبًا.
يغطي قسم الكواشف الآن منتجات مكافحة البوتات التجارية بالاسم، كل واحد مقروء من توثيقه الخاص أو من هندسة عكسية مؤكدة: Cloudflare Bot Management و Turnstile، وDataDome، وKasada، وAkamai Bot Manager، وPerimeterX، وhCaptcha، وImperva، و بقية المجموعة.
الأجزاء الأخرى من هذا المشروع. المحرك هو الأوسط بين ثلاثة، والاثنان حوله هما كيف يصل إليه معظم الناس:
uvx aihawk، لأي عميل يجلب
نموذجه الخاص) وفي الحزمة نفسها، واجهة بنموذج مضمّن، من
أمر واحد. الواجهة عميل للخادم، دون أي مسار خاص
إلى المتصفح.الجيران مفتوحو المصدر. أيّهم يناسبك يعتمد على الطبقة التي تقع فيها مشكلتك، وعلى ما إذا كنت تحتاج Firefox أم Chromium: ثلاث طرق لجعل Playwright غير قابل للكشف تستعرض ما يمكن لكل طبقة الوصول إليه، ووكلاء المتصفح بالذكاء الاصطناعي والتخفي يغطي الأطر التي تختار Chromium عبر CDP نيابة عنك.
في جانب Firefox
في جانب Chromium
undetected-chromedriver، يقود Chrome عبر CDP. مقارنة.Runtime.enable في CDP. مقارنة.playwright-python. عن ماذا تكون هذه التوصية.تنطبق قاعدتان على كل ما يلي. كل قيمة تُحدَّد قبل أن تتمكن الصفحة من السؤال، داخل المتصفح، فلا توجد طبقة JavaScript وهمية يمكن العثور عليها. وكل قيمة تأتي من ملف تعريف واحد، فلا يتناقض أي سطحين، وهذه هي الطريقة التي يُكشف بها المتصفح المُنتحَل عادةً. المصدر: feder-cr/firefox_antidetect_patch.
الهوية
navigator، وسلسلة user agent، وتلميحات العميل تُشتق معًا، فلا يمكن أن تتعارض: هل يضبط Playwright قيمة navigator.webdriver، تلميحات العميل وSec-Fetch.navigator.languages وترويسة Accept-Language هما الإعلان نفسه، يُرسَلان ويُقرآن: Accept-Language وnavigator.languages.devicePixelRatio، واستعلامات الوسائط التي تكشفه مُعلَنة، لا مقروءة من المضيف: devicePixelRatio وتفضيل Firefox، بصمة استعلامات وسائط CSS.العرض
measureText عشرة أرقام وأكثر من استدعاء واحد، دون طلب إذن: measureText وTextMetrics.الصوت والوسائط
الشبكة
طبقة الأتمتة
isTrusted صحيحة لأنها صحيحة فعلًا: نقرات Playwright وisTrusted.null: جذور الظل المغلقة.MIT - انظر LICENSE. يُوزَّع ملف Firefox التنفيذي المُرقَّع بموجب MPL-2.0 (ترخيص Firefox الأصلي). ترقيعات C++ مقابل mozilla-central التي تنتج ذلك الملف التنفيذي موجودة في feder-cr/firefox_antidetect_patch.
هذا المشروع لأغراض تعليمية فقط. يُقدَّم كما هو، دون أي ضمانات. لا أتحمل أي مسؤولية عن كيفية استخدامه. استخدمه على مسؤوليتك الخاصة وبما يتوافق مع قوانين ولايتك القضائية.
Built by Federico Elia