Safari 里的 YouTube 广告:现在您看它们,将来是否还会有呢?

最近,我们不断收到越来越多的投诉。不少用户投诉 iOS 上的 YouTube 里一直弹出广告。最重要的是,这些投诉都针对通过 Safari 浏览器观看 YouTube。最后我们发现,YouTube 为登录的用户推出新的显示广告的算法。该新算法对广告拦截造成不良影响。实际上,目前 YouTube 投放插片广告的方式与一般影片的没有什么区别。

我们找到了可以解决 iOS 上 Safari 浏览器的问题,但是与其他平台和浏览器相比,此方法待改善。简单地说,我们屏蔽的是短视频(在 99.99% 下是广告)。

更新:我们找到了更好的解决方案!在我们的新一篇文章,快来看看如何屏蔽 Safari 中的 YouTube 广告。

不过,我们使用该方法影响用户观看视频的体验,播放视频时存在明显可见的延迟,或者占位符替换要播放广告的位置。

短文版

几个月前,YouTube 开始用一样的算法方式将广告显示为 Chrome 的用户。当时,我们解决此问题不费吹灰之力。那么,Safari 不同在哪呢? 很可惜的是, Safari 内容拦截与其他浏览器的强力内容拦截器相比受不少限制。从 2015 年 Safari 内容拦截 API 第一次被推出后, 它几乎没有改变。

根据您的 OS,以下是您的解决方案:

  • iOS/iPadOS:在这种情况下,目前的解决方案是现在可提供的最佳解决方法。当苹果公司做出“脱胎换骨”的改变前,我们没其他办法只能接受现状(以下可以查找更多详情)。
  • 在 macOS 上
    • 如您使用 AdGuard Mac 版的独立 App,您不会感到任何影响。很可能一开始您就没看到这些广告。

    • 如您使用适用于 Safari 的 AdGuard,请确认“高级拦截”扩展被启用(Safari > 设置 > Adguard 高级拦截)。该扩展添加了一些 Safari 内容拦截缺乏的功能。不过,该扩展无法移转到 iOS/iPadOS。

在内容拦截方面上,如 Safari 依旧想做到“与时俱进”,那么还是有一些方面需要改进。我们全天候乐于提供帮助以及所需要的专业知识。事实上,近几年我们已提交了大量的 Bug 报告及功能请求。

现在,如您想多了解关于 Safari 内容拦截的问题,请往下看。以下的内容可能需要您具有一定的技术知识储备。因此,如您对专业技术信息不太感兴趣,可以直接跳转到最后一章。

Safari 内容拦截的运作原理

谈 Safari 限制以及 AdGuard 如何改善它们的方式前,让我们先了解一下 Safari 内容拦截的工作原理到底是什么。

基本上,内容拦截器 是指在另一个进程中运行的 App 插件。该插件的唯一个目标是提供 JSON 文件(实际上,可以说该插件就是JSON 文件 )。JSON 文件则包括内容拦截的规则。后来 Safari 使用这些规则来屏蔽广告和其他元素。

该图显示内容拦截器在 Safari 中运作的原理

每一个内容拦截规则是包含两个部分的 JSON 对象。这些部分是"trigger"(触发器) 和 "action"(动作)。

触发器定义某一个规则要应用于哪一个请求。动作部分顾名思义,定义内容拦截器对匹配的请求进行的操作。

Safari 中拦截规则的格式

除了上述的规则以外,还有修饰规则。当页面元素匹配特定的 CSS 选择器时,修饰规则就会隐藏它们:

Safari 中的修饰规则

我们刚才评论了两个操作方式:“拦截请求”以及“隐藏元素”。但除了这两个以外,还有几个:

  • 禁用其他匹配规则
  • 阻止 Cookie
  • 将连接升级到 HTTPS

既然现在我们了解了 Safari 内容拦截是什么以及是如何运作的,就让我们看看其限制。

限制

这里我们为大家举例最打扰我们(广告拦截社区)的限制列表。它们之间有些限制可以在一定程度下被减轻。不过,“减轻”是指替代办法,并不是恰当的解决方法。

  • 无调试工具
  • 不同语法(可以部分解决)
  • 编译速度慢
  • 每一个内容拦截器只能包含5万条规则(最大的疼苦,但我们已学会与之共存)
  • 正则表达式的支持受限制
  • 对 Safari 团队而言,内容拦截拥有低优先级

让我们逐步查看每一个问题。

无调试工具

我们从基础但依旧没有解决方案的问题开始。为了创建有效的过滤规则,开发人员需要调试它们。为了调试它们,开发人员需要用到调试工具。然而,目前,Safari 内容拦截没有任何调试工具。唯一个可帮助过滤器开发人员的工具是浏览器的控制台。在控制台上开发人员能查看哪一个请求被屏蔽了。检测哪些规则阻止哪些不同请求是不切实际的。此外,我们也没有调试修饰规则的合适方式。

Safari 中的浏览器控制台

由于缺乏相应的工具,因此开发用于 Safari 的过滤器是较无效的流程。除此之外,说到创建过滤规则,很多过滤器的开发人员更愿意选择其他浏览器,而不是 Safari。如此一来,Safari 的过滤器列表的规则数量与其他浏览器相比就显得极少。

不同语法

AdGuard 过滤器、EasyList 和 uBlock 过滤器都基于原来的 Adblock Plus 核心语法。当然,它们也扩充了语法,但用于所有主流内容拦截器的“核心”部分保持不变。

常用过滤规则的“解剖”

正如您在上方显示的图中所看到的,Safari 拦截规则与核心语法有云泥之别。而这就是个问题。我们不想创建特殊 “Safari 专用”的过滤列表。请别误会我们的意思。这并不是说我们想借机偷懒,问题在于, Safari 无法提供可用的工具帮我们创建这种列表。

我们想要的是,有机会使用美好的常用过滤器列表,就像 AdGuard 过滤器和 EasyList。

我们提出的解决方案

最基本的解决方法是将我们的规则自动转换成 Safari 内容拦截规则。其实,这就是 AdGuard 在您的设备上正在进行的流程。

Safari 语法问题的可能解答

您一定能想到,这是不让广告拦截器变得更好的额外工作。

编译速度慢

Safari 将每一个内容拦截器的 JSON 格式转换成 Trie 树。这样,可以加快查询速度。

但是,构建 Trie 树的速度很慢。假如,您可以查看分析工具的输出效果:在新 MacBook Pro 上编译包含 3 万多条规则(对过滤器来说,是较合适的大小)的 JSON 待两秒多钟。

Safari 中的编译时间

非常之慢。让我们来与其他平台上的内容拦截器相比一下。适用于安卓的 AdGuard 应用程序只需要不到一秒钟,即可分析并编译包含超过10万条规则的列表。最明显的区别在于,安卓系统 App 使用的语法比正则表达式相比更简单。虽然该语法很死板,不过,这种语法表达法方式根据匹配网址被优化了。

用户无法看到所有的背景。这些问题不会直接影响他们。但是,上述的问题非常重要,因为由于它,产生了下一个问题。

5万条规则限制

现在我们知道,编译流程较慢,因此理解下一个“限制问题”会变得很简单。
一个内容拦截器无法包含超过5万条规则。这是 Safari 硬编码的限制。苹果开发人员确认,这种限制的主要原因是编译的速度很慢。由于新设备更快,因此他们会考虑增加一点儿规则数量,但是这个不会奇迹般地解决所有的问题。

只要规则使用保持基于正规表达式,我们就不会有加固改进的余地。还有,千万不要让表面上看起来较大的数量欺骗了您。看看这个例子,AdGuard 基础过滤器 + EasyList 一共包含10万条规则。这只是两个过滤器。平时其他平台的用户会同时开启5-10个或更多的过滤器。

我们提出的解决方案

实际上,有好几个解决方法。不幸的是,即使您连一起使用所有的方法,您还是无法达到想要的结果。尽管如此,它们也绝非一文不值。

过滤器优化

作为过滤器开发人员我们试图将我们的 Safari 特定过滤器优化。我们所做的是,将“元素隐藏”的相似规则合并成一个。在下面的例子,您可以看到如何将五个不同规则合并成两个:

Safari 中的过滤器优化

虽然此方法会有很多帮助,但这还是不够好用。

移除过时的规则

另一个我们所提的解决方法是,将过时及不常用的规则从这些已优化的过滤器中移除。由于 AdGuard 浏览器扩展用户愿意匿名分享过滤器使用统计信息(该功能默认被禁用),所以我们会了解哪些规则用户用得比较少。我们的用户常用列表创建特殊版本,即,不包含过时及不常用的过滤器(比如,AdGuard 基础过滤器)。

过滤器开发人员使用特定的“提示” ,以让他们管理哪些规则尚未进行“优化”

没错,该过程让过滤器变更短小,但是,代价是更低的广告拦截效果。再次声明,此方法并不是“万能的”。由于有些规则无法在浏览器扩展被使用,因此我们连它们状态也没有。甚至也会有些过滤器开发人员不愿意在规则旁边编写这种“提示”等等。

几个内容拦截器

接着再说一个方法。大部分 Safari 广告拦截器的开发人员使用的方法是将广告拦截器分裂成几个独立的内容拦截器。

适用于 iOS 的 AdGuard 包含六个内容拦截器

一般而言,每一个内容拦截器包含的规则不到5万。 不过,总规则数量非常多。
但是,由于以下原因,在广告拦截5万乘6不等于30万:

  • 常常会有一个过滤器使用其他过滤器的规则。但依照上述的方法,不同的 Safari 内容拦截器是完全独立的,因此它们包含的规则无法相互影响。
  • 如果有一个过滤器包含超过5万条规则,您完全不能添加此过滤器。

将来我们还会继续将 AdGuard “切”得更小,以让其符合 Safari 中的限制。但是现在您自己也能感觉到,这非常麻烦且低效。

低开发优先级

这个限制我们留到最后,这是因为它比较易懂。这里我们为大家阐述近六年来的 Safari 内容拦截 API 更新日志:
2015年 — Safari 内容拦截被实现应用
2016年 — 添加了一个新功能(make-https)并修复一些主要错误
2017年 — 添加了一个似乎无法被使用的新功能(if-top-url)并将内容拦截器添加到 WKWebView,修复了一些错误
2018年 — 修复了一些错误,代码重构
2019年 — 修复了一些错误
2020年 — 没有重要的改进

很明显可以看出,这种改进速度跟不上最新广告插入技术,因此必须进行某些改变。我们希望 Safari 开发人员的首要任务将会转向解决这些问题。我们都可以提供所需要的帮忙。

该做什么

很多年内,广告拦截社区一直在竭尽全力发出警报。下述仅是几个功能请求的例子:

还有更多之类的请求。以上只是最紧急的问题之一。作为广告拦截社区的一部分,我们为了引起苹果公司的注意已经做了很多。如需要其他任何形式的援助,我们将会很高兴提供所需要的帮助。

我们已经到了关键的时刻,必须进行任何形式的改革。否则,除了广告提供商以外,谁都会失败。

信息更新:看起来,2021年内就会有变化。例如,5万的限制被增加至15万。此外,还有别的改进

Darya Bugayova 发表于 行业信息 AdGuard消息 适用于Safari的AdGuard
2021年5月21日
下载评论即表示您接受 条款与条件
AdGuard VPN Mac 版的第一个公开 Beta 版!
大家欢迎 AdGuard VPN Mac 版的第一个公开 Beta 版本。发布 Alpha 版四个月后,我们终于发布了稳定版本。
AdGuard VPN v1.2 安卓版:导入/导出排除项、自定义 DNS 服务器
自11月份发布适用于安卓的 AdGuard VPN 首个稳定版以来,我们的进度突飞猛进。今天我们再来发布一个更新。让我们看看其功能。
已开始下载 AdGuard! 点击箭头所指示的按钮即可开始安装。感谢您选择 AdGuard! 选择“打开”并点击“确定”,然后稍作等待直至文件加载完毕。在已经打开的窗口中,将 AdGuard 图标拖拽至“Applications”文件夹内即可完成安装。感谢您选择 AdGuard! 选择“打开”并点击“确定”,然后稍作等待直至文件下载完毕。然后,在打开的窗口中点击“安装”即可。感谢您选择 AdGuard!