مستودع جيثب: https://github.com/JSREI/js-cookie-monitor-debugger-hook
الصينية المبسطة |
في عصر أصبحت فيه البيانات لا تقدر بثمن، أصبحت المواجهة بين برامج الزحف وبرامج مكافحة الزحف最常见之一
عدم التعرف عليها (عادة عند التصفح) بصمات الخادم، ملفات تعريف الارتباط التي يجب إحضارها عند تقديم الطلبات، وما إلى ذلك)، ملفات تعريف الارتباط التي يجب إحضارها عند مواجهة الطلبات ولكن لا تعرف مكان إنشاؤها، أنت تكافح في عشرات الآلاف من السطور المربكة من هراء JS التي لا تتعرف عليها والدتك، على أمل العثور على المكان الذي يتم فيه إنشاء ملفات تعريف الارتباط (إذا كان التفكير العكسي غير علمي، فقد تختنق عدة مرات ...)، و حتى أنك تريد العثور عليه عدة مرات، هل تحاول خداع نفسك للاستسلام، أو لماذا لا تستخدم فقط طريقة محاكاة المتصفح مثل السيلينيوم؟ إذا كنت جبانًا، فهذا البرنامج النصي هنا لمساعدتك! (أنا وأنت نعلم أن هذه الفقرة مجرد هراء لدعم المشهد. يمكنك تخطيها، إذا لم يحالفك الحظ في إكمال قراءتها...)
تنقسم وظيفة هذا البرنامج النصي تقريبًا إلى قسمين:
يقوم هذا البرنامج النصي بإدخال كود JS الخاص به في الصفحة ويربط document.cookie
لإكمال وظائف مختلفة، لذلك، قبل استخدام هذا البرنامج النصي، يجب عليك أولاً التأكد من أن ملف تعريف الارتباط الذي سيتم إنشاؤه يتم إنشاؤه بالفعل من خلال JS (يتم تقديم طريقة خاصة جدًا لاحقًا). ما عليك سوى تحديد ما إذا كان ملف تعريف الارتباط قد تم إنشاؤه بواسطة JS أو تم إرجاعه بواسطة الخادم).
في الوقت الحالي، تحتوي العديد من نصوص الخطاف على أوضاع ربط غير صحيحة. يستخدم هذا البرنامج الخطافات المتكررة، والتي ليس لها أي تأثير على إدارة ملفات تعريف الارتباط المضمنة في المتصفح:
بالإضافة إلى وظيفة نقطة توقف ملفات تعريف الارتباط، تمت إضافة وظيفة مراقبة تعديل ملفات تعريف الارتباط، والتي يمكنها تحليل ملفات تعريف الارتباط على الصفحة من منظور أكبر:
(ننسى الأمر، توقف عن البرمجة...)
يستخدم اللون للتمييز بين أنواع العمليات:
سيتبع كل عملية موقع التعليمات البرمجية. انقر لتحديد موقع رمز JS الذي أجرى العملية.
بدءًا من الإصدار 0.6، تم تقديم قواعد نقاط التوقف بوظائف أكثر قوة وتكوينات أكثر مرونة، وتم تقديم آلية حدث لتقسيم تعديلات ملفات تعريف الارتباط إلى ثلاثة أحداث: الإضافة والحذف والتحديث، مما يدعم المزيد من نقاط التوقف الدقيقة أحداث ملفات تعريف الارتباط، يرجى الرجوع إلى الجزء 5 من هذه المقالة للحصول على التفاصيل.
لماذا تم تصميمه بهذه الطريقة؟ من المواقف الشائعة نسبيًا أن يتم تعيين ملف تعريف الارتباط المضاد للزحف على موقع الويب المستهدف بواسطة JS، ولكن منطق كود JS هو حذفه بشكل محموم أولاً، ثم حذفه عدة مرات قبل إضافة القيمة الحقيقية لملف تعريف الارتباط بهذه الطريقة يمكن أن تتصدى تمامًا لتصحيح أخطاء خطاف ملفات تعريف الارتباط العام.
فيما يلي أحد الأمثلة، مثل حماية ملفات تعريف الارتباط الخاصة بـ F5، هناك ملف تعريف الارتباط TS51c47c46075
، والذي يتم حذفه عدة مرات ثم إضافته مرة أخرى: في هذه الحالة، يمكنك تعيين نقطة توقف لحدث ملف تعريف الارتباط المسمى TS51c47c46075
لتجنب الخلط بين أحداث الحذف الأحمر.
من الناحية النظرية، طالما يمكن إدخال كود JS الخاص بهذا البرنامج النصي في الصفحة، فسيتم استخدام المكون الإضافي Grease Monkey لإدخال كود JS في الصفحة.
يمكن تثبيت المكون الإضافي Grease Monkey من متجر Chrome:
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo
إذا لم تتمكن من التحايل على الجدار، فيمكنك البحث عن "Tampermonkey" على Baidu للعثور على موقع ويب تابع لجهة خارجية لتنزيله، ومع ذلك، يرجى الحرص على عدم تثبيت مكونات إضافية ضارة مزيفة، ويوصى بالتثبيت من الموقع الرسمي محل.
تتوفر أيضًا أدوات أخرى، طالما يمكن إدخال كود JS الخاص بهذا البرنامج النصي في أعلى الصفحة للتنفيذ.
يمكنك تثبيت البرنامج النصي Grease Monkey من المتجر الرسمي، أو يمكنك نسخ الكود وإنشائه محليًا.
يوصى بهذه الطريقة. يمكن تحديث البرنامج النصي Oil Monkey المثبت من متجر Oil Monkey تلقائيًا عند تحديث الإصدارات اللاحقة.
https://greasyfork.org/zh-CN/scripts/419781-js-cookie-monitor-debugger-hook
إذا وجدت التحديثات التلقائية مزعجة للغاية، أو كانت لديك مخاوف أخرى، فيمكنك نسخ كود هذا البرنامج النصي هنا:
https://github.com/CC11001100/js-cookie-monitor-debugger-hook/blob/main/js-cookie-monitor-debugger-hook.js
وبعد المراجعة والتأكد من عدم وجود مشكلة يمكنك إضافتها في لوحة إدارة Oil Monkey.
لاحظ أن الرصد يهدف إلى الحصول على فهم شامل على المستوى الكلي، وليس تحديد التفاصيل (عادة ما يؤدي الاستخدام الصحيح للأدوات إلى تحسين الكفاءة. وبطبيعة الحال، معرفة الشخص محدودة، والجميع مدعوون لتقديم تعليقات حول طرق أكثر إثارة للاهتمام play) ، على سبيل المثال عند فتح صفحة:
بناءً على هذه الصورة، يمكننا الحصول على فهم عام لملفات تعريف الارتباط الموجودة على هذا الموقع والتي يتم تشغيلها بواسطة JS، ومتى وكيف يتم تشغيلها.
مثال آخر هو استخدام شاشة لمراقبة النمط المتغير لملفات تعريف الارتباط. على سبيل المثال، في هذه الصفحة، يمكنك أن ترى بناءً على الوقت الذي سيتم فيه تغيير ملف تعريف الارتباط هذا كل نصف دقيقة:
(2021-1-7 18:27:49 تم تحديث الإصدار 0.4 لإضافة هذه الميزة): إذا كان هناك الكثير من المعلومات المطبوعة بواسطة وحدة التحكم، فيمكنك استخدام التصفية التي تأتي مع متصفح Chrome لتصفيتها تم توحيد السجلات المطبوعة، فقط بحاجة إلى cookieName = Cookie名字
، على سبيل المثال:
يرجى ملاحظة أنه عند البحث، تأكد من أن معلومات البحث الخاصة بك قد تم فك تشفير عنوان URL الخاص بها، وإلا فقد لا تتطابق، لأن معلومات طباعة وحدة التحكم يتم فك تشفير عنوان URL أولاً ثم طباعتها.
إذا لم تكن متأكدًا مما إذا كان ملف تعريف الارتباط الذي تريد تعيينه قد تم إنشاؤه محليًا أو تم إرجاعه بواسطة set-cookie
محدد للخادم، فيمكنك فتح هذا البرنامج النصي، وتحديث صفحة موقع الويب المستهدف، ثم البحث عن اسم ملف تعريف الارتباط في وحدة التحكم. الطريقة هي نفسها المذكورة أعلاه. هذا القسم مشابه عندما يكون اسم ملف تعريف الارتباط قصيرًا وغير مميز، يمكنك إضافة cookieName
للمساعدة في تحديد الموضع، على سبيل المثال:
cookieName = v
في بعض الأحيان قد يقوم موقع الويب المستهدف بتعيين ملف تعريف ارتباط بشكل متكرر بنفس القيمة. يتم استخدام هذا المتغير لتجاهل مثل هذه الأحداث:
بشكل عام، فقط احتفظ بالإعداد الافتراضي.
@since v0.6
ينطبق هذا الجزء من المستند على الإصدار v0.6+ إذا كان الإصدار المحلي الخاص بك أقل من 0.6، فيرجى ترقية الإصدار قبل قراءة المستند.
بدءًا من الإصدار 0.6، أصبحت النقاط الفاصلة عندما تتغير قيمة ملفات تعريف الارتباط معقدة للغاية، كما أنها أصبحت بسيطة جدًا بسبب إدخال آلية الحدث، والبساطة بسبب تبسيط تكوين قاعدة نقطة التوقف وأكثر مرونة.
يمكن تقسيم قواعد نقاط التوقف إلى标准规则
简化规则
. القواعد القياسية مخصصة لسهولة التنفيذ والمعالجة في الجزء السفلي من البرنامج. القواعد المبسطة مخصصة للمستخدمين للتكوين بشكل أكثر ملاءمة في الظروف العادية، ما عليك سوى فهم القواعد المبسطة. عندما لا يتمكن تكوين القاعدة المبسطة، قم بالتحقق مرة أخرى لمعرفة كيفية تكوين القواعد القياسية عند تلبية احتياجاتك.
يتم تكوين جميع القواعد في مصفوفة debuggerRules
، ويوجد متغير في رأس البرنامج النصي: إذا لم تتمكن من العثور عليه، يمكنك الضغط على Ctrl+F للبحث حسب اسم المتغير:
debuggerRules
هذا المتغير هو نوع مصفوفة، يقوم بتخزين بعض شروط القاعدة لتحديد الظروف التي سيتم فيها إدخال نقطة التوقف.
لاحظ أن هذه مصفوفة، وأن القواعد الموجودة في المصفوفة موجودة في علاقة OR. عند تشغيل حدث تعديل ملف تعريف الارتباط، ستتم مطابقة كل قاعدة بالتسلسل، وطالما تمت مطابقة قاعدة واحدة بنجاح، سيتم إدخال نقطة توقف.
أدخل نقطة توقف عندما يتغير ملف تعريف الارتباط المسمى foo
:
const debuggerRules = [ "foo" ] ;
تحديد سلسلة بالطريقة المذكورة أعلاه سوف يطابق اسم ملف تعريف الارتباط إذا كان يساوي السلسلة المحددة.
لاحظ أنه إذا كان هناك جزء مشفر بعنوان URL من المطابقة التامة هنا، فيجب فك ترميز عنوان URL أولاً ثم لصقه هنا. الأماكن الأخرى التي تتضمن سلاسل هي نفسها ولن يتم وصفها مرة أخرى.
إذا كان اسم ملف تعريف الارتباط يحتوي على جزء يتغير باستمرار، مثل الطابع الزمني أو UUID وما إلى ذلك، والذي لا يمكن تحديد موقعه بالاسم، فسيتم استخدام المطابقة العادية:
const debuggerRules = [ / foo.+ / ] ;
في معظم الحالات، يكفي هذين التكوينين فقط.
دعونا نمارس ذلك الآن عند فتح هذه الصفحة
https://www.ishumei.com/trial/captcha.html
يمكنك أن ترى أن البرنامج النصي قد اكتشف بعض عمليات ملفات تعريف الارتباط:
أحدها، smidV2
مريب، لذا أضفنا نقطة توقف له:
بعد تعديل مصفوفة debuggerRules
، تأكد من الضغط على Ctrl+S لحفظ البرنامج النصي نظرًا لأن Oil Monkey يقوم بإدخال كود JS عند تحميل الصفحة، فأنت بحاجة إلى تحديث الصفحة وإعادة إدخالها سيتم إدخال نقطة التوقف تلقائيًا:
في المربع الأحمر A في الصورة أعلاه توجد بعض المتغيرات التي تم تمريرها خصيصًا. من خلال تحريك الماوس فوق هذه المتغيرات لعرض القيم، يمكننا معرفة بعض شروط نقطة التوقف الحالية تقريبًا:
ثم هناك المربع الأحمر B. قمنا بتعيين نقطة توقف ملف تعريف الارتباط لتتبع مكدس الاستدعاءات وتحديد المكان الذي يتم فيه إنشاء ملف تعريف الارتباط. المربع الأحمر هو مكدس الاستدعاءات لهذا البرنامج النصي. هناك شعار userscript.html
واضح هذا الجزء من مكدس الاستدعاءات.
ثم تتبع مكدس الاستدعاءات ويمكنك معرفة مكان تعيين ملف تعريف الارتباط:
بالطبع، من غير المجدي بالنسبة لنا أن ننظر إلى هذه المكدس، ما يتعين علينا القيام به هو المضي قدمًا تدريجيًا حتى نحدد المكان الذي تم فيه إنشاء ملف تعريف الارتباط بالفعل، ومع ذلك، يمكن لهذا البرنامج النصي أن يساعدك فقط في تحديد نقطة توقف من النجوم والبحر سيعتمد عليك أنت بنفسك فيما بعد!
أدخل نقطة توقف عند添加
ملف تعريف الارتباط المسمى foo
:
const debuggerRules = [ { "add" : "foo" } ] ;
أدخل نقطة توقف عند删除
ملف تعريف الارتباط المسمى foo
:
const debuggerRules = [ { "delete" : "foo" } ] ;
أدخل نقطة توقف عندما يكون ملف تعريف الارتباط المسمى foo
موجودًا بالفعل ولكن يتم更新
القيمة:
const debuggerRules = [ { "update" : "foo" } ] ;
يمكن تحديد شروط متعددة في نفس الوقت، ويتم إدخال نقاط التوقف عند添加和更新
، وهو ما يعادل استبعاد عمليات الحذف:
const debuggerRules = [ { "add|update" : "foo" } ] ;
يمكن استخدام السلاسل أو التعبيرات العادية أينما يتعلق الأمر بمطابقة اسم ملف تعريف الارتباط:
const debuggerRules = [ { "add" : / foo_d+ / } ] ;
سيتم تحويل القواعد المبسطة أعلاه إلى قواعد قياسية. يمكنك أيضًا تكوين القواعد القياسية مباشرةً في مصفوفة debuggerRules
.
{
"events": "{add|delete|update}",
"name": {"cookie-name" | /cookie-name-regex/},
"value": {"cookie-value" | /cookie-value-regex/}
}
نوع السلسلة، يشير إلى نوع الحدث المطابق لهذه القاعدة، |
أن يكون حدثًا واحدًا، مثل add
add|update
أحداث متعددة. استخدم |
أضف مسافات على كلا الجانبين، مثل add | update
عندما يتم تكوين نوع الحدث، فإنه سيطابق فقط نوع الحدث المحدد. عندما لا يتم تكوين هذا الخيار، ستتم مطابقة جميع أنواع الأحداث بشكل افتراضي.
يمكن أن يكون سلسلة أو نمطًا عاديًا، وهذا صحيح عندما يتطابق اسم ملف تعريف الارتباط مع السلسلة المحددة أو النمط العادي، ولا يمكن تجاهل هذا العنصر ويجب تهيئته.
يمكن أن تكون سلسلة أو نمطًا عاديًا. تكون هذه القاعدة صحيحة عندما تتطابق قيمة ملف تعريف الارتباط مع السلسلة المحددة أو النمط العادي. إذا لم يتم تكوينها، فسيتم تجاهل هذا الخيار.
تم تقديم تكوين قواعد نقاط التوقف مسبقًا، وتم ذكر أنواع الأحداث عدة مرات، ونحن نعرف فقط سلسلة الاسم المقابلة لكل حدث، لكننا ما زلنا لا نعرف ما يعنيه كل حدث في المستوى السفلي آلية تحقيق الحدث.
تنقسم تغييرات ملفات تعريف الارتباط إلى إضافة ملفات تعريف الارتباط وحذف ملفات تعريف الارتباط وتحديث قيم ملفات تعريف الارتباط الموجودة. يتوافق كل حدث مع اسم الحدث:
لم يكن ملف تعريف الارتباط موجودًا محليًا من قبل وهذه هي المرة الأولى التي تتم إضافته فيها. قد تكون هذه هي المرة الأولى التي تزور فيها هذا الموقع، أو قد تقوم بمسح ملفات تعريف الارتباط والزيارة مرة أخرى، أو سيتم إنشاء ملف تعريف ارتباط جديد في كل مرة تزور فيها موقع الويب، أو قد يكون حتى أن الكود الخاص بموقع الويب يحذف ملفات تعريف الارتباط ويعيد إضافتها لهم، الأمر الذي سيؤدي إلى إضافة حدث ملفات تعريف الارتباط.
على سبيل المثال، قم بتنفيذ التعليمات البرمجية التالية للتأكد من عدم وجود ملف تعريف الارتباط من قبل، تتم إضافة طابع زمني إلى اسم ملف تعريف الارتباط:
document . cookie = "foo_" + new Date ( ) . getTime ( ) + "=bar; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/" ;
عندما نقوم بتشغيل هذا السطر من التعليمات البرمجية في وحدة التحكم، سيتم تشغيل حدث إضافة ملف تعريف الارتباط:
عندما يكون ملف تعريف الارتباط موجودًا محليًا بالفعل وتحاول تعيين قيمة له، سيتم تشغيل حدث ملف تعريف الارتباط للتحديث.
على سبيل المثال الكود التالي:
document . cookie = "foo_10086=blabla; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/" ;
document . cookie = "foo_10086=wuawua; expires=Fri, 31 Dec 9999 23:59:59 GMT; path=/" ;
ستؤدي العبارة الأولى لتعيين ملف تعريف الارتباط إلى تشغيل حدث ملف تعريف الارتباط الجديد، وستؤدي العبارة الثانية لتعيين ملف تعريف الارتباط إلى تشغيل حدث تحديث ملف تعريف الارتباط لأن ملف تعريف الارتباط المطلوب تعيينه موجود بالفعل.
إذا أعطى مطور الواجهة الأمامية انتهاء الصلاحية قبل الوقت الحالي عند تعيين ملف تعريف الارتباط، فهذا يعني أنه يجب حذف ملف تعريف الارتباط. على سبيل المثال، إحدى الطرق الشائعة لحذف ملفات تعريف الارتباط هي:
const expires = new Date ( new Date ( ) . getTime ( ) - 1000 * 30 ) . toGMTString ( ) ;
document . cookie = "foo=; expires=" + expires + "; path=/"
عندما نقوم بتشغيل هذا الكود في وحدة التحكم، سيتم تشغيل حدث حذف ملف تعريف الارتباط:
يمكن أيضًا أن نرى مما سبق أن تشغيل حدث حذف ملف تعريف الارتباط هو فقط للكشف عن انتهاء الصلاحية، ولن يتحقق فعليًا مما إذا كان ملف تعريف الارتباط موجودًا من قبل.
كما ذكرنا سابقًا، هناك نوع حدث عند تكوين قواعد نقاط توقف ملفات تعريف الارتباط، في الواقع، يتوافق كل نوع حدث مع بت إشارة يشير إلى ما إذا كانت نقطة التوقف لهذا النوع من الأحداث قيد التشغيل أم لا، على سبيل المثال، تكون أولوية بت الإشارة هذه هي الأعلى ، إذا لم يكن الأمر كذلك، عند تشغيل نقطة توقف حذف ملف تعريف الارتباط وتشغيل حدث حذف ملف تعريف الارتباط، فإنه سيتحقق أولاً مما إذا كانت نقطة توقف حذف ملف تعريف الارتباط قيد التشغيل، وإذا تم إيقاف تشغيلها، فسيتم تجاهل الحدث ولن يتم القيام بأي محاولات أخرى يتم إجراؤها لمطابقة قواعد نقطة التوقف (التي يتم التحكم فيها بواسطة أدوات المطور) وسيظل سجل حدث الحذف هذا مطبوعًا على النظام الأساسي).
لقد أصبح الوضع الآن معقدًا للغاية، فلنستعرض عملية نقطة توقف ملفات تعريف الارتباط الصغيرة هذه:
افتراضيًا، يتم تمكين نقاط التوقف لأحداث إضافة ملفات تعريف الارتباط وأحداث تعديل ملفات تعريف الارتباط فقط:
لأنه في الظروف العادية، يمكن الخلط بين إضافة ملفات تعريف الارتباط وتحديث ملفات تعريف الارتباط، فكلاهما يعين قيمة لملف تعريف الارتباط. في معظم الحالات، لن ننتبه إلى حدث حذف ملف تعريف الارتباط، لذلك يتم تعيينه هنا. إذا لم يلبي احتياجاتك، إذا لزم الأمر، يمكنك تعديل القيمة المقابلة لـ enableEventDebugger
بنفسك.
إذا واجهت أي مشاكل أثناء الاستخدام، يمكنك تقديم ملاحظات في Issues
على GitHub، كما يمكنك تقديم ملاحظات في منطقة التعليقات في Grease Monkey Script، أو يمكنك مراسلتي عبر البريد الإلكتروني، وسأتعامل معها في أقرب وقت ممكن بعد رؤيته
بدءًا من الإصدار v0.6، تمت إضافة متغير لضبط حجم خط السجل المطبوع بواسطة هذا البرنامج النصي على وحدة التحكم، بالبكسل:
مع تكرار الإصدار، قد لا يكون موجودًا في هذا الموقع. إذا لم تتمكن من العثور عليه مرة واحدة، فابحث في الكود:
consoleLogFontSize
ثم قم بتعديل قيمة هذا المتغير.
أو كحل آخر، يمكنك الضغط باستمرار على Ctrl + عجلة الماوس في وحدة تحكم أدوات المطور للتكبير وضبط الحجم الإجمالي. هذه هي الوظيفة التي تأتي مع متصفح Chrome.
كما هو موضح في بداية هذه المقالة، يجب إدخال هذا البرنامج النصي بنجاح في بداية الصفحة وتنفيذه قبل أن ينجح الخطاف في الصفحة بأكملها المشابهة للطبقة الأولى من Accelerator، ويتم إرجاع برنامج نصي واحد فقط المنطق في الداخل :
< script >
document . cookie = 这里是一些奇奇怪怪的JS用于计算出Cookie ;
location . href = "跳转走了" ;
</ script >
يتم تعيين ملف تعريف الارتباط وإعادة توجيهه إلى صفحة جديدة على الفور، وقد لا يكون الخطاف متاحًا لهذه العملية. وهذه مشكلة في البرنامج النصي Grease Monkey. إذا كنت تصر على التثبيت، فيمكنك استخدام وكيل معلق لإدخال هذا البرنامج النصي عنوان URL هذا.
يوجد أسفل هذه الصفحة ملخص لبعض الأمثلة العملية للهندسة العكسية باستخدام هذا البرنامج النصي:
انقر فوقي للدخول إلى صفحة التنقل
تم تقسيم هذا المشروع عن: https://github.com/CC11001100/crawler-js-hook-framework-public/tree/master/001-cookie-hook#%E7%9B%91%E6%8E%A7%E5 %AE%9A%E4%BD%8Djavascript%E6%93%8D%E4%BD%9ملف تعريف الارتباط
بعد تغيير مساحة الاسم، قد يتم مسح عدد عمليات التثبيت، وقد التقطت لقطة شاشة لإحياء ذكرى ذلك. اعتبارًا من الآن (2022-7-29 21:40:01)، تجاوز عدد عمليات التثبيت 300. يبدو الأمر كذلك. كبيرة جدًا بالنسبة لأداة صغيرة في مثل هذا المجال الضيق، لم يعد الأمر سهلاً بعد الآن.
شكرًا لمستخدمي الإنترنت المتحمسين على تعليقاتهم، شكرًا لدعمكم.
انضمت الآن js-cookie-monitor-debugger-hook إلى مشروع 404 Star Chain
امسح رمز الاستجابة السريعة ضوئيًا للانضمام إلى مجموعة تبادل التكنولوجيا العكسية:
إذا انتهت صلاحية رمز الاستجابة السريعة للمجموعة، يمكنك إضافتي على WeChat الشخصي وإرسال [Reverse Group] للانضمام إليك في المجموعة:
انقر هنا أو امسح رمز الاستجابة السريعة ضوئيًا للانضمام إلى مجموعة تبادل TG: