DEMO: http://sources.ikeepstudying.com/anti-adblock-killer/

有些网页上充斥着令人厌恶的广告,这些广告不仅阻碍了信息的获取,有的还严重影响了浏览者的心情。特别是某些毫不相关的多媒体广告和弹出式窗口,不仅让人感到被骚扰,还很容易误点到,浪费宝贵的时间。由此便诞生了大名鼎鼎的跨平台 AdBlock 插件,在任何主流浏览器上都有它的扩展或插件,用户可以安装它并屏蔽绝大多数的广告。

既然 AdBlock 有检测广告并屏蔽它们的方法,作为网页制作者,其实也有反过来检测 AdBlock 的方法。

为什么要检测 AdBlock

这是一个有争论的问题:用户有选择不看广告、在浏览器页面上销毁广告的权利,网站也有捆绑广告和信息一同派发给你并收取广告商展示费用的自由。这两者都不能互相干预,并且在没有明确法律法规的环境下,你可以防范我,我也可以防范你。

除了向 AdBlock 直接提交 “可接受的广告网站” 申请进入白名单以要求直接免受屏蔽之外,下面介绍 6 种从网站本身出发的检测 AdBlock 并触发相关操作的方法。

以下的方法都是以不修改广告代码本身的基础上完成的,因为诸如 Google AdSense 的广告联盟要求不得修改代码。

检测广告模块可见高度

这是一种很朴实的方法,原理也很简单,就是检测对应广告模块的高度是否小于它应有的高度,若小于就说明它被置空塌陷了,也即说明启用了 AdBlock。

代码类似如下

if( document.getElementById('ads').clientHeight < 90 ){//AdBlock Detected}

此方案的可行性为中。某些情况下 AdBlock 屏蔽了某个广告之后的处理情形比较特殊,不会使得广告模块塌陷,而是维持设定的高度显示空白,那个时候就不管用了。

检测可见广告的个数

这是一个和上述类似的方法,也很朴实,那就是检测当前页面上的广告个数是否达到预期,因为某些广告可能并没有触发 AdBlock 的规则得以显示,所以可以利用检查广告的个数的方法来达到目的。

借助 jQuery,代码类似如下

if( $('.ads').filter(':visible').length < 3 ){// Ads showing less than 3// AdBlock Detected}

此方案的可行性仍然为中,理由和上一个方法类似。

检测 google_jobrunner

这个方法仅仅适用于 Google AdSense 广告。在加载了 AdSense 的广告代码之后,有一个 window.google_jobrunner 对象被建立,而 AdBlock 会阻止 AdSense 代码的加载,此时这个对象将不存在。我们可以靠这一点来检测 AdBlock。

其代码看起来类似于

if ( typeof(window.google_jobrunner) != 'object' ){// AdSense js not loaded// AdBlock detected}

检测 adsbygoogle 类型是否是数组

这个方法仅仅适用于 Google AdSense 广告。如果你使用了含有 ins 标签的新异步代码,则可以使用这个方法。其原理是,adsbygoogle 在当前页面加载时被初始化为一个数组,而当 AdSense 的代码被加载时,它被进化为一个对象 object,而 AdBlock 会阻止 AdSense 代码的加载。因此,我们通过检查 adsbygoogle 的状态就可以知道 AdBlock 有没有安装。

其代码应该类似于

window.setTimeout(function(){if(adsbygoogle instanceof Array) {// AdSense js not loaded// AdBlock detected} }, 2000);

此方案的可行性为高,因为这充分利用了 AdSense 的特点,并且非常准确,效率也很高。代码中的 setTimeout 是为了弥补 AdSense 代码运行所花费的时间,大约两秒够了。

使用 Ajax 模拟一个广告代码加载请求

我们知道 AdBlock 会阻止广告代码的加载,因此,我们可以通过尝试模拟加载一个广告代码 ads.js ,如果AdBlock 屏蔽了这次行为,可以触发其失败的方法,达到检测的目的。

借助 jQuery,我们可以这样写

$.ajax({url: "ads.js",dataType: "script"}).fail(function () {// Ads.js not loaded// AdBlock detected});

此方案的可行性很高,因为这戳中了 Adblock 的弱点。其中 ads.js 本身可以是一个空文件,但它不能不存在,否则会发生 404 错误,导致误判。所以你需要在这个目录下放一个 ads.js 文件。你甚至可以把它叫做 adsbygoogle.js 文件。

如图所示,加载 ads.js 时,行为被 AdBlock 阻止:

加载额外的 ads.js 帮助判断

我们知道 AdBlock 会屏蔽页面中类似名称为 adsbygoogle.js、ads.js 的脚本文件,所以我们可以利用这个特点来引入一个自己的 ads.js 来帮助判断。如何实现呢?

首先创建一个 ads.js 文件,这个文件里只有一句话:

var isAdEnabled = !!1;

然后,我们在网页页面上试图引入这个脚本文件:

<script src="ads.js" type="text/javascript"></script>

如果存在 AdBlock,ads.js 会被屏蔽加载,因此 isAdEnabled 这个变量就不会被建立。

于是,我们这样来检测:

var isAdEnabled = isAdEnabled || !1;if( !isAdEnabled ){//Ads.js not loaded// AdBlock detected}

这样,如果 ads.js 被屏蔽了,isAdEnabled 就会被初始化为 false。这个方案的可能性也很高。

写在最后

不仅仅有上述的检测代码,还有人甚至做好了 js 插件、wordpress 插件可以直接现成的用,它们功能丰富并且可以自定义设置。你可以根据自己的情况选择钟意的方案。但在此应当注意的是,广告并不总是坏的,相反,网络上存在着很多有价值的广告。如果自己的网站因为广告的问题被用户反感,那么广告提供商和网站管理员都应该想想怎么着手去改善这一切,而不应该激怒用户而让他们用上 AdBlock,最后双方都有损失。

DEMO: http://sources.ikeepstudying.com/anti-adblock-killer/

原文:http://blog.netsh.org/posts/adblock-detect_2017.netsh.html

justcode.ikeepstuding.com

网页检测 AdBlock 的 6 种方法相关推荐

  1. php如何对数据类型检测 有哪些方法,php检测数据类型的几种方法汇总

    下面小编就为大家带来一篇PHP检测数据类型的几种方法(总结).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在JavaScript中,使用typeof可以检测基本数据类 ...

  2. php怎么检测数据类型,PHP检测数据类型的几种方法总结和技巧

    下面小编就为大家带来一篇PHP检测数据类型的几种方法(总结).小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在JavaScript中,使用typeof可以检测基本数据类 ...

  3. 网页转exe的三种方法

    网页转exe的三种方法 前言:最近公司有个项目需要将几个子系统嵌入到一个大的系统中去,嵌入的要求是必须得是exe程序,但是有几个子系统是基于web运行的,所以需要找到将web项目转化为exe的方法.结 ...

  4. 解除网页屏蔽的另一种方法

    看了supNate的blog觉得很有启发,不过觉得alert的话还可以被重写,直接用void不就完事了. 这个时代真的需要创造力. /**/ /*author:livahu **2006-12-22 ...

  5. win7 系统 内存测试软件,win7怎么检测内存 win7系统检测内存的三种方法

    win7系统检测内存的方法有很多种,我们都知道内存是电脑中十分重要的硬件,内存越大,电脑运行速度越快.当然内存也会发生错误,和磁盘坏道一样,内存有问题时容易导致系统崩溃,数据丢失,那么 Win7 64 ...

  6. 网页优化速度的7种方法

    网站优化是指通过对网站功能.网站结构.网页布局.网站内容等要素的合理设计,使得网站内容和功能表现形式达到对用户友好并易于宣传推广的最佳效果,充分发挥网站的网络营销价值,是一项系统性和全局性的工作,包括 ...

  7. 分析网页 JavaScript Bundles 的几种方法

    分析你网页中的  JavaScript Bundles 大小,并限制网页中的 JavaScript 数量,可以减少浏览器花费在解析.编译和执行 JavaScript 的时间.这可以加快浏览器可以开始响 ...

  8. php的header_php获取网页header信息的4种方法

    php获取网页header信息的方法多种多样,就php语言来说,我知道的方法有4种, 下面逐一献上. 方法一:使用get_headers()函数 推荐指数: ★★★★★ get_header方法最简单 ...

  9. 猫脸关键点检测大赛:三种方法,轻松实现猫脸识别!

    导语:挑战猫脸,就差你了! 今天这个比赛,得从一个做程序猿的铲屎官开始说起...... 话说,有一天「铲屎猿」早起之后,发现猫主子竟然没了身影:他找啊找啊,找了好久,可仍然到处都没找到猫主子.这时,客 ...

最新文章

  1. 增加service_.NET Core + Kubernetes:Service
  2. Cisco交换机解决网络蠕虫病毒***问题
  3. Python培训分享:Python内置标准异常及其解析
  4. 杭电1597_find the nth digit
  5. 关于类黄酮和类胡萝卜素
  6. JavaScript覆盖率统计实现
  7. 阿里面试官给你的一些忠告,这样做肯定错不了!附视频
  8. selenium报错解决 ElementNotInteractableException,element not interactable
  9. 2019年Java程序设计讲课笔记目录
  10. Privoxy | 终端运用privoxy自由选择是否代理拉取Golang包(Mac OS)
  11. win nginx html 配置,Windows服务器nginx安装与配置
  12. QQ文件中转站 发送给好友的功能 哪去了?
  13. 按虚拟化对象划分,实现虚拟化存储的方式,主要包含哪几种?
  14. 百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量-代码篇
  15. 分享一些嵌入式相关的开源项目
  16. Docker(9) 安装Oracle18c
  17. JSON转换JAVA对象
  18. 使用云主机进行深度学习
  19. 网站静态化——前后端分离(下)
  20. Intel CEO:中国正成为真正的创新中心

热门文章

  1. 重排列(51Nod-2513)
  2. 训练日志 2018.12.16
  3. 信息学奥赛一本通C++语言——1027:输出浮点数
  4. python怎么对文件行排序_使用Python对文本文件进行排序
  5. 设置jstree只展示到2级_你做的私域流量属于什么级别?80%的商家都还只在第2级...
  6. pandas python2.3版本_python-像以前的版本一样,将pandas 0.13.0“ pri...
  7. 大数据系统和分析技术综述(引用最多)
  8. jQuery基础学习笔记(上)
  9. 吴恩达 神经网络和深度学习 第一课 第三周 (代码)planar data classify
  10. vue动态监听窗口高度 - 全背景banner