我最近访问了一个网站,并注意到该页面有一个部分说它注意到我正在使用 AdBlocking 软件,我能否将其关闭以帮助支持这样的小型网站。我只是想知道你会怎么做?最好在客户端还是服务器端完成?
10 回答
这是服务器端根本无法完成的事情 - 人们有理由敲门说“看看我,我有 AdblockPlus!”。在客户端时,adblock 正在积极尝试影响页面内容,这是您可以看到发生的事情,并看到他们正在使用 adblocker。
无论如何,我碰巧知道 newgrounds.com 也在这样做。(他们的新布局被 adblock plus 用户搞砸了——作为回应,他们为最好的“如果你不打算通过我们的广告帮助我们,去商店买东西”-横幅进行比赛。
快速浏览一下 newgrounds 的来源告诉我他们正在使用一些简单的 javascript 来执行此操作。首先在文档中:
var user_is_leecher = true;
接下来是一个外部脚本标签:src=checkabp?thisistotrickabp=***adress of ad affilliate***
现在开个玩笑:他们只是相信 adblock plus 可以过滤掉该脚本,因为其中的所有内容都是:user_is_leecher = false;
从那里,他们几乎可以做任何事情。
这里提到的所有方法都依赖于广告拦截器来去除代码。这不适用于某些广告拦截器(例如 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
您可以在服务器端通过配对 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 的用户是否加载了任何图像?” 并以这种方式得到答案。但我怀疑是否有这样的服务——在客户端做起来会容易得多。
我相信在客户端比在服务器端更容易做到这一点。广告拦截器安装在客户端上,因此它们可以操纵 DOM 并阻止 ajax 请求。这就是为什么我认为在客户端上检测比在服务器上检测更有意义。
无论如何,这是一个独立的简单插件,可以检测启用了广告拦截器的用户,它是开源的,完整的代码在 github 上:
https://github.com/retargetly/mockingbird
它更面向发布商,因此他们可以轻松地在广告容器或弹出窗口中显示消息。该插件经常更新,值得一试。这也是小提琴:
http://jsfiddle.net/retargetly/9vsha32h/
您需要使用的唯一方法是
mockingbird.adsBlocked(Obj)
调用可以在代码中的任何地方完成,您不需要 jQuery 来使其工作。
祝你好运 !
我不认为有一个简单的方法可以做到这一点。你能做的就是制造“陷阱”。让一个 php 脚本监听一个非常明显的 url,比如 yourdomain.com/ad.png。您可能可以通过 url 重写来实现这一点。如果此页面已加载,您可以在会话变量中记下这一点并发回 1x1 空白 png。
在下一个请求中,您可以查看 ad.png 是否已加载。如果没有,您可以猜测客户端正在使用某种形式的 AdBlock 软件。确保设置适当的 http 标头以防止客户端缓存“ad.png”。
这是我目前能想到的唯一服务器端方法,它有一些缺陷。
- 可以缓存 png 文件,而不管 http 标头如何
- 这不适用于第一个 http 请求
- 一些额外的服务器负载,因为浏览器会不断为每个请求点击 ad.png
- 从服务器加载图像并不能保证它实际显示
- 可能还有更多我没有想到的副作用
如果您决定尝试一下,请对这篇文章发表评论。
关于客户端解决方案。这应该不难。您可以创建一个微小的 Javascript 以在页面加载完成时运行。此脚本可以检查页面是否包含保存广告的 dom 节点。如果您在页面完全加载(不仅是 dom)时这样做,您可以检查广告图像的宽度和高度。此解决方案最明显的缺点是客户端可以禁用 javascript。
这里有一些很好的答案,所以我将添加以下内容:
使用一些广告管理系统(您可以自己编写)。有了它,跟踪正在显示的每个广告(并使其显而易见,如 ads.php 或 showad.php 或其他)。如果该脚本从未被调用,则用户正在使用某种形式的广告拦截软件。
不过,请务必通过该处理程序处理每个广告。Mod_Rewrite 不是必需的,可以使用简单的 PHP 来完成。
你可以做些什么来检测服务器端的广告拦截器是这样的:
<?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>
您可以将javascript-code 添加到您的页面,只有在没有adblocker 时才会执行,例如使用“ad”作为变量名,使用“ad.js”作为文件名。此代码向服务器发送一个 ajax 事件,表示“此用户不使用 adlocker”。因此,如果您没有收到该事件,您就知道该用户完全屏蔽了广告甚至 javascript。