关于一些特别烦人的广告屏蔽屏蔽器的绕过实现

/ 0评 / 0

或者说,广告屏蔽屏蔽屏蔽器。(严禁套娃!)

什么是广告屏蔽屏蔽器

进入一个页面,然后突然页面消失了,取而代之的是要求你禁用广告屏蔽插件的页面。这样一种实现就是广告屏蔽屏蔽器。为了之后的行文方便,我们统一称其为广告墙 Ad wall(即必须看广告才能看内容的屏蔽墙,与之对应的词语是付费墙 Pay wall, 即必须付费才能看到内容)。

大部分广告墙还是比较柔和的,比如在原先显示广告的位置上显示“请禁用广告屏蔽插件帮助我们更好发展"之类的词语。这类侵入性不高的提醒,在检视内容质量后,我还是会为这个网站禁用广告屏蔽插件的。但是偏偏就有站长觉得,我应该把这个提示直接糊在整个页面上。我知道运营一个网站的不容易,但是强求他人行善无异于逼着他人作恶。

之前写过一篇阮一峰博客广告墙的绕过,效果还行。现在让我们继续和这些广告墙斗智斗勇吧。既然你不仁,休怪我不义。

遮罩型广告墙

这种广告墙的实现方式是:如果用户启用了广告屏蔽插件,那么就弹出一个覆盖浏览器视图的对话框。这个对话框视站长心情和蛋疼程度有可能会自带关闭。能关闭的,我也就认了,内容不错的话甚至可以考虑打钱。但是不能关闭的就只是让人作呕。好在绕过此类广告墙并非难事。

右键广告对话框,选择审查元素,直接删除广告所在 <div> 即可。如果发现即使删除了广告遮罩也仍然无法滚动页面,将 <body> 元素添加 overflow-y: scroll 样式即可。

但是如果你删除了广告遮罩以后发现自己面对着一片空白并且确定自己没有删错的话,那么恭喜你,你遇到了替换式广告墙。

替换式广告墙

这种广告墙的实现方式是:直接把页面清空然后把提示贴上去。虽然可以在 <body> 上挂断点阻止更改,但是也不是办法。

终极解决方案

这两种方案都是需要对 DOM 做出更改的。如果我们保存 DOM 的内容,在必要时恢复呢?

于是我操起油猴就是一顿操作:

// ==UserScript==
// @name         BlockBlockAdBlock
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Make the world a worse place
// @author       dousha99
// @match        http://*/*
// @match        https://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    let body = document.body;
    let clone = body.cloneNode(true);
    window.addEventListener ("keydown", keyboardHandler, false);

    function keyboardHandler (zEvent) {
        var bBlockDefaultAction = false;

        //--- Assume we want only the plain keys, not the modified versions.
        if (zEvent.altKey || zEvent.ctrlKey || zEvent.shiftKey) {
            //-- Do nothing (most user-friendly option, in most cases).
        }
        else {
            if (zEvent.which == 19) { // PAUSE / BREAK
                document.body = clone;
                bBlockDefaultAction = true;
            }
        }

        if (bBlockDefaultAction) {
            zEvent.preventDefault ();
            zEvent.stopPropagation ();
        }
    }
})();

从此,到任何网页,这个脚本都会复制一份 <body>. 如果其中内容被替换,只需按下 Pause/Break 键就可以将原来的 <body> 替换回来。(啥,你不知道这个键在哪?在 Scroll Lock 旁边,就方向键附近。笔记本键盘的话就找一下 Pause,但不是媒体控制的播放/暂停键。)

那么会不会有广告屏蔽屏蔽屏蔽屏蔽器呢?

严(jia)禁(da)套(li)娃(du)。不过目前来看,可以有。最简单的方案就是通过 setInterval 反复检测广告的存在,然后反复将页面替换掉。这一招虽然可以通过 clearInterval 防御成为广告屏蔽屏蔽屏蔽屏蔽屏蔽器,但还可以通过直接跳转的方式,连地址都一起改变。这样要防御的话,只能再另寻他法。

猫捉老鼠的游戏,除非信息共产主义到来,不然会一直持续下去。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Your comments will be submitted to a human moderator and will only be shown publicly after approval. The moderator reserves the full right to not approve any comment without reason. Please be civil.