ADBlock的實現原理


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM