Adblock Plus 过滤规则
(2015-12-06 22:40:16)分类: 编程 |
撰写 Adblock Plus 过滤规则
当前的 Adblock Plus 版本允许您通过许多不同的方法来优化过滤规则。本文档就是告诉您如何做。
声明:这里给出的过滤规则只是示例,不一定能直接使用。
AdBlock Plus 过滤规则介绍
本章节描述的过滤规则属性,对偶尔才写过滤规则的用户来说足矣。
基本过滤规则
最简单的过滤规则当然就是您想阻挡的横幅广告地址,但是这些地址常常会在您每次打开页面时改变。例如:
http://example.com/ads/banner123.gif
,其中 123
是一个随机数字。在这里阻挡整个图片地址是没用的,您需要创建一条更通用的过滤规则 —— 如
http://example.com/ads/banner*.gif
。或者更为通用一些的,如
http://example.com/adsadnetworkadsadsBanner
会阻挡 http://example.com/BannerAd.gif
但不会阻挡
http://example.com/bannerad.gif
。
collapse
— 这个选项将覆盖全局"隐藏已屏蔽元素的占位符"选项,并确保过滤规则总是隐藏这些元素。类似地, ~collapse
选项将确保过滤规则不隐藏这些元素。donottrack
—— 对有该选项的阻挡规则匹配到且有该选项的例外规则未匹配到的地址会发送一个 Do-Not-Track 头 (需要Adblock Plus 1.3.5 或更高版本)。 为了向后兼容,使用此选项时建议使用矛盾的组合类型选项,防止此规则在早期版本的 Adblock Plus 中阻挡任何东西:*$donottrack,image,~image
使用正则表达式
如果您想更好地控制您的过滤规则,什么匹配,什么不匹配,您可以使用正则表达式。例如过滤规则
/banner\d+/
会匹配 banner123
和
banner321
而不会匹配 banners
。 您可以查看正则表达式的文档来学习如何写正则表达式。
注: 由于性能原因,建议尽可能避免使用正则表达式。
元素隐藏
基本规则
有时您可能会发现无法阻挡某些内嵌在网页中的文字广告。如果查看源码的话,可能发现类似这样的代码:
Only here you get the best tofu!
因为您必须下载页面的内容,所以您也必须下载这些广告。对于这种情况,您可以做的就是把这些广告藏起来,这样您就不会看到他们了。这也就是元素隐藏的意义所在。
上面代码中的第一则广告是在一个 class 属性为“textad”的 div 容器内。过滤规则
##div.textad
。 这里的 ##
表明这是一条元素隐藏规则,剩下的就是定义需要隐藏元素的选择器,同样的,您可以通过他们的 id 属性来隐藏
##div#sponsorad
会隐藏第二个广告。您不需要指定元素的名称, 过滤规则
##*#sponsorad
同样也可以。您也可以仅指定要阻挡的元素名称来隐藏,例如:##textad
可以隐藏第三则广告。
在不查看页面源码的情况下,Element Hiding Helper 扩展 可以帮助选择正确的元素并写出相应的规则。基础的HTML知识还是很有用的。
注:元素隐藏规则与普通过滤规则的工作方式有很大的差别。元素隐藏规则不支持通配符。
限定在特定域名的规则
通常您只想要隐藏特定网站的特定广告,而不希望规则会作用于其他网站。例如,过滤规则
##*.sponsor
可能会把某些网站的有效代码也隐藏了。但如果你把它写成
example.com##*.sponsor
就只会在
http://example.com/
和
http://something.example.com/
生效了,而不是
http://example.org/
。
你也可以指定多个域名——只要用逗号(,)分隔即可:domain1.example,domain2.example,domain3.example##*.sponsor
。
如果在域名之前有 "~",该过滤规则不适用于这个域名的页面(需要 AdBlock Plus
1.1或更高版本)。例如, ~example.com##*.sponsor
将适用于除了
"example.com"
之外的域名,example.com,~foo.example.com##*.sponsor
适用于
"example.com" 但不适用于 "foo.example.com" 子域名。
注:由于元素隐藏实现方式的关系,您只可以将隐藏规则限定在完整的域名。您不能使用网址的其他部份,也不可用
domain
代替 domain.example,domain.test
。
注: 限定域名的元素隐藏规则也可用来隐藏浏览器的使用界面。例如,过滤规则
browser##menuitem#javascriptConsole
会隐藏 Firefox 工具菜单中的
JavaScript 控制台。
属性选择符
一些广告隐藏起来并不容易——它们广告不仅没有 id 也没有 class 属性。您可以使用其他属性来隐藏,例如
##table[width="80%"]
可以隐藏 width 属性值为 80% 的表格元素。
如果您不想指定属性的完整值,##div[title*="adv"]
会隐藏所有 title 属性包含 adv
字符的 div 元素。您还可以检查属性的开始和结束字符,例如
##div[title^="adv"][title$="ert"]
会隐藏 titile 属性以 adv
开始并且以 ert 结束的 div 元素。正如您所见,你可以使用多个条件 ——
table[width="80%"][bgcolor="white"]
会匹配到 width 属性为
80%、bgcolor 属性为 white 的表格元素。
高级选择符
通常情况下,Firefox 支持的 CSS 选择器都可用于元素隐藏。例如:下面的过滤规则会隐藏 class 的属性为
adheader 的 div 元素相邻的元素: ##div.adheader + *
。完整的 CSS
列表请查看 W3C CSS 规范
(Firefox 目前并没有支持所有的选择器)。
注:这个功能只是给高级用户使用的,您可以很舒服地通过 CSS 选择符去使用它。Adblock Plus 无法检查您添加的选择器的语法是否正确,如果您使用无效的 CSS 语法,可能会破坏其它已有的有效过滤规则。建议使用 JavaScript 控制台检查是否有 CSS 错误。
例外规则
例外规则的作用是在特定域名中禁用已有的规则。 这对于那些与其他订阅组配合使用,且无法更改该订阅组的作者来说较为有用。
例如,如要让 ##div.textad
规则禁用于
example.com
,可以使用
example.com#@#div.textad
。 这条组合规则就等同于
~example.com##div.textad
。
建议您仅在无法调整全局隐藏规则时才使用例外规则,否则请首选限定在特定域名的规则。
简单元素隐藏语法
Adblock Plus 支持简单元素隐藏语法(例如:
#div(id=foo)
)只是为了向后兼容性。使用这个语法是不好的,CSS
选择器才是首选。对这个语法的支持可能在以后的某个时间就不支持了。
Generic / Specific filters
With the $generichide
and
$genericblock
filter options the distinction between
generic and specific filters becomes important.
We classify a filter to be specific if it
matches one or more domains or matches a sitekey. If a filter has
no domains specified (or only domain exceptions) and no sitekey
then it counts as generic. For example,
example.com##div.textad
is a specific filter, whereas
both ##div.textad
and
~example.com##div.textad
are generic.
Note that with blocking rules the domain must be specified under
the $domain option for them to be considered specific. For example,
||example.com^
is considered generic whereas
*/ads/*$domain=example.com
is site-specific.
在服务器上实施 sitekey
若想完成一个采用 sitekey
限制的过滤规则,一个网页需要返回 Base64 编码的公钥版本和 Adblock Plus 可以验证的签名。目前来说,这需要在
HTTP 相应头中包含(X-Adblock-Key:
abcdpublickeydcba_abcdsignaturedcba
)及 document 的根标签中()。
首先,您需要创建一个专用的 RSA 密钥(最好是 512 位以保证较低传输负担)和一个公钥的 DER 表示。
创建签名使用的数据是一个请求变量的连续列表(即 URI、Host 和 User Agent),分隔符是
NUL
字符,即“\0”。举例来说:
/index.html?q=foo\0www.example.com\0Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0
最后,使用 SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE 签名算法生成此字符串的签名(是使用 OpenSSL 时的默认值)。