2009-07-26 62 views
13

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

+8

我很当然,这只是客户端... – luiscubal 2009-07-26 17:29:37

+0

其实,我认为你可以以某种方式做它的服务器端。如果您知道哪个广告块**将被阻止,则不会由用户加载。你可以知道它没有被加载。但检测它是一种相当昂贵的方式。 – 2014-08-30 01:37:09

回答

30

这一点是根本无法完成服务器端 - 有小人物的理由的人来敲你然后说“看看我,我有AdblockPlus!”。在客户端,adblock正积极尝试影响页面内容,这是您可以看到的事情,并看到他们正在使用adblocker。

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

就让我们来看看在newgrounds的消息人士告诉我,他们正在与一些简单的JavaScript这样 首先在文件中:

var user_is_leecher = true;

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

现在笑话:他们只是信任adblock plus来过滤scri pt,因为所有这些都在:user_is_leecher = false;

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

2

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

这个例子是客户端,可以通过JavaScript完成,也可以只用普通的CSS来完成。

可能有一些服务器端的噱头也可以做到这一点,但他们会不必要地复杂和笨重。想到的一种方法是在广告客户中包含某种API,可能会被问到“用户是否从IP获得了这样的信息,并且这些信息会加载任何图像?”并以这种方式得到答案。但我怀疑有这样的服务 - 在客户端做起来会容易得多。

3

你可以在服务器端通过配对html页面和相关广告的请求(可能为每个请求使用一些唯一的标识符...)...但这只是一个想法,我从未尝试过它甚至从未见过它被使用过。

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

我不认为有一个简单的方法来做到这一点。你可以做的是创造“陷阱”。让一个php脚本听一个非常明显的url,比如yourdomain.com/ad.png。你可以通过url重写来达到这个目的。如果此页面已加载,您可以在会话变量中注明此信息并发送1x1空白PNG。

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

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

  • PNG文件可以不管被缓存的HTTP标头
  • 这不是第HTTP请求工作的
  • 一些额外的服务器负载为浏览器将继续把球击ad.png为每个请求
  • 该图像会从服务器加载并不能保证它实际显示
  • 可能更多的副作用,我都没有想到的

如果你决定尝试一下,请对这篇文章发表评论。

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

+0

此方法的工作原理是,使用重写规则最好使其不可缓存(例如/ adverts/.png),并指向一个脚本,该脚本将UNSETS预设会话变量并按预期方式提供图像。在布局的开始(在任何重要之前)做到这一点,并且您可以选择其他地方的服务。作品(即使是第一次请求)。您必须选择一条肯定会被抓住并移除的规则......精明的用户也可以将您的广告列入白名单,尽管源代码中没有任何内容可以表明他们应该这么做! – 2012-02-01 01:15:40

1

这里有几个很好的答案,所以我就补充一点:

使用一些广告管理系统(你可以写你自己的)。通过这种方式,可以跟踪每个正在显示的广告(并且明显地表现出来,比如ads.php或showad.php或其他)。如果该脚本从未被调用过,则该用户正在使用某种形式的广告拦截软件。

尽管如此,一定要处理通过该处理程序的每个广告。 Mod_Rewrite不是必需的,它可以使用简单的PHP来完成。

5

这里提到的所有方法都依赖于广告拦截器去掉代码。这对于某些adblockers(例如Mac上的NetBarrier)无效。当adblockers赶上时,您还必须不断更新您的代码。

要检测用户是否阻止广告,您只需在广告javascript中找到一个函数并尝试对其进行测试。使用什么方法阻止广告并不重要。下面是它看起来像谷歌的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

1

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

无论如何,这是检测用户启用广告拦截独立简单的插件,它是开源的和完整的代码在GitHub上:

https://github.com/retargetly/mockingbird

它更注重让他们可以轻松地显示出版商广告容器上或弹出式窗口中的消息。插件经常更新,值得一试。这是小提琴也:

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

你需要使用的唯一方法是

mockingbird.adsBlocked(Obj) 

呼叫可以在任何地方的代码来完成,你并不需要jQuery来使其工作。

祝你好运!

0

,你能做些什么来检测在服务器端的adblocker被somithing像:

<?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>