
إضافة متصفح تملأ تلقائيًا نوافذ ملفات تعريف الارتباط بناءً على تفضيلاتك
|
|
معظم مواقع الويب اليوم ترغب في معالجة بياناتك وتطلب موافقتك باستخدام لافتات ملفات تعريف الارتباط. بينما تهدف هذه اللافتات إلى منحك السيطرة، إلا أنها غالبًا ما تؤدي في الممارسة العملية إلى نقرات متكررة وتستغرق وقتًا طويلاً - خاصة إذا كان متصفحك يمسح ملفات تعريف الارتباط عند إغلاقه. تظهر نفس اللافتة مرة أخرى، وتجد نفسك تتخذ نفس الخيارات مرارًا وتكرارًا.
Consent-O-Matic هو امتداد متصفح مصمم لحل هذه المشكلة. تم تطويره بواسطة مركز التصور والتفاعل المتقدم (CAVI) في جامعة آرهوس، وتقوم الأداة تلقائيًا بالتعامل مع لافتات الموافقة نيابة عنك. بعد تعيين تفضيلاتك أثناء التثبيت، سيقوم Consent-O-Matic بالتعرف على العديد من لافتات منصة إدارة الموافقة (CMP) الشائعة، وتطبيق اختياراتك، والتأكيد بعلامة اختيار صغيرة بجانب أيقونة الامتداد.
نظرًا لأن Consent-O-Matic هو مشروع مفتوح المصدر، يمكن لأي شخص المساهمة في تحسينه عن طريق إضافة قواعد جديدة، تحديث القواعد القديمة، أو تحديث الوثائق. يضمن هذا النهج التعاوني أن يواكب الامتداد المشهد المتغير باستمرار للافتات الموافقة عبر الإنترنت - مما يسهل على الجميع حماية بياناتهم بمتاعب أقل.
يعمل Consent-O-Matic حاليًا مع أكثر من 200 CMP (انظر القائمة الكاملة هنا)، بما في ذلك المنصات الرئيسية مثل UserCentrics وCookieBot وOneTrust، بالإضافة إلى لافتات ملفات تعريف الارتباط لمواقع ويب محددة.
يستخدم Consent-O-Matic مجموعة الأذونات التالية في المتصفح عند التثبيت:
يتواصل الامتداد مع الويب فقط في حالتين:
يتم إرسال عنوان URL للموقع الذي تم الإبلاغ عنه عبر أيقونة الامتداد إلى موقع ويب يستضيفه جامعة آرهوس في شكل سلسلة استعلام مشفرة URI (على سبيل المثال، سيتم الإبلاغ عن LinkedIn كـ https://gdprconsent.projects.cavi.au.dk/report.php?url=www.linkedin.com).
نوصي بشدة بالتثبيت مباشرة من خلال متجر الامتدادات الرسمي لمتصفحك (المذكور في الأعلى). التثبيت عبر القنوات الرسمية سيبقيك على اطلاع دائم بالإصدارات الجديدة عند إصدارها.
من الممكن أيضًا الحصول على الامتداد بوسائل أخرى.
كبديل لمتاجر الامتدادات، يمكنك تنزيل واستخراج أحد الإصدارات المنشورة يدويًا من صفحة الإصدارات على Github.
إذا قمت بذلك، يجب عليك استخدام ميزة المطور في المتصفح لتحميل غير محزم (Chrome) أو تحميل إضافة مؤقتة (Firefox) وتوجيهه إلى manifest.json في دليل zip غير المحزم.
أخيرًا، إذا كنت تنوي مراجعة الكود أو إجراء تغييرات عليه، يمكنك بناء وتثبيت مباشرة من الكود المصدري:``` git clone https://github.com/cavi-au/Consent-O-Matic.git cd Consent-O-Matic npm install
ثم قم بتشغيل أحد الأوامر ```npm run build-firefox``` أو ```npm run build-chromium``` أو ```npm run build-safari```
بالنسبة لـ Firefox أو Chromium، يمكنك الآن المتابعة كما هو مذكور أعلاه لتثبيت أرشيفات الإصدار، ولكن وجه المتصفح إلى مجلد `build` أو المجلد الذي قمت باستخراج الملف المضغوط إليه من build/dist/. يتطلب Safari تحميل مشروع XCode لبناء التطبيق بشكل إضافي.
نحن لا نوصي بالتثبيت من المصدر.
## توسيع Consent-O-Matic
إذا كانت CMP المفضلة لديك غير موجودة في القائمة الحالية، فلا تتردد في إنشاء قائمة مخصصة يمكنك إضافتها (انقر على أيقونة الامتداد في متصفحك، وانقر على "المزيد من إعدادات الإضافة"، وانقر على "قوائم القواعد"، وأدخل URL لقائمتك المخصصة.). إذا كنت **ترغب حقًا** في المساهمة، فلا تتردد في إنشاء طلب سحب (Pull Request) أثناء ذلك.
يمكن للمستخدمين إرسال تقارير عندما لا تعمل القواعد لمواقع ويب محددة. القائمة الكاملة لعناوين URL المبلغ عنها متاحة [هنا](https://gdprconsent.projects.cavi.au.dk/reports.php). الرقم يشير إلى عدد المرات التي تم فيها الإبلاغ عن عنوان URL. هذه القائمة لا تظهر حاليًا ما إذا/متى تم فحص/تعديل القواعد لعنوان URL، لذا تحقق دائمًا مما إذا كانت القاعدة لا تزال معطلة/مفقودة قبل البدء في العمل عليها.
### عناصر القاعدة
* [الهيكل الأساسي](#basic-structure)
* [الكاشفات](#detectors)
* [الطرق](#methods)
* [اختيار DOM](#dom-selection)
* [الإجراءات](#actions)
* [النقر](#click)
* [القائمة](#list)
* [الموافقة](#consent)
* [الانزلاق](#slide)
* [إذا CSS](#if-css)
* [انتظار CSS](#wait-for-css)
* [لكل](#for-each)
* [انتظار](#wait)
* [إخفاء](#hide)
* [إغلاق](#close)
* [المطابقات](#matchers)
* [CSS](#css)
* [مربع الاختيار](#checkbox)
* [الموافقة](#consent-1)
* [فئات الموافقة](#consent-categories)
* [مثال كامل](#full-example)
### الهيكل الأساسي
قائمة القواعد لـ Consent-O-Matic هي هيكل JSON يحتوي على قواعد اكتشاف CMP (مزود إدارة الموافقة)، والتعامل مع النافذة المنبثقة لـ CMP عند اكتشافها.
كل CMP هو إدخال مسمى ويحتوي على جزئين، `detectors` و `methods`. يجب أن يكون الاسم هو الاسم الفعلي لـ CMP الأساسي (مع الاهتمام بالأحرف الكبيرة والمسافات بشكل صحيح) أو اسم الموقع الإلكتروني إذا كان فريدًا لذلك النطاق. سيظهر الاسم في قسم حول (About) من إعدادات الامتداد، لذا اجعله سهل الاستخدام.```json
{
"MyCMP": {
"detectors": [ ... ],
"methods": [ ... ]
},
"AnotherCMP": {
"detectors": [ ... ],
"methods": [ ... ]
},
}
إذا تمت إضافة أكثر من كاشف واحد إلى CMP، يُعتبر CMP مكتشفًا إذا تم تشغيل أي من الكواشف.
الكواشف هي الجزء الذي يكتشف ما إذا كان يجب تطبيق مجموعة قواعد معينة. باختصار، إذا تم تشغيل كاشف، سيتم تطبيق الطرق.
هيكل الكاشف:```json { "presentMatcher": [{ ... }], "showingMatcher": [{ ... }] }
يتم استخدام present matcher للكشف عن وجود CMP على الصفحة.
لا تزال بعض CMPs تقوم بإدراج HTML المنبثق في DOM حتى عند إعادة زيارة صفحة كنت قد منحت فيها الموافقة مسبقًا. نحن نريد فقط معالجة نموذج الموافقة إذا كان يظهر فعليًا على الصفحة. هذا هو الغرض من استخدام showing matcher.
يتبع كل من present matcher و showing matcher الهيكل المشترك لـ [`Matchers`](#matchers).
يمكن أن يكون كل من present matcher و showing matcher متعددات، حيث يتم تشغيل المكتشف فقط إذا انطبقت جميع المطابقات (على التوالي لكل من present و showing).
#### الطرق
الطرق هي مجموعات من الإجراءات. هناك 4 طرق يدعمها Consent-O-Matic. `OPEN_OPTIONS`, `DO_CONSENT`, `SAVE_CONSENT`, `HIDE_CMP`
جميع الطرق اختيارية، وإذا كانت موجودة، فسيتم تشغيل الطرق بالترتيب الموضح أدناه عند تشغيل المكتشف.```
HIDE_CMP
OPEN_OPTIONS
HIDE_CMP
DO_CONSENT
SAVE_CONSENT
تتخذ الطرق الشكل التالي:```json { "name": " ... ", "action": { ... } }
حيث يكون الاسم واحدًا من الطرق الأربعة المدعومة والإجراء هو [الإجراء](#actions) الذي سيتم تنفيذه.
---
### اختيار DOM
تحتوي معظم الإجراءات والمطابقات على هدف معين يتم تطبيقه عليه. لهذا السبب، يحتوي Consent-O-Matic على آلية اختيار DOM يمكن أن تساعد بسهولة في اختيار عنصر DOM الصحيح.```json
"parent": {
"selector": ".some.css.selector",
"textFilter": "someTextFilter",
"styleFilter": {
"option": "someStyleOption",
"value": "someStyleValue",
"negated": false
},
"displayFilter": true,
"iframeFilter": false,
"childFilter": {}
},
"target": {
"selector": ".some.css.selector",
"textFilter": "someTextFilter",
"styleFilter": {
"option": "someStyleOption",
"value": "someStyleValue",
"negated": false
},
"displayFilter": true,
"iframeFilter": false,
"childFilter": {}
}
هناك جزآن، parent و target. parent اختياري ولكن إذا وُجد فسيتم حله أولاً، وسيُستخدم كنقطة انطلاق لـ target. يتيح لك هذا إنشاء تحديدات معقدة جدًا للعناصر التي قد لا تكون ممكنة باستخدام محدد CSS بسيط واحد. مثال على ذلك هو التحديد داخل DOM الظلي (shadow DOM) - حيث استخدام parent لاستهداف العنصر الذي يحتوي على الظل يسمح بالاستعلام عن أبنائه باستخدام المحدد (selector).
جميع المعاملات لـ parent و target باستثناء selector اختيارية.
تعمل طريقة التحديد باستخدام محدد CSS من selector ثم تصفية عُقد DOM الناتجة عبر عوامل التصفية المتاحة المختلفة:
textFilter يُصفّي جميع العُقد التي لا تحتوي على النص المُعطى. يمكن إعطاؤه أيضًا كمصفوفة "textFilter":["filter1", "filter2"] وعندها يُصفّي جميع العُقد التي لا تحتوي على أحد عوامل تصفية النص المُعطاة.
styleFilter يُصفّي بناءً على الأنماط المحسوبة (computedStyles). option هو خيار النمط للمقارنة مثلاً position، و value هي القيمة للمقارنة ضدها، و negated يحدد ما إذا كانت قيمة الخيار يجب أن تطابق القيمة المُعطاة أم لا.
displayFilter يمكن استخدامه لتصفية العُقد بناءً على ما إذا كانت مخفية العرض (display hidden) أم لا.
iframeFilter يُصفّي العُقد بناءً على ما إذا كانت داخل iframe أم لا.
childFilter هو تحديد DOM جديد تمامًا، ثم يُصفّي على التحديد الأصلي، بناءً على ما إذا تم تحديد بواسطة childFilter أم لا.
إليك مثال على تحديد DOM:```json "parent": { "selector": ".myParent", "iframeFilter": true, "childFilter": { "target": { "selector": ".myChild", "textFilter": "Gregor" } } }, "target": { "selector": ".myTarget" }
يحاول هذا المحدد أولاً العثور على `parent` وهو عنصر DOM يحمل الفئة `myParent` موجود داخل iframe ولديه عنصر DOM فرعي يحمل الفئة `myChild` يحتوي على النص "Gregor".
ثم، باستخدام هذا الوالد (parent) كـ "root"، يحاول العثور على عنصر DOM يحمل الفئة `myTarget`.
قد يكون هذا بعد ذلك هدف إجراء (action) أو مطابق (matcher).
---
### الإجراءات
الإجراءات هي الجزء من Consent-O-Matic الذي يقوم بالفعل بتنفيذ الأمور. بعض الإجراءات تفعل شيئًا لاختيار هدف، والبعض الآخر يتعلق بتدفق التحكم.
#### النقر
يحاكي هذا الإجراء نقرة الفأرة على هدفه.
مثال:```json
{
"type": "click",
"target": {
"selector": ".myButton",
"textFilter": "Save settings"
},
"openInTab": false
}
openInTab إذا تم تعيينه على true، فسيؤدي إلى تشغيل ctrl+shift+click بدلاً من النقر، مما يجب أن يجعل الرابط، إن وجد، يفتح في علامة تبويب جديدة ويركز على تلك العلامة التبويب.
في هذا المثال، نستخدم فقط target بسيط مع textFilter ولكن دعم DOM selection الكامل متاح.
يقوم هذا الإجراء بتشغيل قائمة من الإجراءات بالترتيب.
مثال:```json { "type": "list", "actions": [] }
`actions` هو مصفوفة من الإجراءات التي سيتم تنفيذها جميعًا بالترتيب.
#### الموافقة
إجراء الموافقة يأخذ مصفوفة من الموافقات، ويحاول تطبيق تحديدات موافقة المستخدم.
مثال:```json
{
"type": "consent",
"consents": []
}
consents هو مصفوفة من أنواع Consent
تستخدم بعض نماذج الموافقة شريط تمرير لتعيين مستوى الموافقة، ويدعم هذا الإجراء محاكاة التمرير باستخدام شريط التمرير هذا.
مثال:```json { "type": "slide", "target": { "selector": ".mySliderKnob" }, "dragTarget": { "target": { "selector": ".myChoosenOption" } }, "axis": "y" }
`target` هو عنصر DOM الهدف لمحاكاة حركة الانزلاق عليه.
`dragTarget` هو عنصر DOM المستخدم لمسافة الانزلاق.
`axis` يختار ما إذا كان المنزلق يتحرك أفقيًا "x" أو عموديًا "y".
سيقوم حدث الانزلاق بمحاكاة أن الماوس سحب `target` المسافة من `target` إلى `dragTarget` على `axis` المحدد.
#### إذا كان CSS
يُستخدم هذا الإجراء كتدفق تحكم، حيث يقوم بتشغيل إجراء آخر اعتمادًا على ما إذا كان اختيار DOM يجد عنصرًا أم لا.
مثال:```json
{
"type": "ifcss",
"target": {
"selector": "",
},
"trueAction": {
"type": "click",
"target": {
"selector": ".myTrueButton"
}
},
"falseAction": {
"type": "click",
"target": {
"selector": ".myFalseButton"
}
}
}
trueAction إجراء سيتم تنفيذه إذا وجد تحديد DOM عنصرًا.
falseAction سيتم تنفيذه عندما لا يجد تحديد DOM عنصرًا.
ينتظر هذا الإجراء حتى يجد مُحدد DOM عنصرًا مطابقًا. يستخدم بشكل أساسي إذا كان هناك شيء في نموذج الموافقة يتم تحميله ببطء ويحتاج إلى الانتظار.
مثال:```json { "type": "waitcss", "target": { "selector": ".myWaitTarget" }, "retries": 10, "waitTime": 200, "negated": false }
`retries` هو عدد المرات التي سيتم فيها التحقق من وجود عنصر DOM المستهدف. القيمة الافتراضية هي 10.
`waitTime` يحدد الوقت بين محاولات إعادة المحاولة. القيمة الافتراضية هي 250.
`negated` يجعل إجراء "انتظار CSS" ينتظر حتى لا يتم العثور على الهدف.
#### لكل
إذا كانت مجموعة من الإجراءات بحاجة إلى التنفيذ عدة مرات، ولكن بعقد DOM مختلفة كجذر، فيمكن استخدام إجراء "لكل". يقوم هذا الإجراء بتنفيذ إجراءاته مرة واحدة لكل عنصر DOM يتم تحديده بواسطة اختيار DOM الخاص به؛ جميع الإجراءات التي يتم تشغيلها داخل حلقة "لكل" سترى DOM كما لو أنه يبدأ من العقدة المحددة حالياً.
مثال:```json
{
"type": "foreach",
"target": {
"selector": ".loopElement"
},
"action": {}
}
action هو الإجراء المطلوب تنفيذه لكل عنصر DOM يتم العثور عليه.
ينتظر هذا الإجراء المدة المحددة بالمللي ثانية قبل المتابعة.
مثال:```json { "type": "wait", "waitTime": 250 }
#### إخفاء
يحدد هذا الإجراء فئة CSS 'ConsentOMatic-CMP-Hider' على تحديد DOM. ستقوم قواعد CSS الافتراضية بعد ذلك بتعيين opacity إلى 0 على العنصر.
مثال:```json
{
"type": "hide",
"target": {
"selector": ".myHiddenClass"
}
}
يقوم هذا الإجراء بإغلاق التبويب الحالي، وهو مفيد لمزويدي الموافقة مثل Evidon، الذي يفضل فتح تبويبات جديدة بلوحة تحكم الموافقة بداخلها.
مثال:```json { "type": "close" }
### المطابقات
تُستخدم المطابقات للتحقق من وجود اختيار DOM معين، أو حالة اختيار DOM معين.
#### CSS
يتحقق هذا المطابق من وجود اختيار DOM، ويُرجع أنه متطابق إذا كان موجودًا.
مثال:```json
{
"type": "css",
"target": {
"selector": ".myMatchingClass"
}
}
يتحقق هذا المطابق من حالة <input type='checkbox' /> ويعيد تطابقًا إذا كان المربع محددًا.
مثال:
<input type='checkbox' checked='checked' />
``````json
{
"type": "checkbox",
"target": {
"selector": ".myInputCheckbox"
}
}
هذا ما يُستخدم داخل إجراءات الموافقة ويُحدد الموافقة الفعلية التي يجب على المستخدم منحها أو عدم منحها.
كل موافقة لها نوع، يتطابق مع فئات الموافقة داخل Consent-O-Matic، لذلك إذا قام المستخدم بتبديل فئة الموافقة الأولى إلى تشغيل (النوع A) وكانت الموافقة من النوع "A"، فسيتم تمكين الموافقة.
عادةً ما تُمنح الموافقة إما كمفتاح تبديل، أو مجموعة أزرار تشغيل/إيقاف. لذلك فإن consent لديه آلية لكل من هذه الحالات.
مثال:```json { "type": "A", "toggleAction": {}, "matcher": {}, "trueAction": {}, "falseAction": {} }
`type` هو نوع فئة الموافقة التي تحددها هذه القاعدة ويحدد ما إذا كانت هذه الموافقة يجب أن تكون نشطة أم لا بناءً على اختيار المستخدم لهذا النوع من الفئات.
`toggleAction` هذا الإجراء يُستخدم لتحديد الموافقة إذا كانت النافذة المنبثقة تستخدم زر تبديل (toggle) أو مفتاح (switch) للإشارة إلى الموافقة. سيتم تشغيل الإجراء إذا أشار المطابق (matcher) إلى أن حالة الموافقة مختلفة عما طلبه المستخدم، وإلا فلن يتم تشغيله.
`matcher` هو المطابق المستخدم للتحقق من حالة الموافقة. بالنسبة لـ [مطابق خانة الاختيار](#checkbox)، تُمنح الموافقة إذا كانت خانة الاختيار محددة. بالنسبة لـ [مطابق CSS](#css)، تُمنح الموافقة إذا وجد المطابق اختيارًا في DOM.
`trueAction` و `falseAction` هما إجراءان يُستخدمان إذا كان لابد من منح الموافقة بالضغط على أحد زرين بدلاً من التبديل بين التشغيل والإيقاف. سيتم تشغيل هذين الإجراءين بناءً على اختيار المستخدم للموافقة. إذا منح المستخدم الموافقة لهذا النوع من الفئات، فسيتم تشغيل `trueAction`، وسيتم تشغيل `falseAction` إذا لم يمنح المستخدم الموافقة لهذا النوع من الفئات.
إذا كان `toggleAction` و `matcher` موجودَين في تكوين المحتوى، فسيتم استخدام toggleAction، وإذا كان أحدهما مفقودًا، فسيتم استخدام `trueAction`/`falseAction` بدلاً من ذلك.
#### فئات الموافقة
كما هو موضح في إعدادات الإضافة، بنفس الترتيب:
* D: تخزين المعلومات والوصول إليها
* A: التفضيلات والوظائف
* B: الأداء والتحليلات
* E: اختيار المحتوى وتسليمه وإعداد التقارير
* F: اختيار الإعلانات وتسليمها وإعداد التقارير
* X: أغراض أخرى
---
### مثال كامل
بتجميع كل ذلك، إليك مثال كامل لـ CMP "MyCMP" يحتوي على فئتي موافقة للتبديل.```json
{
"MyCMP": {
"detectors": [
{
"presentMatcher": {
"type": "css",
"target": {
"selector": "#theCMP"
}
},
"showingMatcher": {
"target": {
"selector": "#theCMP.isShowing"
}
}
}
],
"methods": [
{
"name": "OPEN_OPTIONS",
"action": {
"type": "click",
"target": {
"selector": ".button",
"textFilter": "Change settings"
}
}
},
{
"name": "DO_CONSENT",
"action": {
"type": "list",
"actions": [
{
"type": "click",
"target": {
"selector": ".menu-vendors"
}
},
{
"type": "consent",
"consents": [
{
"type": "A",
"matcher": {
"type": "checkbox",
"parent": {
"selector": ".vendor-item",
"textFilter": "Functional cookies"
},
"target": {
"selector": "input"
}
},
"toggleAction": {
"type": "click",
"parent": {
"selector": ".vendor-item",
"textFilter": "Functional cookies"
},
"target": {
"selector": "label"
}
}
},
{
"type": "F",
"matcher": {
"type": "checkbox",
"parent": {
"selector": ".vendor-item",
"textFilter": "Advertisement cookies"
},
"target": {
"selector": "input"
}
},
"toggleAction": {
"type": "click",
"parent": {
"selector": ".vendor-item",
"textFilter": "Advertisement cookies"
},
"target": {
"selector": "label"
}
}
}
]
}
]
}
},
{
"name": "SAVE_CONSENT",
"action": {
"type": "click",
"target": {
"selector": ".save-consent-btn"
}
}
}
]
}
}