如何为X浏览器撰写拦截规则

简介

X浏览器并不完全兼容ABP规则的写法。ABP诞生于PC时代,出于移动设备的性能考虑X浏览器没有完全实现ABP的拦截策略和规则,但是提供了简单高效的拦截策略和规则写法,基本上兼顾了性能和拦截效果。

经测试X浏览器可以在浏览页面的时候执行3W+条拦截规则而对页面的渲染并不会产生显著的影响。

X浏览器内部提供自动规则导入工具可以把大部分ABP规则导入为X浏览器所用,但并不建议直接导入ABP官方完整规则,因为ABP官方绝大多数的规则是针对PC浏览器的,加载过多规则只会带来无谓的性能消耗。

快速写法示例

www.example.com

拦截域名为www.example.com的广告主机。

/content/ads

拦截请求url目录为'/content/ads'所有请求

/runtime/js/index960.js

拦截某个主机下路径为/runtime/js/index960.js的脚本

###ad-container

移除id为"ad-container"的元素

##.ad-container

移除i类名为"ad-container"的元素

##div[title*="adv"]

移除所有属性为title并且包含"adv"字串的div元素

更多介绍及示例

和ABP一样X浏览器提供了两类不同的规则策略。"拦截策略""隐藏元素策略"你可以针对不同类型的广告选择合适的拦截策略。

另外,官方提供了一个拦截测试用例页面,你可以用这个页面测试你的拦截策略是否能够正常工作。

拦截策略

拦截策略是通过匹配广告网址的url,在网络请求之前就被拦截。这种方式针对从外部加载资源的广告比较有效,拦截性能也比较高。

"拦截策略"提供了两种匹配方式,分别是基于域名和目录的匹配方式以及基于正则的匹配方式,从性能的角度考虑你应该优先使用基于域名和目录的匹配方式撰写规则,正则的匹配方式作为补充。

基于域名和目录的匹配方式

example.com

这条策略会拦截所有顶级域名为example.com的广告网址,如: www.example.com,abc.example.com等会被拦截

/content/ads

拦截任意域名下以"/content/ads"目录开头的广告资源url,如"http://www.example.com/content/ads/ad.js","http://ad.example.com/content/ads/player/third/ad.js"都会被拦截

example.com/content/ads

只拦截域名example.com下目录以"/content/ads"目录开头的广告资源url. 如可以拦截"http://www.example.com/content/ads/ad.js"却不会拦截"http://www.myexample.com/content/ads/ad.js"

www.example.com/content/ads/ad.js
content/ads/ad.js

类似的以上规则分别用于拦截某个域名下或则任意域名下的某个具体资源.如:"http://www.example.com/content/ads/ad.js?timestep=2122323311"

基于正则的匹配方式

对于懂得正则表达式的同学可以通过正则对广告链接实现更加灵活的模式匹配,正则表达是规则约定以"--"开头。换句话说"--"后面紧跟你要写的正则表达式,见下面的示例。

--ads

这条规则会拦截所有url中包含"ads"字串的广告。如:https://www.example.com/data/myads/popup.js 以及 "http://www.example.com/data/ads.js

--\.swf$

这条规则会拦截掉所有.swf后缀的广告资源如:http://www.example.com/ad/banner.swf 但不会拦截http://www.example.com/content/swf/index.html

--ad(\d{1,2})?\.example\.com

匹配ad.example.com,ad1.example.com,ad20.example.com等ad+数字编号开头的子域

--ad\w*\.js$

匹配包含字串"ad"字样的JS脚本。如:http://www.example.com/content/sina_ad_wap.js

隐藏元素策略

对于不是通过加载外部资源和脚本的广告,换句话说,我们无法通过拦截的方式移除广告。这时候可以通过隐藏元素规则移除页面的广告元素。

隐藏元素规则的写法和ABP隐藏元素规则一样以"##"开头,后面紧跟CSS选择器语法 。下面是一些隐藏元素规则的示例。

###mybanner

隐藏id为"mybanner的元素

##.ad-container

隐藏class为"ad-container"的元素

##div[title*="adv"]

隐藏包含title属性并且其属性值含有"adv"字串的div元素

和ABP的隐藏元素规则一样,可以通过增加域名前缀来控制隐藏元素规则的作用域,如下示例

example.com###mybanner

只拦截example.com域名下id为"mybanner"的元素

规则作用域

默认情况下你写的拦截规则是对白名单除外的所有站点都会生效,有时候为了避免规则对其他站点造成误杀我们可以限定规则的作用域。通过作用域限定规则只在特定域名下才会生效。

设定规则的作用域只需在原有规则后面加上"@"然后紧跟我们需要限定的域名,下面都是含有作用域的合法规则。

ad.xxx.com@example.com
ad.xxx.com/content/ads@example.com
###mybanner@example.com

为了兼容ABP的隐藏元素规则作用域的写法,以下两种写法是等价的。

###mybanner@example.com
example.com###mybanner

(完)