反反广告拦截脚本

发布于 5 小时前  16 次阅读


本文于 2026年1月31日 10:26 更新,注意查看最新内容

前言

最近发现平常经常逛的一个论坛开启了反广告拦截弹窗,并且开通了投票,问是否支持站内广告,理由是会影响站内收入以及浏览体验,影不影响收入不知道,但浏览体验肯定不影响。关键这样先斩后奏的做法实在是让人感觉哪里不太舒服,于是就有了本文的反反广告拦截脚本。

但在聊反反广告拦截脚本之前,我想从运营层面和技术层面浅显的聊一下这样一个行为。这个论坛本身是一个收费制的论坛,除开一些购买活动可能赠送注册资格,正常注册都需要单独购买,另外论坛本身还有专门的赞助专区,需要赞助一定金额才可以访问,再就是这次开启反广告拦截弹窗的广告区,这些都足以支撑论坛的正常运营开销。

除去论坛本身,还有与之配套的主站,主站的部分内容都来自于论坛的帖子,在这种情况下,贸然进行一刀切极易使用户反感。

从技术层面说,HTTP协议的特点在于无状态、无连接,一个请求结束后,本地与服务器的连接就结束了,这时候本地想干什么,要干什么,不是服务端可以控制得了的,所以从技术层面,也不适合开启反广告拦截,想屏蔽广告的拦不住,不想屏蔽的不需要拦。

反广告拦截代码

< script type = "text/javascript" >
  document.addEventListener('DOMContentLoaded', async () => {
    if (typeof(ad) == 'undefined' || typeof(ads) == 'undefined' || typeof(dzad) == 'undefined' || typeof(dzads) == 'undefined') {
      unadblock();
    } else {
      const isAdBlockEnabled = await detectAdBlock();
      if (isAdBlockEnabled) {
        unadblock();
      } else {
        console.log('no adblock');
      }
    }

  });

function unadblock() {
  alert('本站开启了反广告拦截功能,请到广告屏蔽功能的相关页面把本站排除,排除后则不会继续提示,感谢您的理解与支持!');
  window.location.href = "/XXX.html";
}

*原代码有删改

反反广告拦截脚本

// ==UserScript==
// @name         屏蔽XXX.com反广告拦截弹窗
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  提前禁用alert和覆盖检测函数,彻底阻断弹窗和跳转
// @author       You
// @match        *://www.XXX.com/*
// @run-at       document-start  // 核心:页面加载最早期执行,比网站所有脚本都早
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 1. 最早期禁用alert弹窗(彻底让alert失效)
    window.alert = function() {};
    window.confirm = function() { return false; };

    // 2. 提前定义检测变量,让网站检测条件不成立
    window.ad = true;
    window.ads = true;
    window.dzad = true;
    window.dzads = true;

    // 3. 覆盖检测函数,强制返回false
    window.detectAdBlock = async function() { return false; };

    // 4. 覆盖unadblock函数,清空弹窗和跳转逻辑
    window.unadblock = function() {};

    // 5. 禁用页面跳转(兜底,即使触发也跳不了)
    const originalHref = Object.getOwnPropertyDescriptor(window.location, 'href');
    Object.defineProperty(window.location, 'href', {
        set: function() {}, // 拦截href赋值
        get: function() { return originalHref.get.call(window.location); }
    });
    window.location.replace = function() {};
})();

*原代码有删改,AI辅助编写。

后话

一开始考虑是用AdGuard自定义规则来实现屏蔽反广告拦截弹窗,但是由于AdGuard的加载在页面加载之后,导致拦截不生效,所以使用了油猴来实现。