反 Adblock 检测脚本:网站识别并对抗拦截器的技术手段
网站怎么检测拦截器
主流检测手段按复杂度排序:
手段一:加载一个隐藏的广告元素,检查它的 DOM 状态
网站在页面里注入一个不可见的 <div class="ad-container">,然后用 JS 检查:
- 这个 div 是否还在 DOM 里?如果 ABP 用元素隐藏把它 remove 了或 hide 了,检测脚本就能发现;
- 加载一个广告联盟的 JS 脚本(比如 doubleclick),检查它是否加载成功。加载失败 = 被拦 = 触发反拦截。
手段二:通过 Error 对象检测
网站发起一个请求,故意让它失败,然后捕获错误类型。某些反拦截规则会让请求返回特定类型的错误,网站可以据此判断。
手段三:资源耗时检测
正常广告加载需要一定时间,如果某个广告请求在极短时间内(几毫秒)就失败了,说明是被扩展主动取消的。
网站反制措施
检测到你在用拦截器之后,网站可能:
- 弹提示:"请关闭 AdBlock 支持本站"——最温和的做法;
- 全屏遮罩:强制你必须点"我已关闭 AdBlock"才能继续浏览;
- 内容遮罩:文章正文被灰层遮住,只能看到标题;
- 强制弹窗:弹窗关不了、关完又弹、甚至弹到覆盖屏幕整个区域;
- 重定向:访问某文章被自动跳到一个"关闭拦截器"的引导页;
- 反作弊:检测到拦截行为后降低你该次访问的推荐质量(某些网站偷偷这么做)。
怎么应对
应对一:用 :-abp-contains() 隐藏反拦截弹窗
很多反拦截弹窗的 class 名经常变,但里面的文字相对固定:
example.com##div.modal:-abp-contains(关闭 AdBlock)
这条会隐藏 example.com 上所有"关闭 AdBlock"字样的 modal 弹窗。
应对二:订阅列表里的专门规则
EasyList 和 Fanboy 家族的订阅里包含了大量针对主流网站(新闻站、论坛、视频站)的反拦截弹窗规则。保持订阅更新就是最好的应对。
应对三:手动写规则按网站处理
遇到某个网站的反拦截弹窗,在开发者工具里找到它的 DOM 结构,写一条元素隐藏规则。
应对四:换一个拦截器试试
uBlock Origin 对反拦截脚本的对抗比 ABP 更激进——gorhill(uBO 作者)专门写了反反拦截的核心规则。某些网站在 uBO 下不反制,但 ABP 下会。
反拦截的法律灰色地带
网站强制"关闭拦截器才能看内容"的做法在大多数地区没有明确的法律禁止,但:
- Chrome 商店不允许扩展"主动破坏网站反反拦截机制"(指修改网站代码绕过检测);
- 但"屏蔽网站上的任何元素(包括反拦截弹窗)"是被允许的——因为这是拦截器功能的自然延伸。
所以 ##div.modal:-abp-contains(关闭 AdBlock) 这种元素隐藏规则是合法的——你只是选择不看页面上的某个元素,不是在破解网站的防护。