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

原文地址:https://www.cnblogs.com/bonelee/p/14208610.html