拦截规则的种类
- Blocking filters
应用于网络级别,以决定是否应阻止请求。 - Content filters
隐藏页面上的特定元素,包括使用扩展选择器(模拟)和代码段隐藏的元素 - Exception filters
用于取消阻止某些请求或取消隐藏某些网站上的某些元素
如何加入自定义规则
- 下载并在浏览器上安装AdBlockPlus
- 单击Adblock Plus图标,然后单击右上角的齿轮图标。
- 将打开“ *Adblock Plus设置”*选项卡。
- 选择“ *高级”*选项卡,然后滚动到“ *您的自定义过滤表”*部分。
- 单击开始创建我的过滤器列表。
- 输入您的过滤器,然后点击保存。
AdBlockPlus 的广告过滤中实际上包括广告过滤和广告隐藏
广告过滤 是通过extensions机制提供的网络接口回调根据过滤规则判断对应的资源是否需要下载,如果此资源URL符合过滤规则则屏蔽此资源的下载,从而达到过滤的目的;
广告隐藏 是根据主页的host在网页中注入一段css样式,将某些id选择器和类选择器的样式设置为{ display: none !important; },从而将符合规则的元素在网页上不显示;当然,并不是所有的这些元素都能被隐藏。
广告过滤
该方法是阻止广告要请求的地址,一般为页面中嵌入的js广告脚本,来对广告地址进行请求。广告过滤就是阻塞该地址的加载。
基本过滤规则
*
通配符
过滤器:
example.com/ads/banner*
被过滤地址:
http://example.com/ads/banner123.gif
http://example.com/ads/banner4586.png
@@
表示例外规则符
如果您发现过滤器阻止了不应过滤的内容,则可以考虑使用例外规则,而不是删除或匹配过滤器。直接在正常的过滤规则前加@@
表示该过滤规则例外
过滤器:
adv
@@advice #例外过滤器
例外地址:
http://example.com/advice.html
- 管道符
|
表示过滤规则终止
Adblock Plus通常将每个过滤器视为在其开头和结尾都带有通配符*
(即,ad
和之间没有区别*ad*
),可以通过添加管道符号|
来表明终止。
过滤器:
swf|
被过滤地址:
http://example.com/swf
不被过滤地址:
http://example.com/swf/index.html
- 双管道符
||
表示域名前匹配
您可以通过在过滤器前面放置两个管道符号来实现过滤器在域名前面的匹配
过滤器:
||example.com/banner.gif
被过滤地址:
http://example.com/banner.gif
https://example.com/banner.gif
http://www.example.com/banner.gif
不被过滤地址:
http://badexample.com/banner.gif
http://gooddomain.example/analyze?http://example.com/banner.gif
- 标记分隔符
^
表示单个分隔符的占位符
有时,您可能需要在过滤器中接受任何分隔符。分隔符可以是任何东西,除了一个字母,一个数字或以下情况之一:_
,-
,.
,%
。地址的末尾也可被视作一个分隔符。
过滤器:
http://example.com^
过滤地址:
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^
- 感叹号
!
表示注释
!
开头的行会被默认为注释行,不被执行。 $
表示过滤器选项
Adblock Plus允许您指定许多选项来修改过滤器的行为。这些选项应在过滤器末尾的,美元符号$
后用逗号,
分隔。
过滤器:
/ads/*$script,match-case
在这里,/ads/*
是实际的过滤器,script
并且match-case
是其选项。
其中:
script
- 通过HTML脚本标签加载的外部脚本
match-case
- 确保过滤器仅适用于大小写匹配的请求,例如过滤器*/BannerAd.gif$match-case
可以过滤 http://example.com/BannerAd.gif,但不适用于 http://example.com/bannerad.gif
其他过滤器选项请见链接
高级过滤规则
元素隐藏
有些广告不能立即被阻止。这是因为它们作为文本嵌入在网页本身中。如果您查看网页的源代码,则可能会发现以下内容 Really cheap tofu, click here! 。您需要下载网页才能下载广告。下载网页后,您可以隐藏不想看的广告。
基于网页元素隐藏的方法有可以划分为两块:element hide 和 snippets
Element hiding被用来进行页面元素隐藏。
Snippet filter是在页面中运行一小片段代码去拦截更复杂的广告显示
基本拦截规则
元素过滤器的基本结构:
<domains><separator><body>
domains - 域名(多个域名用逗号,
分隔), 可为空
separator - 分隔器,表示domains截至和body的开始,并由不同分割器有不同含义
body - 过滤器的body
Separator的用法
Separator | Type | Body content |
---|---|---|
## | Element hiding(隐藏元素) | CSS selector (domains may be empty) |
#?# | Element hiding emulation | Extended CSS selector |
#@# | Element hiding exception(元素隐藏例外) | Selector |
#$# | Snippet filter(代码片段过滤器) | Snippet |
- 元素隐藏基本规则
内容广告html如下:
<div class="textad"> Cheapest tofu, only here and now! </div>
<div id="sponsorad"> Really cheap tofu, click here! </div>
<textad> Only here you get the best tofu! </textad>
内容过滤器:
##.testad <!--过滤第一条-->
###sponsorad <!--过滤第二条-->
##textad <!--过滤第三条-->
- 限制在特定的域名里
只想在特定某个网页上执行内容过滤器。内容过滤器:example.com##.soponsor
。可以在http://example.com/
和http://something.example.com/
上执行过滤操作,但不能在http://example.org/
上执行。
如果域名前面带有~
,则该规则不适用于该域的页面。例如,内容过滤器~example.com##.sponsor
适用于任何领域的页面,除了"example.com"。example.com,~foo.example.com##.sponsor
规则适用于"example.com"与除域"foo.example.com"的子域。
注意: 由于元素隐藏的实现方式,您只能将其限制为完整域名。您不能使用地址的任何其他部分,也不能domain代替domain.example,domain.test。 - 属性选择器
有些广告既没有ID,也没有类别属性。可以使用其他属性来隐藏这些属性。例如,##table[width="80%"]
隐藏宽度属性设置为80%的表。如果您不想指定属性的完整值,请##div[title*="adv"]
隐藏所有title等于adv的div。您还可以检查开始和属性的末尾,例如##div[title^="adv"][title$="ert"]
可以隐藏 title 开始为"adv"和结尾"ert"的div。还可以使用多个条件table[width="80%"][bgcolor="white"]
匹配宽度属性设置为80%且bgcolor属性设置为白色的table。