【问题标题】:Detecting AdBlocking software?检测 AdBlocking 软件?
【发布时间】:2010-11-14 04:17:30
【问题描述】:

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

【问题讨论】:

  • 我很确定这只能在客户端......
  • 实际上,我认为您也可以在服务器端进行操作。如果您知道要阻止的广告块,则用户不会加载它。你可以知道它当时没有加载。但这是一种相当昂贵的检测方法。

标签: php jquery adblock


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以在服务器端通过配对 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*/
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

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

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

          【讨论】:

          • 此方法最有效,最好使用重写规则,使其对 1px 图像不可缓存(例如 /adverts/.png),并将其指向 UNSETS pre-设置会话变量并按预期提供图像。在布局的开头(在任何重要的事情之前)这样做,您可以选择在其他任何地方提供什么。工作一种享受(即使是第一次请求)。您确实必须选择一个肯定会被捕获和删除的规则......精明的用户也可以将您的广告列入白名单,尽管来源中没有任何建议他们应该这样做!
          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案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

            【讨论】:

            • 起初这看起来是一个不错的解决方案,但当我测试它时,它并没有按预期工作。有时浏览器会在广告代码之前执行该脚本,而我最终隐藏了自己的广告:(
            • 也许确保代码在所有内容加载完成之前不会运行可以解决您的问题:window.onload = function() { if(typeof(window.google_render_ad)=="undefined") { //They're blocking ads, do something else. } }
            【解决方案8】:

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

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

            https://github.com/retargetly/mockingbird

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

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

            你需要使用的唯一方法是

            mockingbird.adsBlocked(Obj)
            

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

            祝你好运!

            【讨论】:

              【解决方案9】:

              在服务器端检测广告拦截器的方法如下:

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  猜你喜欢
                  • 2012-03-20
                  • 1970-01-01
                  • 2011-09-09
                  • 2011-08-20
                  • 2017-05-14
                  • 1970-01-01
                  • 2013-01-31
                  • 2021-07-08
                  • 2014-11-28
                  相关资源
                  最近更新 更多