ADBlock的實現原理
ADBlock的實現基於以下兩種情況進行攔截:
1)對URL請求的攔截,這種URL廣告一般是網頁中div元素嵌入了一個iframe/image元素,然后加載一個廣告鏈接或者GIF圖片。如CSDN博客網站: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;">,這是百度廣告聯盟的廣告。
AdBlock對於頁面內容的廣告過濾是特定於網站的(事先寫好過濾的filter,即過濾規則),對domain字符串的進行精確匹配。其作者用JavaScript把這些URL匹配規則映射為了正則表達式,然后再用正則表達式對目標URL進行匹配過濾。這類似於哈希表一樣,在匹配的時候,按照相同的方法將URL,分成一些keyword,然后通過keyword去找對應的filter,最后再匹配找到的filter。這樣就不需要遍歷規則表,大大地提高了匹配時間。
2)對於頁面DOM嵌入廣告內容的處理,這種一般是通過CSS3 Selector定位到這些DOM元素,然后設置其display等於none !important。思考:對於簡單的DOM元素處理,有個問題是會出現ajax加載延遲,如果通過setTimeOut等幾秒后才注入執行Js腳本,可能有些內容尚未加載出來,清除不徹底,但是如果使用setInterval隔一段事件持續注入Js腳本的話又會影響性能。最好是在瀏覽器內核里做一個DOM Mutation事件監控的daemon:如果檢測到有新的DOM節點加入,當然必須是在DOM Content Loaded之后,就發送一個通知給客戶端,客戶端再調度廣告屏蔽腳本的重新執行。這樣在徹底清除廣告的同時,又降低對性能的影響。
此外除了ADBlock自身過濾廣告的方式,網上還有以下幾個有趣的方案:
1)引入協作式過濾:當用戶標明網頁中的某個元素屬於廣告,那么,瀏覽器內核可以智能地定位到這個DOM元素,並生成一個有效的CSS Selector,這樣就可以動態地擴展用戶的本地過濾規則庫,然后再通過上傳到雲端服務器形成大數據,從中挖掘出公共的廣告攔截規則庫。
2)加cookies,對於有些廣告,比如網站的app推廣,第一次進入網站時會彈出來,然后叉掉后加入cookie,第二次訪問就不會出現了。對於這種廣告可以通過瀏覽器主動添加到cookie的方式,這樣用戶第一次訪問也不會跳出廣告。
3)模擬點擊,對於有些可以叉掉的廣告,而又沒有cookie,每次訪問都會出現,可以寫腳本讓瀏覽器幫你進行網頁模擬點擊,直接幫點擊那個叉,但碰到網速不好,特別是移動端很可能出現廣告出現一下就消失的效果,用戶體驗可能不是很好。
2.ADBlock過濾規則
從官方的easylistchina.txt規則表中(https://easylist-downloads.adblockplus.org/easylistchina.txt),總結了幾種常用規則:1)基本過濾規則,要攔截的url地址,如:http://example.com。
2)定義例外規則,可以使用@@表示后面的是例外,不會攔截;也可以配合|使用。如:@@|http://example.com。
3)匹配網址開頭和結尾,使用管線符號|表示最前端或者最末端。如:阻擋以swf結尾,swf|;阻擋以http開頭的,|http。||開頭可以匹配http://、https://和http://www.等協議的開頭。
4)標記分隔符,通常需要接受過規則的任何分隔符,分隔符可以除了字母、數字或_-.%之外的任意字符。
5)注釋,使用!作為注釋的開始,也可以在注釋的上面書寫任何想些的文案。
6)限定的特定域名,如果在域名之前有“~”,該過濾規則不適用於這個域名的頁面(需要AdBlock Plus 1.1或更高版本)。例如,~example.com##*.sponsor將適用於除了“example.com”之外的域名。
7)標記分隔符,通常您需要接受過濾規則的任何分隔符。例如,您可能寫這樣一個規則阻擋http://example.com/和http://example.com:8000/但不能阻擋http://example.com.ar/。在這里,符號(^)用作一個分隔符。分隔符可以是除了字母、數字或者_ – . %之外的任何字符。這個地址的結尾也是作為一個分隔符,下面的例子中所有的分隔符以紅色標記出:http:// example.com : 8000 / foo.bar ? a = 12 & b = %D1%82%D0%B5%D1%81%D1%82。所以這個地址可以通過這些過濾規則過濾^example.com^或^%D1%82%D0%B5%D1%81%D1%82^或^foo.bar^。
8)CSS元素,使用##開頭,classname用.,id用#。
更具體的可以參考官網:https://adblockplus.org/zh_CN/filters。