检测AdBlocking软件?

我最近访问了一个网站并注意到该页面有一个部分说它注意到我正在使用AdBlocking软件,我可以将其关闭以帮助支持这样的小网站。 我只是想知道你会怎么做? 最好是客户端还是服务器端?

这是服务器方面根本无法完成的事情 – 人们敲门并说“看着我,我有AdblockPlus!”的原因就在于此。 在客户端,adblock正在积极尝试影响页面内容,这是您可以看到的,并且看到他们正在使用广告拦截器。

无论如何,我碰巧知道newgrounds.com也是这样做的。 (他们的新布局被搞砸了adblock加上用户 – 作为回应他们做了最好的竞赛“如果你不打算通过我们的广告帮助我们,去商店买东西”-banner。

快速查看newgrounds的来源告诉我他们正在用一些简单的javascript做这件事。 文件中的第一个:

var user_is_leecher = true;

接下来有一个外部脚本标签: src=checkabp?thisistotrickabp=***adress of ad affilliate***

现在这个笑话:他们只是信任adblock plus来过滤掉那个脚本,因为其中的所有内容都是: user_is_leecher = false;

从那里,他们可以做任何事情。

这里提到的所有方法都依赖于广告拦截器来删除代码。 这对某些广告拦截器(如Mac上的NetBarrier)不起作用。 当广告拦截器出现时,您还必须不断更新代码。

要检测用户是否阻止广告,您只需在广告JavaScript中找到一个function并尝试对其进行测试。 他们用什么方法阻止广告并不重要。 以下是Google Adsense广告的外观:

 if(typeof(window.google_render_ad)=="undefined") { //They're blocking ads, do something else. } 

此方法概述如下: http : //www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam

您可以在服务器端通过配对html页面和针对广告的请求(可能每个请求都有一些唯一标识符)来完成… …但这只是一个想法,我从来没有尝试过,甚至从未尝试过看到它用过。

我在代码中发现了这个部分,看起来好像是这样做的:

 /*MOOTOOLS*/ window.addEvent('domready', function(){ $$('.cat-item').each(function(el) { var fx = new Fx.Morph(el,{ duration:300, link:'cancel' }); el.addEvents({ 'mouseenter': function() { fx.start({ 'padding-left': 25 }); }, 'mouseleave': function() { fx.start({ 'padding-left': 15 }); } }); }); if ($$(".google-sense468")[0] && $$(".google-sense468")[0].clientHeight == 0 && $('block-warning')) $('block-warning').setStyle('display','block'); }); /*MOOTOOLS END*/ 

我想有几种方法可以做到这一点,但最简单的方法可能是在加载广告时替换某种背景图像或文本。 因此,如果广告加载,您会看到广告。 如果广告未加载,您会看到该文字。

这个例子是客户端,由JavaScript完成,或者只是简单的CSS甚至可能就足够了。

可能有一些服务器端的噱头也可以做到这一点,但它们会不必要地精心制作和笨重。 一种让人想起的方法包括广告客户的某种API,可以被问到“用户从IP中做过这样的事情。这样加载任何图像?” 并以这种方式得到答案。 但我怀疑有这样的服务 – 在客户端做起来要容易得多。

我认为没有一种简单的方法可以做到这一点。 你能做的就是创造“陷阱”。 制作一个PHP脚本,听取像yourdomain.com/ad.png这样非常明显的url。 您可以通过URL重写来实现此目的。 如果加载了此页面,您可以在会话变量中记下这一点并发送回1×1空白页面。

在下一个请求中,您可以查看是否已加载ad.png。 如果没有,你可以猜到客户端正在使用某种forms的AdBlock软件。 确保设置适当的http标头以防止客户端缓存“ad.png”。

这是我目前唯一可以想到的服务器端方法,它有一些缺陷。

  • 无论http标头如何,都可以缓存png文件
  • 这不适用于第一个http请求
  • 一些额外的服务器负载,因为浏览器将继续为每个请求点击ad.png
  • 从服务器加载图像并不能保证它实际显示
  • 可能更多的副作用,我没有想到

如果您决定尝试,请对此帖发表评论。

关于客户端解决方案。 这应该不难。 您可以创建一个小的Javascript,以便在页面加载完成时运行。 此脚本可以检查该页面是否包含持有广告的dom节点。 如果您完全加载页面(不仅是dom),则可以检查广告图像的宽度和高度。 此解决方案最明显的缺点是客户端可以禁用javascripts。

这里有一些好的答案,所以我只想补充一下:

使用一些广告管理系统(你可以自己编写)。 有了它,跟踪正在显示的每个广告(并使其显而易见,如ads.php或showad.php或其他)。 如果从未调用该脚本,则用户正在使用某种forms的广告拦截软件。

但是,请确保通过该处理程序处理每个广告。 Mod_Rewrite不是必需的,可以使用简单的PHP来完成。

我相信在客户端比在服务器端更容易做到这一点。 广告拦截器安装在客户端上,因此他们可以操纵DOM并阻止ajax请求。 这就是为什么我认为在客户端上检测比在服务器上检测更有意义。

无论如何,这是一个独立的简单插件,可以检测启用了广告拦截器的用户,它是开源的,完整的代码在github上:

https://github.com/retargetly/mockingbird

它更面向发布者,因此他们可以轻松地在广告容器或弹出窗口中显示消息。 该插件经常更新,值得一试。 这也是小提琴:

http://jsfiddle.net/retargetly/9vsha32h/

您需要使用的唯一方法是

 mockingbird.adsBlocked(Obj) 

调用可以在代码中的任何地方完成,你不需要jQuery来使它工作。

祝你好运 !

您可以采取哪些措施来检测服务器端的广告拦截器,如下所示:

  noAdblocker=true; 

将此文件另存为ads.php

现在index.php