انتقلت من HTTP الخام إلى متصفح حقيقي. بصمة TLS: بصمة Chrome الحقيقية فعلاً. عنوان IP: سكني. ومع ذلك ما زال الموقع يعرف. في 2026، تجاوز كشف المتصفحات بدون واجهة navigator.webdriver بأشواط — فالجيل الحالي من الفحوص يكشف بروتوكول الأتمتة نفسه، ومعظم إضافات "التخفّي" تُرقّع إشارات الأمس بينما تُظهر بصخب إشارات اليوم.
يرسم هذا المقال خريطة لما تفحصه المواقع فعلياً الآن، بالترتيب التقريبي الذي تفحصه به، وما الذي يساعد حقاً في كل طبقة. وهو يكمل ثلاثية الكشف مع بصمة TLS عبر JA3/JA4 (طبقة الشبكة) وسمعة IP و ASN (طبقة العنوان) — وهذه هي طبقة المتصفح.
navigator.webdriver — تفرض المواصفة أن تكون قيمته true تحت الأتمتة. تُخفيه إعدادات التخفّي في Playwright/Puppeteer؛ ويتعامل معه خيار Chrome --disable-blink-features=AutomationControlled أصلياً. تظل المواقع تفحصه لأنه مجاني ويلتقط الروبوتات الساذجة.HeadlessChrome/ في User-Agent. يُصلَح بالوضع الجديد بدون واجهة (headless=new)، الذي يستخدم مسار ثنائي Chrome الحقيقي.navigator.plugins، لا chrome.runtime، وعرض خارجي 0×0. كان الوضع القديم بدون واجهة يفشل في كل هذه؛ بينما يجتازها الوضع الجديد بدون واجهة في معظمها.إذا كان الهدف يفحص المستوى 1 فقط، فإن Playwright الحديث مع headless=new يمر دون عائق. أما الأهداف الجادة فقد تجاوزت ذلك منذ سنوات.
يقود Playwright و Puppeteer متصفح Chrome عبر بروتوكول Chrome DevTools، ويترك CDP آثاراً جانبية في وقت التشغيل يمكن لـ JavaScript الصفحة ملاحظتها:
// The classic CDP leak: serialization callbacks
const err = new Error();
Object.defineProperty(err, "stack", {
get() {
// This getter fires DURING console serialization -
// which only happens when DevTools/CDP is attached
window.__cdp_detected = true;
},
});
console.debug(err);
توجد متغيرات من هذا — آثار جانبية للـ getter أثناء تسلسل console، وشذوذات توقيت في Runtime.evaluate، وسلوك toString() على الدوال الأصلية المُرقّعة — في كل حزمة تجارية لمكافحة الروبوتات. النقطة الحاسمة: هذا يكشف البروتوكول، لا الوضع بدون واجهة. فمتصفح Chrome ذو واجهة، ومُرقّع للتخفّي، ويبدو بشرياً تماماً، سيظل يفشل إن كان مُقاداً عبر CDP.
ما الذي يساعد:
إلى جانب الآثار، تفحص الأنظمة الحديثة ما إذا كانت قصة متصفحك متسقة داخلياً:
| الفحص | ما يفضح الروبوت |
|---|---|
| تجزئة عرض Canvas / WebGL | عرض برمجي عبر SwiftShader/llvmpipe = معالج رسوميات خادم؛ أو تجزئة تتشاركها 10,000 "مستخدم مختلف" |
| الخطوط والترميزات | مجموعة خطوط خادم Linux تحت وكيل مستخدم Windows |
| المنطقة الزمنية × اللغة المحلية × جغرافيا IP | Intl يقول UTC، وعنوان IP يقول تكساس، وAccept-Language يقول de-DE |
| مقاييس الشاشة | 1920×1080 دون شريط مهام، و devicePixelRatio يساوي 1 بالضبط، ونافذة لم يُعد تحجيمها قط |
| تزامن العتاد / الذاكرة | 96 نواة مُبلّغ عنها لصفحة تدّعي أنها هاتف |
| إشارات سلوكية دقيقة | لا عشوائية في الماوس، تعبئة فورية للنماذج، تمرير بخطوات متطابقة قدرها 100 بكسل |
هنا يموت التخفّي اليدوي: كل ترقيع تطبّقه يجب أن يتفق مع كل إشارة أخرى. فوكيل مستخدم Windows منتحَل على حاوية Linux يناقض الخطوط، وسلاسل معالج الرسوميات، وبصمات TCP في آنٍ واحد. التماسك يتفوق على الكمال — فمتصفح Chrome صادق ذو واجهة على Linux يحقق نتيجة أفضل من متصفح "Windows" منتحَل بشكل سيئ.
لا شيء من هذا يهم إذا كانت طبقة العنوان محترقة: فالمتصفح الذي لا تشوبه شائبة على ASN لمركز بيانات يظل "متصفحاً لا تشوبه شائبة داخل مركز بيانات" — وعتبات كشف العمل بدون واجهة تتكيّف مع سمعة IP. فالمتصفح نفسه يتلقى تحديات JavaScript أكثر من عنوان IP مُعلّم. تخفّض المخارج السكنية فعلياً مستوى التدقيق الذي يتعيّن على طبقة المتصفح النجاة منه:
browser = p.chromium.launch(
headless=False, # headed survives more checks
args=["--disable-blink-features=AutomationControlled"],
proxy={
"server": "us.jibaoproxy.com:913",
"username": "USERNAME", "password": "PASSWORD",
},
)
toString() غير مُرقّع هو بحد ذاته إشارة. الترقيعات الأقل والمتماسكة هي الفائزة.عناوين IP سكنية تطابق القصة التي ترويها بصمتك — 500MB من حركة المرور المجانية، دون الحاجة إلى بطاقة.
ابدأ التجربة المجانيةيحصل المستخدمون الجدد على 500MB عند التسجيل، بالإضافة إلى مكافأة على أول عملية شحن. العرض لفترة محدودة.