16

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

4

10 回答 10

33

这是服务器端根本无法完成的事情 - 人们有理由敲门说“看看我,我有 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;

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

于 2009-07-26T17:41:48.643 回答
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

于 2011-02-02T23:12:22.880 回答
3

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

于 2009-07-26T17:40:11.080 回答
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*/
于 2009-07-26T17:40:53.513 回答
2

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

此示例将是客户端,由 JavaScript 或纯 CSS 完成甚至可能就足够了。

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

于 2009-07-26T17:38:28.353 回答
2

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

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

https://github.com/retargetly/mockingbird

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

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

您需要使用的唯一方法是

mockingbird.adsBlocked(Obj)

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

祝你好运 !

于 2015-12-18T21:41:42.003 回答
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。

于 2009-07-26T18:52:32.573 回答
1

这里有一些很好的答案,所以我将添加以下内容:

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

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

于 2009-07-26T22:13:37.563 回答
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>
于 2018-02-26T08:20:47.740 回答
0

您可以将javascript-code 添加到您的页面,只有在没有adblocker 时才会执行,例如使用“ad”作为变量名,使用“ad.js”作为文件名。此代码向服务器发送一个 ajax 事件,表示“此用户不使用 adlocker”。因此,如果您没有收到该事件,您就知道该用户完全屏蔽了广告甚至 javascript。

于 2020-02-19T10:29:44.037 回答