تقنية الخصوصية

كيف تحدد المواقع أتمتة المتصفح (وماذا تفعل حيال ذلك)

BC

BotCloud Team

11 مارس 2026·3 min read

المقدمة

عند أتمتة متصفح باستخدام Playwright أو Puppeteer أو Selenium، يعرض المتصفح إشارات تحدده كمتحكم به برمجياً. تم تعيين خاصية navigator.webdriver إلى true. تظهر كائنات محددة في بيئة JavaScript. تترك بروتوكولات وحدة التحكم والتصحيح آثاراً. يتصرف وضع headless بشكل مختلف عن الوضع برأس بطرق دقيقة.

هذه الإشارات موجودة لأن أطر العمل تحتاج إلى نقاط ربط في المتصفح للعمل. المشكلة أن هذه النقاط نفسها يمكن أن يلاحظها أي JavaScript يعمل على الصفحة.

إشارات التعرف

قدمت مواصفات W3C WebDriver navigator.webdriver. عندما يتم التحكم في متصفح عبر بروتوكول WebDriver، تُرجع هذه الخاصية true. تم تصميمه كآلية شفافية، لكنه الآن الإشارة الأكثر شيوعاً للتعرف على الأتمتة.

في Chromium القياسي، يتم تعيين هذه القيمة على مستوى C++ أثناء تهيئة المتصفح عندما يكون العلم --enable-automation موجوداً، والذي يضيفه Playwright و Puppeteer افتراضياً.

نقاط حقن الإطار

يحقن كل إطار عمل أتمتة الكود في نقاط معينة:

  • Playwright يحقن دوال الربط (__playwright__binding__) وسكريبتات التهيئة في كل سياق صفحة جديد
  • Puppeteer يحقن مساعدات سكريبت التقييم وكود إدارة جلسة CDP
  • Selenium يستخدم بروتوكول WebDriver الذي يعين أعلام الأتمتة على مستوى المتصفح

آثار CDP

يمكّن بروتوكول Chrome DevTools الأدوات الخارجية من التحكم في المتصفح. عندما تكون جلسة CDP نشطة، تصبح عدة إشارات قابلة للملاحظة:

  • Runtime.enable و Console.enable تغيران سلوك console.log وتتبع مكدس الأخطاء
  • تظهر اتصالات جلسة CDP على نقاط نهاية WebSocket محددة
  • يتغير سلوك المتصفح عندما تكون نطاقات CDP نشطة

فروق وضع Headless

يختلف وضع headless في Chromium القياسي عن الوضع برأس بعدة طرق. قد تكون مصفوفة navigator.plugins فارغة. قد يعود WebGL إلى العرض البرمجي. قد تحتوي أبعاد النافذة على قيم غير معتادة.

حدود Stealth Plugins

تحاول Stealth Plugins التنظيف بعد قيام الإطار بالفعل بتعيين قيم الأتمتة. تحل محل navigator.webdriver بـ getter جافا سكريبت، وتحذف كائنات الإطار من النطاق العام، وتصحح خصائص أخرى مميزة.

هذا النهج له ضعف أساسي: يحدث التنظيف في JavaScript، بعد تهيئة سياق الصفحة. القيم الأصلية موجودة بإيجاز قبل الكتابة فوقها، وآثار تصحيح JavaScript نفسها قابلة للملاحظة.

يمكن للمواقع:

  • التحقق من تعديلات واصف الخاصية على navigator.webdriver
  • ملاحظة أن Object.getOwnPropertyDescriptor يُرجع getter بدلاً من قيمة
  • ملاحظة الفروق الزمنية بين الحالة الأولية والحالة المصححة
  • البحث عن أنماط الكود الخاصة بـ Stealth Plugins نفسها

كيف يحل BotCloud هذا

يزيل BotCloud إشارات الأتمتة على مستوى المحرك، قبل تنفيذ أي كود صفحة:

  • navigator.webdriver يُرجع false أصلياً، وليس من خلال تجاوز JavaScript
  • لا توجد كائنات ربط إطار في سياقات الصفحة
  • نشاط جلسة CDP معزول عن JavaScript على الصفحة
  • أوضاع headless و headed تنتج سلوكاً قابلاً للملاحظة متطابقاً

لأن هذه التغييرات تحدث في محرك المتصفح نفسه، لا يوجد تصحيح JavaScript للكشف عنه، لا يوجد فجوة زمنية للاستفادة منها، ولا يوجد شذوذ واصف خاصية للعثور عليه.

التأثيرات العملية

مع BotCloud، يمكنك استخدام سطح API Playwright أو Puppeteer الكامل بدون أي Stealth Plugins أو حلول بديلة للتكوين. تبقى سكريبتات الأتمتة الخاصة بك نظيفة وتركز على منطق العمل بدلاً من تجنب التعرف.

// لا حاجة لـ Stealth Plugin - فقط اتصل وقم بالأتمتة
const browser = await puppeteer.connect({
  browserWSEndpoint: 'wss://cloud.bots.win?token=YOUR_TOKEN',
});

const page = await browser.newPage();
await page.goto('https://example.com');

// navigator.webdriver غير صحيح، لا آثار أتمتة مسربة
#automation#fingerprint#webdriver#puppeteer#playwright

شارك هذا المنشور