IMA SDK 广告屏蔽,详解
Google IMA SDK 是视频播放器用于请求和播放广告的库。若在网络层面将其屏蔽,会导致播放器失效;因此 AdOff 将其替换为一个占位符(stub),该占位符对所有广告请求均立即返回“恢复内容”事件:播放器正常运行,而广告始终不会加载。
IMA SDK 实际上是什么
互动媒体广告(IMA)SDK 是 Google 提供的客户端视频广告库。希望对视频内容进行变现的网站通常不会自行构建广告播放器,而是加载 imasdk.googleapis.com/js/sdkloader/ima3.js(或动态变体 ima3_dai.js),初始化一个 AdDisplayContainer,并将广告标签(ad tag)URL 交给 SDK。随后,SDK 会获取 VAST 响应,在播放器内渲染广告、追踪曝光与四分位完成率,最终将控制权交还给发布方的内容播放逻辑。
由于该 SDK 是由单一域名统一提供、供多个网站共享使用的脚本,因此它是网络视频广告中最具杠杆效应的关键控制点:一旦将其中和,所有基于该 SDK 构建的播放器都将停止投放广告。
广告请求的生命周期
当观众点击播放时,播放器通常会执行以下流程:
- 页面从 Google 服务器加载
ima3.js。 - 播放器创建广告加载器,并通过指向广告服务器的广告标签请求广告。
- SDK 获取广告(通常通过 DoubleClick 获取 VAST/VMAP 文档),解析后将广告媒体渲染到视频上方的容器中。
- 触发追踪像素;播放器进入等待状态。
- 广告播放结束(或出错)后,SDK 触发
CONTENT_RESUME_REQUESTED事件,播放器恢复播放实际视频内容。
最后一个事件是关键所在:播放器被设计为必须等待该事件才能继续。谁控制了 SDK,谁就掌控了内容恢复播放的时机。
为何仅屏蔽 SDK 会导致播放器失效
粗暴的做法是在网络层面直接屏蔽 imasdk.googleapis.com,但问题在于:许多播放器会将 SDK 加载失败或缺失视为致命错误,从而拒绝启动视频,仅显示加载转圈动画或“检测到广告拦截器”的拦截墙,而非正常内容。
这正是传统网络级广告拦截器对视频广告效果较弱的原因:它们虽可阻止广告请求,却无法回答播放器提出的“现在能否恢复播放?”这一问题。唯有能替代 SDK 的方案才能胜任。
通过替代实现中和:存根(stub)方案
AdOff 采取了不同策略:它并非屏蔽 SDK,而是替换 SDK。一个模拟 IMA SDK 公共 API 的占位脚本被注入,使播放器仍“看到”一个正常工作的 SDK —— 该 SDK 表现得如同所有广告插播段均为空。
当播放器调用 adsManager.start() 时,该占位脚本会立即触发 CONTENT_RESUME_REQUESTED,播放器随即立即恢复播放内容。既未获取广告,也未渲染广告,且播放器从未进入错误状态,因为它根本未察觉任何缺失。
同一存根的两种分发渠道
AdOff 通过两种渠道分发该占位脚本,以适配不同网站加载 SDK 的方式差异:
- 页面内注入。 对于未被排除的网站,主世界脚本会在播放器初始化前定义
window.google.ima,从而以占位脚本覆盖已加载或待加载的官方 SDK。 - 网络重定向。 针对一组共 42 家欧洲广播公司域名,声明式网络请求(declarativeNetRequest)规则会将对
ima3.js和ima3_dai.js的请求重定向至扩展内打包的占位脚本文件。页面加载的虽是其自认的 Google SDK,实则为 AdOff 提供的版本。
两种渠道最终达成相同结果:播放器获得响应正常的 SDK,观众得以观看内容。
此方案的适用范围与局限性
该占位脚本可中和基于客户端 IMA 的广告投放,但不会影响服务端广告插入(SSAI)——广告已在分发前被嵌入视频流本身,不存在可拦截的 SDK 调用。此外,使用自有广告流程的付费订阅服务被明确排除,以确保其播放器正常运行。
主流视频平台还额外配置了专用处理流程:广告排期信息在页面读取前即从播放器响应中剥离,任何漏网之鱼则会被快进跳过。
为何这对广告屏蔽的未来发展至关重要
广告平台持续向客户端 SDK 倾斜资源,正是因 naive(朴素)拦截器难以应对此类机制。本方案通过“响应播放器”而非“阻断广告请求”的方式实现稳健防护:它不依赖穷举所有广告 URL,仅依赖 SDK 自身约定的“必须恢复内容播放”这一契约。
AdOff 是一款免费、无需账户、基于 Manifest V3 的扩展,支持 Chrome、Firefox、Safari、Edge 和 Opera 浏览器,其视频中和功能对所有用户开放。
常见问题
阻止 IMA SDK 是否等同于替换它?
否。在网络层面阻止它通常会导致视频无法播放,因为播放器会等待 SDK 发出内容可恢复播放的信号。用占位符替代它,则可在确保完全不请求任何广告的同时,保持播放器功能正常。
当存根(stub)收到广告请求时会发生什么?
该占位符暴露了播放器所期望的相同 API 接口。当被要求开始播放广告时,它会立即触发内容恢复播放事件,从而让播放继续进行,而无需获取或渲染任何广告。
IMA 存根是否适用于服务端广告插入?
否。在 SSAI(服务器端广告拼接)模式下,广告已在服务器端嵌入视频流中,再进行传输,因此不存在可拦截的客户端 SDK 调用。服务器端插入需要不同的应对措施,且超出了浏览器扩展所能解决的范围。
哪些浏览器可以运行此类扩展程序?
AdOff 基于 Manifest V3 构建,适用于 Chrome、Firefox、Safari、Edge 和 Opera 浏览器。IMA 中和层已包含在免费版本中,无需注册或账户。
网站能否检测到 SDK 已被替换?
这正是隐匿层的作用:通过模拟诱饵和拦截 fetch/XHR 请求,使环境对反广告屏蔽脚本而言看起来普通正常。但没有任何方法是永久有效的,因为平台会频繁更新其检测机制。