如何检测当前页面内Adsense JS加载时的实际响应是否为403
检测Adsense上下文相关403拦截的可落地方案
核心偏差来源:单独直接请求https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js拿到200,是因为请求没有携带你站点的页面上下文。Adsense的封禁拦截恰恰是基于请求附带的Referer站点信息、页面关联域名信息做判定,裸请求永远触发不了拦截规则,检测结果完全没有参考价值。
一、真实页面上下文内的前端检测(准确率100%)
这种方式完全模拟用户打开目标页面时的真实加载行为,结果和实际运行场景完全一致:
- 禁用跨域fetch/XHR请求:这类跨域请求不会自动携带匹配页面上下文的Referer,还会被CORS策略拦截,根本拿不到真实状态
- 通过动态创建script标签的方式发起探测,捕获加载结果:
function detectBlockStatus() { return new Promise((resolve) => { // 清除页面原有adsbygoogle脚本,避免缓存干扰 const oldScript = document.querySelector('script[src*="adsbygoogle.js"]'); oldScript?.remove(); const probeEl = document.createElement('script'); // 加随机时间戳强制走网络请求,绕开缓存 probeEl.src = `https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?probe=${Date.now()}`; probeEl.async = true; // 加载成功时触发onload probeEl.onload = () => { probeEl.remove(); resolve({ code: 200, isBlocked: false }); }; // 加载失败时触发onerror probeEl.onerror = () => { probeEl.remove(); // 加同域参照校验排除误判 fetch(`/static/probe-ok.txt?t=${Date.now()}`).then(res => { // 同域参照请求正常,但adsbygoogle加载失败,即为Adsense403拦截 if (res.status === 200) { resolve({ code: 403, isBlocked: true }); } }) }; document.body.appendChild(probeEl); }) } - 判定逻辑说明:浏览器出于安全限制,不会把跨域script资源的具体HTTP状态码直接暴露给JS,但Adsense返回403时的响应没有设置可执行JS所需的CORS头、返回内容是错误页而非脚本,一定会触发onerror事件。搭配同域资源的参照校验,可以完全排除网络故障、本地广告插件拦截导致的误判。
二、后端批量巡检检测(准确率约90%)
如果需要批量排查所有疑似被封禁的页面,不需要等用户实际访问,可以在后端模拟带上下文的请求:
- 构造对
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js的请求时,强制设置两个核心请求头:Referer:填待检测页面的完整URL(如https://your-domain.com/suspected-page.html)User-Agent:替换为真实桌面/移动端浏览器的UA,禁用爬虫默认标识
- 不要用空Referer发起请求,那样拿到的200和裸请求没有区别。直接读取返回的HTTP状态码:返回403即代表对应页面对应的站点上下文已被Adsense拦截,返回200即代表上下文正常
- 这种方式仅适合批量初筛,因为Adsense会附带少量客户端环境指纹校验,最终的精准判定还是需要在真实前端页面运行环境完成。
避坑提示
- 每次探测都要给adsbygoogle.js的请求加随机时间戳参数,避免浏览器缓存旧的加载结果导致检测失真
- 不要把“JS加载返回200但广告位为空”的广告填充失败,和“JS加载返回403”的封禁问题混淆,两者是完全独立的判定逻辑
- 检测过程中不要输出任何Adsense相关的配置参数到第三方接口,避免触发额外合规校验
内容的提问来源于stack exchange,提问作者Jlil
相关产品推荐
相关产品推荐

