关于在 2022 年去广告这件事
TL;DR
桌面端浏览器上去广告,建议使用 Firefox 浏览器;
去广告规则大致可分为网络层面的「屏蔽」行为和网页层面的「隐藏」行为,后者相对成本更高,可能会拖慢网页加载速度;
Safari 上的 Content Blocker 接口使用的语法与传统的 Adblock 语法或 host 语法并不相同,应用需要转译一次;
如果第三方应用基于 Content Blocker 语法开放相应自定义规则,能够实现类似 uBlock Origin 的效果,无论是桌面端还是移动端。
省心方案推荐。
Android 端可以尝试使用 AdGuard 客户端与代理工具共存。
为什么去广告后反而网页打开更慢了?
因为大部分时间都在使用浏览器,所以当我想给老电脑「续命」的时候,自然而然地联想到了 App Store 上各类去广告应用的宣传语,无非归结为三类:
三到五倍的速度提升;
节省流量;
提升续航。
如果真有这样的好事,那就连地球妈妈也应该好好感谢我。好!整!给浏览器上去广告插件!
但实际使用后,却发现去广告让我的浏览网页体验更加糟糕了。首先点击链接后需要等上几秒钟才能加载完毕网页,网页的架构就好像慢动作播放一样一层一层填充丰满起来;其次在加载过程中还会时不时「闪烁」一下,让我在努力诚恳工作之余怀疑浏览器是不是也要加上一个闪烁画面警告。
这段痛苦的经历让我性格发生扭曲并变态起来,半年过去,哪怕渐渐了解到去广告的原理后,我也想做一名速度狂魔,追求任何网页的极致打开速度。至于在 2022 年我又聊起去广告这件事,很大一部分要感谢 iOS 15 上 Safari 的改进,重新回到 iDevice 上后发现跟其他几个开放系统一比情况还挺不同,得继续琢磨一番。
去广告标杆 uBO 如何看待这件事
在放弃了老电脑(MBP 2016 13寸)后我整了一台类似工控机的小主机在办公室,选系统的时候正巧同事轮番辱骂 Windows 11,索性我就采用了 Linux Mint,也继续选 Firefox 作为主力浏览器。一般来说,在 Firefox 上去广告插件的表现会更好。
uBlock Origin(下简称 uBO) 官方在 2021 年 5 月也是这么说的, 原因零零碎碎读者们可以跳转查看,我个人觉得是浏览器厂商纷纷举起隐私大旗,限制了去广告类拓展能够获取到的信息(比如 webRequest.filterResponseData()
等API),而在浏览器拓展生态注重隐私保护 Firefox 或仍有余裕坚持。(类似的,AdGuard 也同样 声明 HTML filtering 只适用于各平台的独立客户端以及在 Firefox 上的浏览器拓展。)
搭配这俩利器,退休后的 MBP 2016 以孱弱龙钟之姿,打开网页的速度依旧让我满意。
我个人非常喜欢 uBO,尤其爱翻它的文档库和 Q&A,而且它的产品和文档库紧密关联,用户只要愿意稍微多了解了解,很快就能上手这款利器,同时也对去广告这件事有更多理解。基于它的一些文档库内容和我个人的使用经验,先列一些背景知识:
uBO 本质上并不只是单纯去广告,它其实能做的其实更多,基本可以自定义用户打开的网页可以被精简到何种程度,这也是为什么我认为它是标杆,或者说天花板;
去广告插件的宣传用语并不完全正确:去广告势必会带来性能影响,胡乱订阅一堆规则的话,打开网页明显变慢不说,还会更加耗电和消耗性能;
去广告的规则有不同的种类,下面会详细展开;
广告与去广告,道魔对弈,广告是很难完全杀干净的;
按照 uBO 的 这篇文档 解释,我们可以先粗暴简单地将去广告的技术手段大致分为两种形式:「捂住嘴」(network filters)和「障眼法」(cosmetic filters):前者是在网络层面进行屏蔽,在网站准备大喊向服务器请求广告之前就先被广告拦截器给捂住了;后者则是从「视觉」层面进行屏蔽,广告确实进入到了浏览器,只是在将网页呈现给用户之时,广告拦截器把有广告的地方盖住。「障眼法」中更有甚者,广告都已经露出来了,会让页面闪烁着慌慌张张去掉广告,用户感知会比较非常难受。
「障眼法」方式去广告,其实并不能真正保护用户隐私,或许也不太能省下多少流量,反而浏览器和插件为了「粉饰太平」而动用更多算力,在成本上会高一些。针对「去广告反而消耗更多资源」这一事实和现象,这里其实就涉及到去广告的「投入产出比」:屏蔽掉那些玩意儿省下来的电是不是真的就比插件用掉的电多呢?另一个辅助理解的例子:现阶段的手机厂商花费大量算力尽可能让屏幕刷新率降低,但那些省下来的电真的能够弥补花掉的算力吗?
除非这个网页的广告真的很作妖,不光有大堆大体积的 GIF ,还有闪来闪去分散注意力的动图,那可能不展示他们更省心省电一些。uBO 给出的建议是禁用「障眼法」式的去广告手段,大幅减少去广告的性能开支,只在真正有必要的作妖网站上使用。
这种类型的去广告规则其实挺不少,以我胡乱订阅的去广告规则为例,network filters 大概有 122K 条,cosmetic filters 大概有 107K 条,禁用掉这些后可能还是会看到一些广告、或是看到去掉广告后留下的页面空白,但打开网页的速度大大提升了,同时隐私也得到了保护。
Tips:同时从我的经验来看,如今去广告工具都已经分化出了不同的类目:广告、追踪器、评论区、社交插件等。一般来说,去除追踪器的去广告规则基本都是network filters,评论区、社交插件、烦人弹窗等大多依赖 cosmetic filters 障眼法。
(是的,开启相关去评论规则后你甚至可以恢复少数派评论区的核平。)
如果想更快一步……?
一般来说,移动端打开网页的速度不会比桌面端差,5G 网络普及、流量资费大幅下降的今天,手机或平板的性能也扶摇直上。除非你像我一样在深圳使用联通3G经常遭遇网络不佳的情况,或是想在去广告的基础上追求极致的网页打开速度,可能就要开始割舍网页的完整性了。有审美追求、在意网页完整性的读者朋友可以跳过这一小节,因为有缓存机制的帮忙,一般来说并不需要做到这一步。
牺牲掉网页的一部分特性、精简网页是非常痛苦的一步,对于大部分用户而言,去掉广告后的网页应该就是想要获取到的完整网页了。再继续割舍,我会选 web fonts 这个类目,它可以简单理解为网页上需要远程下载的字体。每个网站都想有与众不同的设计风格,这些具有设计感的字体就是其中一部分,往往并没有内置在我们的设备中,就只能在加载网页之时一并下载。摒弃掉这些的话虽然字体会变得平淡无奇,但一般来说并不影响正常阅读。
这个技巧是我阅读一款内测中的浏览器 Orion 的 FAQ 文档中得知的,在 Any "pro tips" for Orion users? 一节中提到,屏蔽 web fonts 在某些常用网站上能够减少 70% 的网络流量使用。以 Apple 官网为例,减少的 Web Fonts 居然有 153 项,以 9to5mac.com 为例,也有 50 项之多,而字体显示并无出现异常。
wuli 派派官网也有 14 项,少了一些可爱图标少了一些风味,而且似乎出了一点问题,可以发现页面上多出来些许口码:
如果你想在 uBO 上也达成类似效果,可直接在设置页面中勾选 Block remote fonts 屏蔽远程/网络字体,想针对某个网站的话直接在拓展面板里点击「Aa」图标。如果想再更细分一下第一方或第三方的话,也可在 uBO 设置中的 My rules 动态规则中添加一条 *$font,third-party
。
Tips:所谓「第一方」「第三方」其实与我们日常接触的概念基本一致,比方说在少数派网站上,来自 Google 的字体就是「第三方」字体。
Android 端因为相对开放,部分浏览器(比如开源的 icereaven 或 kiwi)就能直接使用完整版 uBO,暂且不聊。
在 iOS 上,我能想到比较方便快捷的应用是……Firefox Focus。这个单标签浏览器主打隐私,亮点是同时也能整合到 Safari 中成为 Content Blocker 内容屏蔽器,只需要开启应用并在设置中打开 Block Web Fonts 的开关,并在 Safari 设置中开启对应屏蔽器即可。这款应用免费且可在国区商店安装使用,同样开源。
按图索骥:在 iOS 上的复刻之路
是的,前几年我深耕 Android 搞机,2021 年脱粉 Google、偏爱开源、转投三星,同时也因为 Safari 和 Shortcuts 再一次使用 iDevices。虽然系统限制多多,在其中折腾颇有自缚之感,不过得益于丰富活跃的应用生态,这条复刻之路走得艰难也算是达成目标。这里更多阐述我的个人探索,想直接看应用推荐或并不使用 Safari 的朋友可以跳过这一部分。
iOS 上的移动端 Safari 布局很早,在 iOS 9 之时就已经推出了 Content Blocker 功能,在活跃的应用生态加持下第三方拦截器遍地开花,少数派当时甚至还横评了做得比较突出的 AdGuard 与 1Blocker (见 iOS 上内容拦截器双雄 | Best Of - 少数派,真巧这两款应用到今天还活跃),到了当下最新的 iOS 15,这项功能则被整合进了 Extensions 也就是浏览器拓展里,同时单个 Blocker 的规则条数也从之前的 5 万条提升到了 15 万条。
同样出于保护用户隐私的考虑,即便是新推出的浏览器拓展,Safari 也没有开放 webRequest.filterResponseData()
这一 API(这意味着 uBO 很难移植);Content Blocker 的设计也遵循了这个原则,相关第三方应用只是将去广告规则告知 Safari,但用户浏览网页时执行去广告动作的主体依然是 Safari。这样一来,去广告的性能得到最大保证的同时,第三方应用更无从得知用户具体访问了什么网站,一如前文提到的浏览器「隐私大旗」,这种做法可能渐渐会成为日后主流。
这个做法很妙,但 iOS 自起轮子的不便之处就是和传统的去广告语法或 host 语法并不兼容,像 AdGuard 等老牌应用必须先将已有的去广告规则「转译」成 Safari 能听懂的格式,才能继续写入。优点是过往的规则依旧能够继续使用,缺点是每一次改动或更新规则都需要设备算上一会。
如果你好奇「转译」的结果,我们可以试着在 AdGuard iOS 版本添加上一条自定义规则,以 ||cdn.sspai.com/article/d4f2cd47-cd22-ffb2-7143-1a6eb9b4a171.jpeg$image
这条规则为例好了,添加后等待转换完成后,在 Support 内导出 logs。很怪,是个压缩包,解压后在 CB jsons 文件夹中找到cb_custom.json 文件,得到以下内容:
[
{
"trigger":{
"url-filter":"^[htpsw]+:\\/\\/([a-z0-9-]+\\.)?cdn\\.sspai\\.com\\/article\\/d4f2cd47-cd22-ffb2-7143-1a6eb9b4a171\\.jpeg",
"resource-type":[
"image"
]
},
"action":{
"type":"block"
}
}
]
很形象,分成了 trigger 触发器和 action 两个部分去陈述去广告行为,而且可以添加上注入 url-filter、resource-type 等子类筛选判定,也能看到简洁易懂的通行 adblock 语法被正则转化成扭曲的一长段内容。结合 Ka-Block! 的开源文件与 Safari 的 Content Blocker 官方文档,我们似乎也能一窥 Content Blocker 的能力边界,感兴趣的读者可以自行跳转查看。为辅助下文理解,我罗列一些摘要:
基本模式就是上文提到的 trigger——action,也就是触发器和触发后的动作;
Trigger 会用简化后的正则表达式来匹配 url,另外可以使用
if-domain
或unless-domain
字段来表达所作用的网站,或是用resource-type
和load-type
动态针对某些网页资源类型(比如上文提到的 font 就是一种 resource-type)。Action 的几个动作都比较好理解,
css-display-none
来隐藏画面元素、block
来阻止网页内容加载,比较先进地拥有block-cookies
和make-https
,不过这俩一般都已经集成到浏览器的基本功能中全局生效。
以上条规则为例,就是在正则匹配到 ^[htpsw]+:\\/\\/([a-z0-9-]+\\.)?cdn\\.sspai\\.com\\/article\\/d4f2cd47-cd22-ffb2-7143-1a6eb9b4a171\\.jpeg
这样的链接时,针对 image 图像类型的资源进行屏蔽。
以前文提到的 Firefox Focus 在所有网页屏蔽网络字体的功能为例,trigger 中的 url-filter
可以用 .*
指代所有网页,随后指定 resource-type
为 font 即可,如果想针对第三方远程字体进行屏蔽的话,额外指定一条 load-type
为 third-party
就行。翻找 Firefox Focus iOS 的开源文档,的确就超简单的 就这一条……
探索到这里,作为一名有点好奇心的用户已经感到满足,接下来就是分析自己的需求,以及寻找对应的工具了:
能够指定阻止加载某类资源类型;
能够指定只加载网络规则,也就是 action 中只有
block
,没有css-display-none
;最好能自己带上一些规则集。
为满足前两点,基本就确定了目标工具必须采用 Safari 原生接口,而不是编写通用 adblock 规则再通过机器转译。一番折腾下来,我自己都没想到,我的梦中之选居然是一款从没见过、也没见人推荐过的不出名的小工具。
Tips:前文提过的 Ka-Block! 在 README 文档中列出了它的信条:
Block most ads and trackers.
Never contact a server.
Never slow down a page.
最后一条,在去广告的同时不拖慢网络加载速度,它开源的的 json 文件 中只有
block
动作,没有css-display-none
动作。
iOS 去广告应用推荐
前文提到的 iOS 去广告双雄之一的 1Blocker 就是从 Apple 生态上从零做起的,没有历史包袱,也开放用户自定义基于原生接口的规则,本身也附带了一些整理好的不同类目规则,完美符合我的三点需求,我就几乎确定是它了,但我最后却没有选择它,它的卡顿、笨重的 UI、开启 iCloud 同步的情况无法改动规则、写入规则时屡屡报错需要重装应用……明白我的意思了吧!
省心之选
第一个省心之选就是什么都不装!新版本的 Safari 联手鸭鸭走的改良版规则已经足以应对大部分的隐私保护需求,而且因为比较保守也基本不会出现什么问题。不过 Safari 的默认设置可能需要修改一下,比如关闭 Preload Top Hit 预载。另一个是大陆用户的注意事项,如果开启 Fraudulent Website Warning 诈骗网站预警,Safari 会调用腾讯的数据库,虽然不会将具体网址发送过去,但也有泄露 IP 风险。
我推荐的第二个应用是 Wipr,国区售价 12 元人民币,从 其文档 来看包含 Easylist China 规则,在关于界面中点击「Wipr」可以看到支持的地域性规则。一切都自动搞定没有任何开关,不需要任何用户学习成本。附带的 Wipr Extra 插件还可以去除 Youtube 类的广告,有需要的话也可以开启。可以说最省心且一劳永逸的方法就是花这 12 块钱,我会推荐给亲朋好友。
开源/免费之选
什么!去广告还要花钱!不可以!凭什么!的确已经有不少优秀的免费去广告工具,如果能够满足需求的话真没必要花钱。开源工具我推荐 Ka-Block! 、Firefox Focus 以及 Hush Nag Blocker 三款,分别对应网络层去广告、(可选)禁用 web fonts 以及关掉烦人的 cookies 弹窗。Firefox 应用用的是 Disconnect 的相关规则,因为都是开源实现,其实具体规则都可以去对应仓库寻找。
Tips:如果有跑油猴脚本的需求,可以考虑 Userscripts;针对搜索引擎内容农场的情况,也推荐使用 uBlacklist。
这几款就算互相搭配,针对中国大陆的去广告效果可能仍不理想,这里推荐 AdGuard 中添加相关地域性规则支持,AdGuard 官方规则、cjxlist 或者 Easylist China 等都可以,免费版就够用。AdGuard 虽然是商业公司的产品,但是 文档知识库 资料齐全、还把自己维护的规则开源,是我个人比较信赖的老牌产品,可惜的是印象里好像国区下架了,ABP for Safari 可能可以将就一下。
我的折腾之选
我最后的决定就是只使用 Roadblock 这款去广告工具。令人惊讶的是,它在中国区 App Store 仅有 1.5 分。
它同样符合我的三点需求,可以视作是 1Blocker 的简洁稳定版,免费下载可以屏蔽广告和追踪器,但解锁全部功能只需要 1.99 美元,也就是 12 元人民币。我几乎就是(怀着绝望的心情)搜索 adblock 关键字在 App Store 往下翻了好几页才碰到的它,瞥到应用商店预览图里面的 Block Ads 与 Hide Ads 的区分,我就几乎确信它是我要找的那一款,「哟,挺懂行啊。」
自带 Block 类规则与 Hide 类规则的区分,Annoyances 一项也是如此;
自带对不同网页资源加载的开关,虽然少了 font 这一项,但是自定义规则完全开放,可以自由设定;
最重要的一点:应用稳定、iCloud 同步稳定,甚至是在 Safari 稳定性出现状况的 iOS 15.4 Beta 上。
这不就是由着我瞎搞,我不光屏蔽了第一方和第三方的字体文件与 SVG 文件,还把大部分网站的第三方 JS 脚本与视频屏蔽了。哦对了,一个意外发现是它也同样自带了地域性规则,还包含中文,入口比较深要多点几下。
Anyway,这款应用是我给自己找的,而我的情形很特殊,并不建议跟着购买。找工具一定要从自己的实际需求出发。
Extra
什么是 DNS 过滤?
一个域名并不能被直接访问,需要先将其转换为 IP 地址,这就是 DNS。
如果频繁接触去广告工具的话,可能对 AdGuard Home 或者 DNS 过滤这些名词比较熟悉,比如说部分去广告应用会建立一个 VPN 信道接管本机的大部分流量。这些 「VPN」并不真的通向外界的某个服务器,只是在去广告应用那边转了一圈进行过滤,基本非 root 方式全局去广告都会用到这种方式。
DNS 过滤也是在网络层面进行操作,有点类似于浏览器去广告中的网络屏蔽规则,只不过因为 DNS 是我们日常发起网络请求中比较早的一步,相比起浏览器处理这一段各有优劣:
DNS 过滤可以是全局生效的,而不仅仅针对某款浏览器;
DNS 过滤可以识别 CNAME-cloaked tracking 类的追踪,浏览器端则不行;
DNS 过滤在屏蔽上有先手优势,确实可以节省一些流量和电量;
DNS 过滤无法插手浏览器渲染,因此去掉广告后会留下页面空白。
DNS 过滤比较粗略,很难针对不同场景细分,个人建议可以和浏览器去广告互相搭配使用,比如我的家中路由器和公司的主机上都有部署 AdGuard Home。而且 AdGuard 的独立客户端也基本自带这项功能,只是大陆语境下很难做到不和代理类工具冲突。
去广告规则也要「小而美」吗?
当我打开那些规则集的时候,我惊讶地发现其实大部分的网站我可能从没见过,或者无论如何也不会频繁打开(比如说 zhuwang.cc 或是瑞星官网),是不是需要自己写规则呢?理想情况下自然是自己写的最适合自己,直接订阅大而全也不会出什么大问题,有一段时间我甚至直接在 AdGuard Home 上放下了 30 万条规则。
如果你想要寻找「小而美」的去广告规则,可以:
使用 AdGuard 官方的 DNS filter,本身就是多个类目的规则集合并后只留下适用于 DNS 类型的网络屏蔽规则。在我使用 AdGuard Home 的过程中命中率相当高。
在 Github 上搜索寻找中文用户分享的自制规则,基本不会有什么冷门的奇怪网站。比如 这款规则 的注释就很明晰。
如果在使用 AdGuard Home 的话,可以把自己的网络日志导出,过滤出命中的规则并进行集合,因为语法通用,这些集合出来的规则也能用在浏览器上支持 Adblock 语法的拓展上。我集合了 7 天的日志,去重后发现只命中了几十万规则中的 257 条。
Android 端全局去广告/代理共存
非 root 实现的话,其实这一部分直接看 ChrAlpha 的 这篇博客文章 就行。
简单来说,AdGuard 客户端自带一个 Proxy 功能,只要你使用的代理工具支持「不开 VPN 服务接管全局流量,但是可以在设备本地开放端口允许接入」就可以,也就是通常会标注的 Proxy Only 选项,目前 SagerNet、Clash、Shadowsocks 等基本都支持。只要记住 http/socks5 端口,在AdGuard Proxy 功能中填写 127.0.0.1 和对应端口,即可实现共存。我和博文中不一样的一点是没有手动在 Clash 中覆写 DNS 地址,也可以使用配置内的 DNS 正常使用。其余解除代理回环等注意事项可以查看博文。
不过这个共存方式遇到的问题就是似乎没有办法代理 Google Play 的流量,打开 Google Play 就是无法连接,目前还没有找到解决方法,但其余网页打开还是OK。如果实在介意的话,就只能参考下一节在代理工具中加入去广告规则。
已经找到问题:AdGuard 这种代理模式有个限制,应用的流量必须先被 AdGuard 接管,才能继续被 AdGuard 所对接的代理接管。而打开 AdGuard 的 App Management 会发现它给部分关键应用白名单了,其中就包括了 Google Play Store。这里我们打开 AdGuard protection 就能解决问题了,如果担心出现意外,可以把 Ad bloking 关闭。至此,非 Root 下去广告与代理共存的问题基本解决。
另一种实现方式是在过滤模式选项中 AdGuard 化身本地 http 代理,可以加在 Wi-Fi 设置中的 http 代理中,也可以正常使用。root 方式的话,直接可以客户端内选择本地自动 http 代理。
Tips:如果在使用 AdGuard android 客户端的过程中觉得网页打开速度太慢,可以考虑关闭 High quality filtering method 选项,然后就是关闭 Stealth Mode、Browsing security 等比较影响速度的功能。
iOS 端代理和全局去广告
iOS 在系统级别其实给予了第三方应用介入 DNS 的接口,但是比较尴尬的是这个接口的优先可能还要高于代理工具,用国外 DNS 境内访问就慢,用境内 DNS 的话就基本无法访问国外网站。
所以目前也是有接口也没办法善加利用,最省心的其实还是在各类代理工具中塞入去广告规则。iOS Network Extension 在 iOS 14 限制使用 15MB RAM,在 iOS 15+ 限制使用 50MB RAM,因此如果想塞去广告规则话建议先阅读各类工具的官方手册给出的建议,才能高效匹配截杀广告。如 Surge 就 说明 大量广告屏蔽类规则应该使用 DOMAIN-SET 实现。比如:
DOMAIN-SET,https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Surge/Advertising/Advertising_Domain.list,REJECT
DOMAIN-SET,https://raw.githubusercontent.com/NobyDa/ND-AD/master/Surge/AD_Block.txt,REJECT
类似的去广告域名整理有相当多,一般来说都专门大集合,只要任选其一添加在 Rules 内就行。