检测广告拦截软件?

16

最近我访问了一个网站,发现页面上有一段话说它注意到我正在使用广告拦截软件,是否可以关闭以支持像这样的小型网站。我想知道应该如何操作?是在客户端还是服务器端最好实现?


10
我很确定这只有在客户端才可能实现... - luiscubal
实际上,我认为你也可以在服务器端进行某些操作。如果你知道广告拦截器将会拦截什么内容,那么用户就不会加载它。然后你就可以知道它没有被加载。但这是一种比较昂贵的检测方式。 - Tomáš Zato
10个回答

33
这是服务器端无法完成的事情 - 没有人会敲你的门并说“看看我,我安装了AdblockPlus!”。当在客户端上时,广告拦截器正在积极尝试影响页面内容,这是您可以看到发生的事情,并且可以看到他们正在使用广告拦截器。
无论如何,我碰巧知道newgrounds.com也在这样做。(对于使用adblock plus的用户而言,他们的新布局被破坏了-作为回应,他们制定了最佳“如果你不通过我们的广告帮助我们,请去商店购买东西”的横幅广告比赛。)
快速查看newgrounds的源代码告诉我,他们是用一些简单的javascript来实现这个功能。 首先在文档中: var user_is_leecher = true; 接下来有一个外部脚本标记:src=checkabp?thisistotrickabp=***address of ad affiliate*** 现在是个笑话:他们只是相信adblock plus会过滤掉那个脚本,因为里面所有的内容就是:user_is_leecher = false;
从那里开始,他们可以做任何事情。

7

在这里提到的所有方法都依赖于广告拦截器来剥离代码。这在某些广告拦截器(如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

一开始看起来这是个不错的解决方案,但当我测试时,它并没有按照预期工作。有时浏览器会在 adsende 代码之前执行该脚本,结果我隐藏了自己的广告 :( - Igor Jerosimić
1
也许确保代码在所有内容加载完成之前不运行可以解决您的问题:window.onload = function() { if(typeof(window.google_render_ad)=="undefined") { //他们正在阻止广告,做其他事情。 } } - Beau

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

3

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


2
我认为在客户端实现比在服务器端实现更容易。广告拦截器是安装在客户端上的,因此它们可以操作DOM并阻止ajax请求。这就是为什么我认为在客户端上检测比在服务器上检测更有意义。
无论如何,这是一个独立的简单插件,可以检测使用启用了广告拦截器的用户,它是开源的,完整的代码在Github上。

https://github.com/retargetly/mockingbird

“这个插件更偏向于出版商,让他们可以轻松地在广告容器或弹出窗口中显示信息。该插件经常更新,值得一试。以下是示例链接:”

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

你需要使用的唯一方法是:
mockingbird.adsBlocked(Obj)

“这个调用可以在代码的任何地方进行,您不需要使用jQuery就能使它工作。”
“祝你好运!”

2
我猜有几种方法可以实现,但可能最简单的一种是使用某种背景图像或文本,在广告加载时将其替换。因此,如果广告被加载,您会看到广告。如果广告未加载,则会看到文本。
这个例子是客户端的,可以通过JavaScript或普通的CSS来完成。
也许还有一些服务器端的花招可以做到这一点,但它们会显得不必要而笨重。我想到的一种方法包括与广告商的某种API,可以询问“用户从IP地址加载了哪些图片?”以此获得答案。但我怀疑是否有这样的服务-在客户端上做这件事会更容易。

1

我认为没有简单的方法来实现这一点。你可以创建一个"陷阱"。让一个php脚本监听一个非常显眼的url,比如yourdomain.com/ad.png。你可以通过url重写来实现。如果加载了这个页面,你可以在一个session变量中记录下来并返回一个1x1的空白png。

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

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

  • png文件可以被缓存,而不管http头
  • 这不适用于第一个http请求
  • 一些额外的服务器负载,因为浏览器会为每个请求持续点击ad.png
  • 从服务器加载图像并不意味着它实际上会显示
  • 可能还有其他我没想到的副作用

如果你决定尝试,请在本帖下发表评论。

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

这个方法的最佳实践是使用重写规则使其无法被缓存(例如/adverts/<long-random>.png),将其指向一个脚本,该脚本取消设置一个预设的会话变量并按预期提供图像。在布局的开始位置(在任何重要内容之前),执行此操作,您可以选择在其他任何地方提供什么内容。这种方法很有效(即使在第一次请求时也可以)。不过,您必须选择一个肯定会被捕获和删除的规则... 精明的用户也可以将您的广告添加到白名单中,不过源代码中没有提示他们这样做! - Paul Norman

1
这里有一些不错的答案,我只想补充一下:
使用一些广告管理系统(您可以编写自己的)。通过这种方式,跟踪显示的每个广告(并使其明显,例如ads.php或showad.php或任何其他名称)。如果从未调用该脚本,则用户正在使用某种形式的广告屏蔽软件。
但请确保通过该处理程序处理每个广告。虽然不需要Mod_Rewrite,但可以使用简单的PHP来完成。

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>

0
您可以在页面中添加JavaScript代码,仅当没有广告拦截器时才执行,例如使用“ad”作为变量名,使用“ad.js”作为文件名。 此代码向服务器发送ajax事件,表示“此用户未使用广告拦截器”。因此,如果您没有收到该事件,则知道此用户正在阻止广告甚至完全阻止JavaScript。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接