前言
最近发现平常经常逛的一个论坛开启了反广告拦截弹窗,并且开通了投票,问是否支持站内广告,理由是会影响站内收入以及浏览体验,影不影响收入不知道,但浏览体验肯定不影响。关键这样先斩后奏的做法实在是让人感觉哪里不太舒服,于是就有了本文的反反广告拦截脚本。
但在聊反反广告拦截脚本之前,我想从运营层面和技术层面浅显的聊一下这样一个行为。这个论坛本身是一个收费制的论坛,除开一些购买活动可能赠送注册资格,正常注册都需要单独购买,另外论坛本身还有专门的赞助专区,需要赞助一定金额才可以访问,再就是这次开启反广告拦截弹窗的广告区,这些都足以支撑论坛的正常运营开销。
除去论坛本身,还有与之配套的主站,主站的部分内容都来自于论坛的帖子,在这种情况下,贸然进行一刀切极易使用户反感。
从技术层面说,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的加载在页面加载之后,导致拦截不生效,所以使用了油猴来实现。
