← LeisureLinux 文章索引
LeisureLinux · 微信公众号文章

YouTube 广告去哪儿了:DDG 浏览器 vs GitHub YT Pro 的两条屏蔽路线

安全/漏洞 阅读原文(微信)↗

YouTube 广告去哪儿了?

DuckDuckGo 浏览器 vs GitHub YT Pro:同一道题的两种答案。——LeisureLinux · 架构师视角拆解

YouTube 广告屏蔽工具千千万,但拆开来看,它们走的根本是两条技术路线。一条是 客户端伪装(DuckDuckGo 浏览器)——用 Google 自己留出的「干净端点」替换播放入口;另一条是 运行时重写(GitHub YT Pro)——直接反编译官方 App、在内存里把广告模块的方法签名换掉。

把这两条路线摆在一起看,你能瞬间理解 「去广告」这件事的真正难度——以及为什么大多数号称「屏蔽广告」的产品,都只是浮在最浅的一层。

本文脉络

01

DDG 端点替换

02

YT Pro 运行时 Patch

03

对比与启示

01 · CHAPTER ONE

DuckDuckGo 浏览器:一次聪明的「端点替换」

  1. 起点:YouTube 一直藏着「无 Cookie」嵌入端点

大多数人不知道的是,Google 自己就提供了一个「广告更少」的 YouTube 嵌入入口:

官方播放端:youtube.com/embed/\<video_id>

无 Cookie 端点: youtube-nocookie.com/embed/\<video_id>

后者是一个 不带 Cookie、不带用户追踪、不带广告 manifest 注入 的纯净嵌入端点——Google 原本是为了让第三方网站嵌入 YouTube 视频时不至于向访客写追踪 Cookie 才做的。广告位的填充逻辑依赖 Cookie 与用户画像签名,这条路径天然没画像。

  1. DuckDuckGo 做了什么

DuckDuckGo 在 2023 年的产品博客里公开过这套机制,核心步骤其实就 3 步:

01

URL 改写:在地址栏打开 youtube.com/watch?v=XXX 时,浏览器在请求层加载一段远程 JS,解析出 video_id 后跳转到一个内嵌 youtube-nocookie 播放器的极简播放页。

02

嵌入播放器:极简播放页直接用 \<iframe> 加载 youtube-nocookie 的 embed 端点,端点不返回 pre-roll / mid-roll / banner 广告 manifest。

03

可选 CSS 剥离:加载 Player Overrides,对\"赞助内容卡片\"与\"短广告片段\"用 CSS 选择器抹掉。

  1. 这条路线的优点与天花板

优点:不需要维护广告过滤规则列表(host list / EasyList),不依赖第三方插件生态,对用户而言 零配置 。

天花板

NOTE

只能去掉视频前/中/后插入的预录广告与端内卡片广告,对付不了 Shorts 内嵌广告(另一套 manifest)。任何依赖 YouTube 登录态的「个性化推荐广告」依旧会出现。一旦 Google 下线 nocookie 端点,整套机制就失效——这是依赖单一供应商的最大风险。

用一句话概括这条路线: 「绕开广告的承载链路,而不是分析广告本身。」

02 · CHAPTER TWO

YT Pro:反编译 + 运行时 Patch 的硬核路线

YT Pro(GitHub: prateek-chaubey/YTPro)是 Android 平台上的非官方 YouTube 客户端。它不是浏览器套壳,而是一个 完整 APK :从 YouTube 官方 App 反编译得到 Smali 字节码,再二次打包。项目的定位是 YouTube ReVanced 思想路线的「轻量替代品」——主打「屏蔽广告 + 后台播放 + 视频下载 + Picture-in-Picture + 手势控制 + 老 Android 兼容」。

  1. 核心原理:运行时方法签名替换

YT Pro 去广告的核心机制,可以拆成 3 层:

第 1 层:Manifest 解析期拦截

YouTube Android 客户端的播放器在启动视频前会向 Google 后端请求一段 manifest JSON,里面带 adSlots 字段描述广告插入位置。YT Pro 反编译后定位到 AdSlotFetcher 与 AdRequest 两个类的 smali,把它们的 execute() 方法直接改成 return null——广告 manifest 永远不会被请求到,pre-roll 广告位直接「空」了。

第 2 层:播放逻辑期 Patch

即使 manifest 没广告,YouTube 的播放引擎( ExoPlayer 包装层)里还有一段 AdPlaybackControl 类,会在播放器队列中插入一段 AdMediaSource 。YT Pro 把这个类的关键方法 enqueueAdSource() 改成 return ,从而跳过广告队列的入队。

第 3 层:UI 层注入与隐藏

对于一些「卡片赞助位」「购物推荐卡片」「Shorts 内嵌广告」,YT Pro 通过 运行时 Hook (用 Xposed / LSPosed 框架,或自己的轻量级 hook 引擎)拦截对应 View 的 setVisibility() 调用,把广告位的可见性强制设为 View.GONE 。

  1. 这条路线的技术难点

反混淆

ProGuard / R8 把类名、方法名全部混淆为 a.b.c.d(),需人工还原语义

版本耦合

YouTube 每周小更新,smali 签名一旦动,patch 即失效

签名校验

必须拆掉 APK 内置的签名校验,否则自己改包后无法安装

用一句话概括: 「分析广告模块的代码,然后逐行拆掉。」

03 · CHAPTER THREE

两条路线对比表

维度      DDG 浏览器      YT Pro (Android)              工作层级      网络层 / DOM 层      客户端代码层 / 运行时 Hook              是否解析 YouTube 客户端      否      是(反编译 Smali)              是否维护规则      否      是(每次更新都要 re-patch)              登录态影响      不登录态最佳      完全绕过登录态限制              适用范围      PC / 移动浏览器      Android 设备              失效模式      Google 下线 nocookie 端点      YouTube 客户端更新改动代码              合规风险      低(Google 自己的端点)      中(侧载 / 修改版权作品)              安装复杂度      装个浏览器就行      需开启未知来源 / 允许签名            \

04 · CHAPTER FOUR

对架构师的启示

「当一个产品形态拒绝提供『无广告』选项时,工程师要么从外层(网络)绕过去,要么从内层(代码)拆掉它。」

两条路线看似对立,其实是同一道题的两种答案:

01

DDG 的路线是协议侧的优雅——依赖供应商自己的「逃生通道」,但天花板受供应商意愿约束。

02

YT Pro 的路线是对抗式的工程——把客户端当源代码对待,能力上限高,但维护成本是陡峭的。

03

第三种路线正在浮现:用本地代理 + WASM 运行时把 YouTube 核心协议翻出来,在用户机器上跑一个「伪 YouTube」。Brave / Arc 浏览器已经在做原型。

∞ · REFERENCES

参考文献

[1] DuckDuckGo Blog. (2023). DuckDuckGo\'s New App Tracking Protection and YouTube Ads . https://spreadprivacy.com/duckduckgo-youtube-ads/

[2] Google Developers. (2024). YouTube Embedded Player and Player Parameters . https://developers.google.com/youtube/player_parameters

[3] Chaubey, P. (2024--2026). YT Pro: A lightweight YouTube client for Android . GitHub. https://github.com/prateek-chaubey/YTPro

[4] ReVanced Team. (2023--2026). ReVanced: Continuing the legacy of Vanced . GitHub. https://github.com/revanced/revanced-manager

[5] Wikipedia. (2024). Adblock Plus --- Filter List Mechanisms . https://en.wikipedia.org/wiki/Adblock_Plus

∞ · POSTSCRIPT

后记:屏蔽广告是数据主权的微观演练

「屏蔽广告这件事,本质上是『数据主权』的微观演练。你每一次点开一个看似『免费』的视频,背后都有无数次 Cookie 写入、profile 拼接与 auction 拍卖。DuckDuckGo 与 YT Pro 让你从两个方向把这些动作停下来——前者温和、后者激进;前者看协议、后者看代码。对工程师而言,这两条路线的真正价值,不只是『没广告的几秒钟』,而是它让你重新理解了客户端与服务器端的边界究竟画在哪里——而这条边界,未来十年只会被推得越来越模糊。」

END

我是 LeisureLinux ,一个偏好用底层视角与一手代码证据,拆解互联网基建运行规则的 IT 老兵。

如果你觉得今天这篇有收获,欢迎 点赞、在看、转发 三连,我们下篇见。


本文完。欢迎关注 LeisureLinux,获取更多深度技术解读。

本文整理自微信公众号 LeisureLinux 的原创内容(Linux / AI / 安全 硬核技术)。

· 阅读原文(微信公众号)

· 关注公众号 LeisureLinux,第一时间获取技术深度内容。

LeisureLinux 公众号二维码(微信扫一扫关注)