ADBlock的實現(xiàn)原理

ADBlock的實現(xiàn)基于以下兩種情況進行攔截:

? ? ? ? 1)對URL請求的攔截,這種URL廣告一般是網(wǎng)頁中div元素嵌入了一個iframe/image元素,然后加載一個廣告鏈接或者GIF圖片。如CSDN博客網(wǎng)站:http://blog.csdn.net/cteng/article/details/42681299


? ? ? ? 右下角的一個小廣告,其dom代碼:

?http://f12.baidu.com/it/u=1775265002,2744098895&fm=76id="img_10" class="figure"style="opacity: 1;">,這是百度廣告聯(lián)盟的廣告。

? ? ? ? ?AdBlock對于頁面內(nèi)容的廣告過濾是特定于網(wǎng)站的(事先寫好過濾的filter,即過濾規(guī)則),對domain字符串的進行精確匹配。其作者用JavaScript把這些URL匹配規(guī)則映射為了正則表達式,然后再用正則表達式對目標(biāo)URL進行匹配過濾。這類似于哈希表一樣,在匹配的時候,按照相同的方法將URL,分成一些keyword,然后通過keyword去找對應(yīng)的filter,最后再匹配找到的filter。這樣就不需要遍歷規(guī)則表,大大地提高了匹配時間。

? ? ? ? ?2)對于頁面DOM嵌入廣告內(nèi)容的處理,這種一般是通過CSS3?Selector定位到這些DOM元素,然后設(shè)置其display等于none?!important。思考:對于簡單的DOM元素處理,有個問題是會出現(xiàn)ajax加載延遲,如果通過setTimeOut等幾秒后才注入執(zhí)行Js腳本,可能有些內(nèi)容尚未加載出來,清除不徹底,但是如果使用setInterval隔一段事件持續(xù)注入Js腳本的話又會影響性能。最好是在瀏覽器內(nèi)核里做一個DOM?Mutation事件監(jiān)控的daemon:如果檢測到有新的DOM節(jié)點加入,當(dāng)然必須是在DOM?Content Loaded之后,就發(fā)送一個通知給客戶端,客戶端再調(diào)度廣告屏蔽腳本的重新執(zhí)行。這樣在徹底清除廣告的同時,又降低對性能的影響。

? ? ? ?此外除了ADBlock自身過濾廣告的方式,網(wǎng)上還有以下幾個有趣的方案:

? ? ? ?1)引入?yún)f(xié)作式過濾:當(dāng)用戶標(biāo)明網(wǎng)頁中的某個元素屬于廣告,那么,瀏覽器內(nèi)核可以智能地定位到這個DOM元素,并生成一個有效的CSS?Selector,這樣就可以動態(tài)地擴展用戶的本地過濾規(guī)則庫,然后再通過上傳到云端服務(wù)器形成大數(shù)據(jù),從中挖掘出公共的廣告攔截規(guī)則庫。

? ? ? ?2)加cookies,對于有些廣告,比如網(wǎng)站的app推廣,第一次進入網(wǎng)站時會彈出來,然后叉掉后加入cookie,第二次訪問就不會出現(xiàn)了。對于這種廣告可以通過瀏覽器主動添加到cookie的方式,這樣用戶第一次訪問也不會跳出廣告。

? ? ? 3)模擬點擊,對于有些可以叉掉的廣告,而又沒有cookie,每次訪問都會出現(xiàn),可以寫腳本讓瀏覽器幫你進行網(wǎng)頁模擬點擊,直接幫點擊那個叉,但碰到網(wǎng)速不好,特別是移動端很可能出現(xiàn)廣告出現(xiàn)一下就消失的效果,用戶體驗可能不是很好。

2.ADBlock過濾規(guī)則

? ? ? ? ?從官方的easylistchina.txt規(guī)則表中(https://easylist-downloads.adblockplus.org/easylistchina.txt),總結(jié)了幾種常用規(guī)則:1)基本過濾規(guī)則,要攔截的url地址,如:http://example.com。?

? ? ? ? 2)定義例外規(guī)則,可以使用@@表示后面的是例外,不會攔截;也可以配合|使用。如:@@|http://example.com。

? ? ? ? 3)匹配網(wǎng)址開頭和結(jié)尾,使用管線符號|表示最前端或者最末端。如:阻擋以swf結(jié)尾,swf|;阻擋以http開頭的,|http。||開頭可以匹配http://、https://和http://www.等協(xié)議的開頭。

? ? ? ? 4)標(biāo)記分隔符,通常需要接受過規(guī)則的任何分隔符,分隔符可以除了字母、數(shù)字或_-.%之外的任意字符。

? ? ? ? 5)注釋,使用!作為注釋的開始,也可以在注釋的上面書寫任何想些的文案。

? ? ? ? 6)限定的特定域名,如果在域名之前有“~”,該過濾規(guī)則不適用于這個域名的頁面(需要AdBlock Plus 1.1或更高版本)。例如,~example.com##*.sponsor將適用于除了“example.com”之外的域名。

? ? ? ? 7)標(biāo)記分隔符,通常您需要接受過濾規(guī)則的任何分隔符。例如,您可能寫這樣一個規(guī)則阻擋http://example.com/和http://example.com:8000/但不能阻擋http://example.com.ar/。在這里,符號(^)用作一個分隔符。分隔符可以是除了字母、數(shù)字或者_ – . %之外的任何字符。這個地址的結(jié)尾也是作為一個分隔符,下面的例子中所有的分隔符以紅色標(biāo)記出:http:// example.com : 8000 / foo.bar ? a = 12 & b = %D1%82%D0%B5%D1%81%D1%82。所以這個地址可以通過這些過濾規(guī)則過濾^example.com^或^%D1%82%D0%B5%D1%81%D1%82^或^foo.bar^。

? ? ? ?8)CSS元素,使用##開頭,classname用.,id用#。

? ? ? ?更具體的可以參考官網(wǎng):https://adblockplus.org/zh_CN/filters

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 摘自Adblock Plus 撰寫 Adblock Plus 過濾規(guī)則AdBlock Plus 過濾規(guī)則介紹基本過...
    palmlove閱讀 12,316評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,881評論 25 709
  • 這一次葛吉夫工作坊,在開課之前我和格格說,很累。沒有休息的時間。 格格說這一次課程期間讓我完全做學(xué)員,不管會務(wù)工作...
    尚靈心閱讀 273評論 1 2
  • 1 減少過渡繪制 1.1 怎么查看是否存在過度繪制? 我們可以通過手機設(shè)置里面的開發(fā)者選項,打開Show GPU ...
    zsj1225閱讀 966評論 0 1

友情鏈接更多精彩內(nèi)容