检测AdBlocking软件?

时间:2009-07-26 17:27:21

标签: php jquery adblock

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

10 个答案:

答案 0 :(得分:29)

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

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

快速了解newgrounds的来源告诉我他们正在用一些简单的javascript做这件事。 首先在文件中:

var user_is_leecher = true;

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

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

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

答案 1 :(得分:6)

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

要检测用户是否阻止了广告,您只需在广告javascript中找到一个功能并尝试对其进行测试即可。他们用什么方法阻止广告并不重要。以下是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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

/*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*/

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:1)

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

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

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

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

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

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:1)

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

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

https://github.com/retargetly/mockingbird

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

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

您需要使用的唯一方法是

mockingbird.adsBlocked(Obj)

可以在代码中的任何地方进行调用,并且您不需要jQuery来使其工作。

祝你好运!

答案 8 :(得分:0)

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

<?php

  header('Content-Type: application/javascript');

  //Save it to session
  session_start();
  $_SESSION['noAdblocker']=true;

 ?>

 noAdblocker=true;

将此文件另存为ads.php

现在是index.php

<?php
  session_start();
  $_SESSION['noAdblocker']=false;
?>
<!DOCTYPE HTML><html><head>
    <!-- Now place the "ad-script" -->
    <script src="ads.php"></script>
</head><body></body></html>

答案 9 :(得分:0)

您可以在页面上添加javascript代码,只有在没有adblocker的情况下(例如,使用“ ad”作为变量名,使用“ ad.js”作为文件名。 此代码将ajax事件发送到服务器,并说“此用户未使用adlocker”。因此,如果您没有收到该事件,则说明该用户正在阻止广告,甚至完全禁止javascript。