إضافة كروم لحجب الإعلانات، مبنية على Manifest V3 — تعمل بعد أن أوقفت جوجل دعم Manifest V2 وعطّلت uBlock Origin نهائياً في كروم 151.
| 1.0 | 2.0 | |
|---|---|---|
| قواعد الشبكة | 23 مكتوبة يدوياً | حتى 29,000 من قوائم المجتمع |
| قواعد الإخفاء | 8 محددات | حتى 4,000 من نفس القوائم |
| فيسبوك | — | كشف المنشورات الممولة بكسر التمويه |
| يوتيوب | — | تخطي إعلانات المشغّل تلقائياً |
| التحديث | يدوي | تلقائي كل 24 ساعة |
| الاختبارات | — | 28 اختباراً على نواة الكشف |
chrome://extensions- فعّل Developer mode
- Load unpacked ← اختر هذا المجلد
- افتح الإضافة ← اضغط Update filter lists ← انتظر التنزيل
بعدها ستُحدَّث القوائم تلقائياً كل يوم.
| # | الأسلوب | كيف يُهزَم |
|---|---|---|
| ١ | تفتيت التسمية عبر عناصر متعددة | إعادة بناء من الإحداثيات البصرية |
| ٢ | حشر U+034F بين كل حرفين، كلٌّ في عقدة مستقلة |
استبعاد بعرض صفر + تطبيع المحارف |
| ٣ | ترتيب DOM مبعثر يُصلحه flexbox بصرياً | الفرز حسب الموضع الفعلي على الشاشة |
| ٤ | أحرف وهمية بحجم وموضع حقيقيين، مقصوصة بـ overflow: hidden |
مقاطعة كل جزء مع صندوق كل سلف قاصّ |
الطبقة الرابعة هي الأخبث: الأحرف تجتاز كل فحوص display وvisibility وopacity
لأنها فعلاً «مرئية» بمقاييس CSS — لكنها واقعة خارج صندوق القص فلا يراها أحد.
كانت تنتج تسميات مثل:
sponsoredontrsdseop05fu935tca120a1t285fmc58hl8c598gl632gt000
└───────┘└──────────────────────────────────────────────────┘
صحيحة ركام مقصوص
فيسقط الطول في فحص المطابقة وينجو الإعلان.
فيسبوك يقدّم إعلاناته من نطاقه نفسه، فحجب الشبكة لا يمسّها. وأسماء الأصناف
عشوائية (x1i10hfl) وتتغيّر باستمرار، فالمحددات لا تنفع. والأسوأ: فيسبوك
يفتّت كلمة "مُموَّل" عبر عناصر وهمية مخفية بالـ CSS، فيخرج النص مشوّشاً:
DOM يقول: S X p o Y n s Z o r e d ← "SXpoYnsZored"
المستخدم يرى: S p o n s o r e d ← "Sponsored"
الحل في fb-detect.js: لا نقرأ الـ DOM، بل نقيس أين يقع كل جزء نص على
الشاشة فعلياً عبر Range.getBoundingClientRect(). الأجزاء المخفية مساحتها
صفر فتُستبعد، والترتيب المبعثر يُصلَح بالفرز حسب الإحداثيات.
فيسبوك لا يستطيع تزوير الموضع البصري دون تغيير ما يراه المستخدم — وهذا ما يجعل الطريقة تصمد أمام تدوير أسماء الأصناف.
العربية تحتاج معالجة خاصة: الفرز التصاعدي بالإحداثي السيني صحيح للإنجليزية لكنه يعكس العربية، لأن أول حرف يقع عند أكبر إحداثي لا أصغره. الوحدة تكتشف اتجاه النص وتفرز عكسياً. هذا خطأ حقيقي التقطته الاختبارات.
node tests/fb-detect.test.jsتبني DOM اصطناعياً بتخطيط حقيقي (jsdom لا يصلح — لا ينفّذ تخطيطاً،
فكل getBoundingClientRect يعود بأصفار وتصبح الاختبارات بلا معنى) وتحاكي:
- أحرف وهمية بـ
display:none - ترتيب DOM مبعثر يُصلحه flexbox بصرياً
- عناصر خارج الشاشة و
clipوopacity:0وfont-size:0 - تشكيل عربي وتطويل وأحرف صفرية العرض
- نصوص يجب ألا تُطابَق («برنامج رعاية الأيتام»)
manifest.json التعريف
background.js الخدمة: الإعدادات، القوائم، الشارة
filters.js محرّك قوائم الفلترة → قواعد DNR ديناميكية
content.js الإخفاء العام على كل المواقع
fb-detect.js نواة الكشف (قابلة للاختبار)
facebook.js تطبيق الكشف على صفحة فيسبوك
youtube.js تخطي إعلانات المشغّل
inject.js مقاومة كاشفات مانعات الإعلانات
popup.html/js الواجهة
rules_ads.json قواعد أساسية ثابتة
tests/ بيئة الاختبار
- كروم يسمح بـ 30,000 قاعدة ديناميكية فقط. uBlock Origin كان يعمل بمئات الآلاف. هذا سقف المنصة لا سقف الإضافة.
- القواعد التجميلية الخاصة بمواقع بعينها مُهملة — يُستورَد العام فقط.
- فيسبوك ويوتيوب هدفان متحركان. سيغيّران البنية وستحتاج الوحدات صيانة.
- الاختبارات تغطي نواة الكشف فقط، لا التكامل مع صفحة حقيقية.
فعّل Debug: outline only من الإضافة — سترسم إطاراً أحمر حول ما تكتشفه بدل إخفائه. ثم في Console:
document.querySelectorAll('[data-abp-blocked]').length- رقم أكبر من صفر → الكشف يعمل، والمشكلة في الإخفاء
- صفر → الكشف يفشل، والمحددات تحتاج تحديثاً
وللتشخيص الأعمق، جرّب قراءة نص أي عنصر يدوياً:
ABPDetect.readLabel(document.querySelector('SELECTOR'),
{ doc: document, getStyle: getComputedStyle, SHOW_TEXT: NodeFilter.SHOW_TEXT })