如何在我的网站上检测Adblock?


370

我希望能够检测用户访问我的网站时是否正在使用adblocking软件。如果他们正在使用它,我想显示一条消息,要求他们关闭它以支持该项目,例如本网站一样。

如果您进入该站点,并且浏览器启用了某种adblock软件,则该站点会显示一个小横幅,告诉用户该广告收入用于托管该项目,而不是显示实际的广告,因此应考虑关闭Adblock 。

我想在我的网站上这样做,我在上面使用adsense广告,该怎么办?



5
对于寻求最新解决方案的用户,请知道在github.com/sitexw/BlockAdBlock
yeaske 2015年

5
有些人根本不喜欢在网络上进行分析和宣传。我访问过的一些网站告诉我们,收入支持了他们的项目,广告陷入了如此泥潭,以至于变得荒谬。
Paul

7
现在,网站正在做越来越多的事情(并且滥用它,并向我们撒谎说他们的广告不具干扰性,并迫使我们将整个网站列入白名单只是为了进入...)-我们可以使用任何扩展或技巧吗?为了防止他们检测到我们使用AdBlock +?-我不介意在这里或那里看到一些有针对性的横幅广告,但是单击千斤顶和持续不断的全屏视频弹出窗口并不是我的事。
BrainSlugs83'8

1
请查看我的解决方案,它简单又干净。纯JS,没有额外的请求,没有外部库或插件或任何其他BS。
积云雨云

Answers:


410

我的解决方案不特定于某个广告网络,并且非常轻巧。我已经在生产中运行了几年。AdBlock阻止所有包含单词“ ads”的网址。这就是我所做的:

我将一个小js文件添加到了我的webroot中,名称为 ads.js

这是该文件中的唯一代码行

var canRunAds = true;

然后在我页面的某处:

<html>
  <head>
    <script src="/js/ads.js"></script>
  </head>
  <body>
    <script>
      if( window.canRunAds === undefined ){
        // adblocker detected, show fallback
        showFallbackImage();
      }
    </script>
  </body>
</html>

至少在Chrome上,以下adblocker阻止了ads.js之类的文件:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • 幽灵

于2019-02-15更新:

在上面的列表中添加了Ghostery,因为该扩展程序现在还阻止了对ads.js的请求。非常便利。这是否意味着Ghostery实际上正在帮助我们的开发人员通过扩展对其广告进行拦截?

不适用于:

隐私Bad


1
你能给我完整的链接js/ads.js吗?就像我在博客中一样,我必须上载.js某个地方(例如Google云端硬盘),这种情况下的链接不包含ads。如果您提供文件的链接,这将非常有帮助。
2014年

91
该文件仅包含单词“ var canRunAds = true;”。因此,请自行创建。
时间

5
某些广告拦截器似乎没有拦截ads.js文件,例如对我来说,适用于chrome的简单adblock。
Mgamerz 2014年

2
铬的ABP反应良好,因此一切正常!
Maxime Lafarie 2015年

9
您也可以尝试在被adblocker阻止的URL上运行ajax请求。如果成功,则没有adblocker;如果失败,则有adblocker。
SethWhite

138

这不是一个直接的答案,但我会将消息放在要加载的广告后面...而是试图检测到它,只是在广告没有显示时才显示出来。


5
用户仍然可以使用Adblock阻止这些被阻止的广告通知:这是我所知道的唯一缺陷。
安德森·格林

25
这可能很容易,但不是正确的方法,如果您的版式失真或广告加载缓慢,用户可能会瞥见与他无关的错误。另请注意,Adblock正在采取措施来阻止针对ABP用户的干扰性消息。如果您想让用户取消阻止,请通过位于布局外部的简单可隐藏消息来完成(不要将其他元素移开)。查看启用了adblock的duckduckgo.com/?q=foo+bar
Xeevis

1
@Xeevis-我在找什么?-我认为AdBlock +已经阻止了duckduckgo所做的任何事情。
BrainSlugs83 2016年

101

http://thepcspy.com/read/how_to_block_adblock/

使用jQuery:

function blockAdblockUser() {
    if ($('.myTestAd').height() == 0) {
        window.location = 'http://example.com/AdblockNotice.html';
    }
}

$(document).ready(function(){
    blockAdblockUser();
});

当然,您需要为AdblockNotice.html提供一个目标网页,并且.myTestAd类需要反映您的实际广告容器。但这应该可行。

编辑

正如TD_Nijboer推荐的那样,更好的方法是使用:hidden(或:visible我在下面使用的)选择器,以便对其display: none进行检查:

function blockAdblockUser() {
    if ($('.myTestAd').filter(':visible').length == 0) {
        // All are hidden, or "not visible", so:
        // Redirect, show dialog, do something...
    } else if ($('.myTestAd').filter(':hidden').length > 0) {
        // Maybe a different error if only some are hidden?
        // Redirect, show dialog, do something...
    }
}

当然,if如果需要,可以将这两个都合并为一个块。

请注意,它们visibility: hidden也不会被捕获(布局空间会保留,但广告不可见)。要检查,可以使用另一个过滤器:

$('.myTestAd').filter(function fi(){
    return $(this).css('visibility') == 'hidden';
})

这将为您提供一系列“不可见”的广告元素(0从理论上讲,任何元素都大于问题)。


16
在这种情况下重定向是个坏主意。如果您的广告服务中断,则所有访问者都可以重定向到该页面。我还建议使用window onload事件,而不是准备文档。
Andy E

1
更好的检测方法是$('。myTestAd')。is(“:hidden”); 按照手册的规定,它还会检测宽度/高度是否为0,以及display = none。
TD_Nijboer 2014年

6
Redirecting in this case is a bad idea. If your advertising service goes down, all visitors could be redirected to that page.确实。更不用说他们会简单地拼凑一个简单的脚本来击败反措施。此外,您是否真的通过积极主动地使用户有动力禁用其广告拦截器?不,它所要做的就是惹恼他们,使他们对您的网站不利。大多数站点选择只显示一条消息而不是敌对。
Synetech

在Chrome中,这不适用于我。在DOMReady事件中,广告似乎仍然可见。
nwellnhof,2014年

3
请不要因为用户禁用了广告而阻止他们进入您的网站-这只会加剧军备竞赛。-如果您恳请我们将其打开,我们可能会这样做-如果您试图强迫我们,我们将停止访问您的网站,或者在adblocker上报告错误,并获取它已为您的网站修复。-这是adblocker用来保护用户免受攻击的确切行为类型。
BrainSlugs83'8

92

没有额外的要求。没有外部库。简单,简单的JavaScript:

var adBlockEnabled = false;
var testAd = document.createElement('div');
testAd.innerHTML = '&nbsp;';
testAd.className = 'adsbox';
document.body.appendChild(testAd);
window.setTimeout(function() {
  if (testAd.offsetHeight === 0) {
    adBlockEnabled = true;
  }
  testAd.remove();
  console.log('AdBlock Enabled? ', adBlockEnabled)
}, 100);

  • 使用adsbox类创建一个元素(在AdBlock Plus的定义文件中定义为可移动元素)
  • 您将其添加到文档中,并在不久后阅读其offsetHeight
  • 如果安装了AdBlock,则元素将没有任何高度。

感谢基督教海尔曼的职位,我认为这是迄今为止检测的AdBlock的最佳解决方案。


5
为防止故障,您可以添加testAd.style.display = 'absolute'屏幕并将其移出屏幕
Gerald

4
一个好的解决方案,但是对于那些遭受100ms延迟的人,我建议在文档正文中添加以下内容<div id="detect" class="ads ad adsbox doubleclick ad-placement carbon-ads" style="background-color:red;height:300px;width:300px;position: absolute;left:0;top:0;">&nbsp;</div>:(当然,在测试CSS之后应更改为<div id="detect" class="ads ad adsbox doubleclick ad-placement carbon-ads" style="height:1px;width:1px;position: absolute;left:-999px;top:-999px;">&nbsp;</div>
godblessstrawberry

2
@杰拉德·好点。但AFAIK absolute是一个position值。
2016年

我能补充一下吗,我只能在将其添加到window.onload函数中后才能使该解决方案正常工作
Peter Cullen

请注意,这不适用于Firefox的AdBlock
Eda190

42

大多数广告都是以javascript动态加载的。我只是使用onerror事件来检测是否可以加载广告脚本。似乎可以工作。

GoogleAds示例:

<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" onerror="adBlockFunction();"></script>

也可以将其用于其他元素,以查看广告拦截器是否拦截了该内容。如果远程元素不存在或无法访问,则此方法可能会产生误报。


1
这是检查是否在加载广告或not..because手动加载您自己的脚本依靠阻断剂块,一个是要在次失败的最好方法之一..
MaZZly

这似乎是动态加载脚本的最佳解决方案。
卡卡

自编写此书以来,不知道是否有所更改,但是使用STANDS chrome插件的Fair Adblock可以正常执行。
梅尔切斯特

截至2018年3月,仍然是最佳,简单且确定的解决方案
Daniel Vukasovich

就像上面说的那样,它不能与公平的adblocker一起使用,最好检查一下offsetHeight
cieunteung

17

要检测用户是否正在屏蔽广告,您要做的就是在广告javascript中找到一个功能,然后尝试对其进行测试。他们使用哪种方法来屏蔽广告都没有关系。Google Adsense广告的外观如下:

if(!window.hasOwnProperty('google_render_ad') || window.google_render_ad === undefined) { 
    //They're blocking ads, display your banner
}

此处概述了此方法:http : //www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam


8
现在随时都无法定义google_render_ad,typeof(window.google_jobrunner)!='object'对我有用。
Dmitrii Korotovskii

4
由于不是您控制的代码,因此我认为依靠它不是一个好主意,因为对库的重构将使您的脚本为所有用户检测广告块。
帕特里克·忘记2015年

1
typeof如果检查对象的属性,则是开销。使用简单=== undefined
Robo Robok

12

用jQuery我最简单的解决方案是:

$.ajax({
    url: "/scripts/advertisement.js", // this is just an empty js file
    dataType: "script"
}).fail(function () {
    // redirect or display message here
});

advertising.js完全不包含任何内容。当有人使用adblock时,它将失败并调用该函数。


10

我知道已经有足够的答案,但是由于这个问题出现在Google在该主题上搜索“检测广告块”的情况下,因此我想提供一些见解,以防您不使用adsense

具体而言,通过此示例,您可以检测是否使用了Firefox Adblock提供的默认Adblock-list。利用此阻止列表的好处是,有一个元素被CSS id阻止#bottomAd。如果我在页面中包含此类元素并测试其高度,我就会知道adblocking是否处于活动状态:

<!-- some code before -->
<div id="bottomAd" style="font-size: 2px;">&nbsp;</div>
<!-- some code after -->

其余的通过通常的jQuery嫌疑人完成:

$(document).ready( function() {
  window.setTimeout( function() {
    var bottomad = $('#bottomAd');
    if (bottomad.length == 1) {
      if (bottomad.height() == 0) {
        // adblocker active
      } else {
        // no adblocker
      }
    }      
  }, 1);
}

可以看出,我使用setTimeout的超时时间至少为1ms。我已经在各种浏览器上进行了测试,并且大多数时候都直接检查ready总是返回0 的元素;无论adblocker是否处于活动状态。我对此有两个想法:要么尚未完成渲染,要么Adblock尚未启动。我没有去做进一步的调查。


我真的很喜欢这个答案,因为它不涉及发出额外的请求,而不是假的ads.js请求,这种方法有缺点吗?
JeroenVdb 2015年

除了测试长度和高度,还不能只使用if($(“#bottomAd”)。is(':hidden'))...吗?
Evan Langlois,2015年

@EvanLanglois,我知道您是两年前问过的,但是您的问题实际上使我感兴趣,所以我开始研究有关此问题的信息。显然,.is(":hidden")检查取决于高度和宽度是否均为零。如果仅将height设置为0,但div仍然占据宽度,则jQuery不会将其视为“隐藏”。因此,您是否可以说,.is(":hidden")在某种程度上取决于adblocker如何决定调整内容/隐藏内容的大小。
Spencer D

10

我的建议是:不要这样做!

任何将人们视为“做错人”的情况都会导致他们反击。

这是我的建议。

在页面顶部(无论广告是否被屏蔽)在页面顶部放一条不引人注意的消息,并附上文字I *totally* respect your right to block ads和指向标题为另一页面/弹出窗口的链接Read more ...

在另一页上,请清楚说明您了解这是他们的计算机,并且他们可以自由使用广告屏蔽功能。

另外,请以非蓄意的方式明确指出,使用这些阻止程序使您难以传递精美的内容(详细说明原因),并且尽管您希望广告阻止不会在您的网站上发生,这完全是他们的决定。专注于关闭阻止的积极作用。

那些强烈反对广告的人会忽略这一点,但无论如何您都无法说服他们。那些无动于衷的人很可能会因您的上诉而受到影响,因为您没有做完整的“让我走我的路,否则我就带我的球回家”这件事实际上应该是五岁孩子的专属领域。

请记住,没有人将枪对准您的头部,强迫您将自己的东西放到网上。尊重您的读者群/用户,您可能会发现他们之间会有很多互惠互利的关系。


1
怎么样?“看来您使用了广告拦截器。太酷了!我们也可以:)请通过告诉您的朋友我们有关的信息来支持X!”
ADTC'9

3
heh尝试通过这种方式
获利

启用adblock时,我的布局怎么了?
godblessstrawberry

5
如果某个网站强迫我禁用广告拦截器,那么我继续前进。他们输了,我不在乎。我只是从Google提取了一个缓存的副本。
RayfenWindspear '16

1
@高个子,我的回答没有道德。您要定位的受众群体只有现实。而且,尽管您的意图可能已描述,但重新阅读该问题将显示给您的问题是专门要求用户允许广告,而不是清理布局等。是我正在回答的问题,而不是半年后设想的其他问题:-)
paxdiablo

9

他们利用了Google的广告代码创建ID为“ iframe”的iframe的事实。因此,只要您的页面上没有该ID的内容,这对您也将起作用。

<p id="ads">
<script type="text/javascript"><!--
google_ad_client = "their-ad-code-here";
/* 160x600, droite */
google_ad_slot = "their-ad-code-here";
google_ad_width = 160;
google_ad_height = 600;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

</p>

<script type="text/javascript"><!--
if(document.getElementsByTagName("iframe").item(0) == null)
{
    document.write("<div style='width:160px; height:600px; padding-top: 280px; margin-left:5px;border:1px solid #000000; text-align:center; font-family:century gothic, arial, helvetica, sans serif;padding-left:5px;padding-right:5px;'>Advertising seems to be blocked by your browser.<br /><br /><span style='font-size:10px'>Please notice that advertising helps us to host the project.<br /><br />If you find these ads intrusive or inappropriate, please contact me.</span><img src='http://www.playonlinux.com/images/abp.jpg' alt='Adblock Plus' /></div>");
}
--></script>

9

只需在您的网站上添加小脚本即可:

var isAdsDisplayed = true;

名称为adsbygoogle.js

然后执行以下操作:

<script src="/js/adsbygoogle.js"></script>
<script>
if(window.isAdsDisplayed === undefined ) {
  // AdBlock is enabled. Show message or track custom data here
}
</script>

在这里找到这个解决方案


这是真棒的人,非常感谢你💓
Jodyshop

8

我注意到以前的评论使用google adsense作为测试对象。某些页面不使用adsense,并且使用adsense块作为测试并不是一个好主意。因为adsense封锁可能会损害您的SEO。这是我如何通过adblocker检测简单阻止的类的示例:

HTML:

<div class="ad-placement" id="ablockercheck"></div>
<div id="ablockermsg" style="display: none"></div>

jQuery:

$(document).ready(function()
{
   if(!$("#ablockercheck").is(":visible"))
   {
     $("#ablockermsg").text("Please disable adblocker.").show();
   }
});

“ ablockercheck”是adblocker阻止的ID。因此,检查它是否可见,便可以检测到adblocker是否已打开。


7

AdBlock似乎阻止了AdSense(etc)JavaScript文件的加载。因此,如果您使用的是异步版本的AdSense广告,则可以检查是否adsbygoogleArray。由于异步脚本是...异步的,因此必须在几秒钟后进行检查。这是一个粗略的轮廓

window.setTimeout(function(){
    if(adsbygoogle instanceof Array) {
        // adsbygoogle.js did not execute; probably blocked by an ad blocker
    } else {
        // adsbygoogle.js executed
    }
}, 2000);

为了澄清,下面是AdSense异步广告代码的示例:

<!-- this can go anywhere -->
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<!-- this is where the ads display -->
<ins class="adsbygoogle" ...></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

请注意,它adsbygoogle已初始化为Array。该adsbygoogle.js库的更改此数组Object {push: ...}在执行时。在一定时间后检查变量的类型可以告诉您脚本是否已加载。


这将在大多数时间工作,但是如果用户的连接速度较慢(想想移动设备)怎么办?
卡·斯蒂布

6

我在网站上使用的这种方法,也许您会发现它很有用。我认为这是最简单的解决方案。

AdBlocker会阻止特定的类和html元素,方法是在开发者控制台中检查所有被阻止广告的选择器(它们都已列出),您可以看到哪些元素将始终被阻止。

例如,只需检查stackoverflow上的此问题页面,您就会看到一堆被阻止的广告。

例如,具有bottom-adclass的任何元素都会被自动阻止。

  1. 我用bottom-ad类创建了一个非空的div元素: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. 页面加载后,只需检查此元素是否隐藏即可。我使用了jQuery,但随时可以使用javascript: $('.bottom-ad').css('display') == "none"或者通过使用甚至更好$('.bottom-ad').is(':visible')

如果值为true,则AdBlocker处于活动状态。


6

您不需要额外的HTTP请求,您可以简单地计算假添加的高度。

顺便说一下,这是与adblocker避免渲染的元素匹配的完整列表

window.adBlockRunning = function() {
    return (getComputedStyle(document.getElementById("detect"))["display"] == "none") ? true : false;
  }()

console.log(window.adBlockRunning);
#detect {
  height: 1px;
  width: 1px;
  position: absolute;
  left: -999em;
  top: -999em
}
<div id="detect" class="ads ad adsbox doubleclick ad-placement carbon-ads"></div>


6

安全的方法是将广告包装在里面<div>并检查高度

<div id="check-ab">
/* your ads code */
</div>

setTimeout(function(){
  if(document.getElementById("check-ab").offsetHeight === 0){
    console.log("ads blocked");
  }
  else{
    console.log("ads running");
  }
}, 100);

它与adblock plus和bluehell防火墙一起使用。


6

一种检查广告块的有效方法:只需尝试触发Google广告的网址,即可检查是否启用了广告块。如果是,则运行callback_has_adblock,否则,运行callback_no_adblock。该解决方案花费了一个请求更多的费用,但至少可以起作用:

var hasAdBlock = function (callback_has_adblock, callback_no_adblock) {

    $.getScript( "https://pagead2.googlesyndication.com/pagead/show_ads.js" )
        .done(function( script, textStatus ) {
            callback_no_adblock();
        })
        .fail(function( jqxhr, settings, exception ) {
            callback_has_adblock();
    });
};

该解决方案适用于所有类型的广告,不仅适用于google adsense。


一些adblockers阻止jQuery,然后该脚本无法运行,因为“未定义$”。最好使用纯js。
纽约

3

尽管这个问题年代久远,但我最近发现它非常有用,因此只能假定仍有其他人在查看它。在这里和其他地方查看之后,我推测间接检测广告拦截器的三项主要客户端检查是检查被阻止的 div/ img,被阻止的iframes和被阻止的资源(javascript文件)。

可能是在顶部或偏执狂,但它涵盖了广告拦截系统,该系统仅拦截一个或两个选区,因此,如果仅执行一项检查,则可能未被覆盖。

在运行检查的页面上,添加:(我使用的是jQuery)

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="advertisement.js"></script>
<script type="text/javascript" src="abds.js"></script>

并将以下内容添加到页面上的其他位置:

<div id="myTestAd"><img src="http://placehold.it/300x250/000000/ffffff.png&text=Advert" /></div>

我使用了一个带有诱饵名称的div,以及一个外部托管的图片,该图片的文字为“ Advert”,并且使用的是AdSense使用的尺寸(感谢placehold.it!)。

在其中,advertisement.js您应该在文档中添加一些内容,以便我们稍后查看。尽管看起来您和以前一样,但实际上是在检查文件(advertisement.js)本身是否正在加载,而不是输出。

$(document).ready(
{

    $("body").append("<div id=\"myTestAd2\">check</div>");

});

然后是将所有内容组合在一起的广告拦截器检测脚本

$(document).ready(function()
{
    var ifr = '<iframe id="adServer" src="http://ads.google.com/adserver/adlogger_tracker.php" width="300" height="300"></iframe>';
    $("body").append(ifr);
});

$(window).on("load",function()
{

    var atb = $("#myTestAd");
    var atb2= $("#myTestAd2");
    var ifr = $("#adServer");

    setTimeout(function()
    {

        if( (atb.height()==0) ||
            (atb.filter(":visible").length==0) ||
            (atb.filter(":hidden").length>0) ||
            (atb.is("hidden")) ||
            (atb.css("visibility")=="hidden") ||
            (atb.css("display")=="none") ||
            (atb2.html()!="check") ||
            (ifr.height()!=300) ||
            (ifr.width()!=300) )
        {
            alert("You're using ad blocker you normal person, you!");
        }

    },500);

});

当文档准备就绪(即,标记已加载)时,我们还将iframe添加到文档中。然后,当窗口是加载,即包含内容。图片等已加载,我们检查:

  • 第一个测试div的尺寸和可见性。
  • 第二测试div的内容是“检查”,因为它本来如果advertimsent.js阻止。
  • iframe的尺寸(我想是可见性,因为隐藏的对象没有高度或宽度?)

以及样式:

div#myTestAd, iframe#adServer
{
    display: block;
    position: absolute;
    left: -9999px;
    top: -9999px;
}

div#myTestAd2
{
    display: none;
}

希望这可以帮助


3

如果使用新的AdSense代码,则可以轻松进行检查,而无需借助内容检查或CSS检查。

将广告正常放置在标记中:

<ins class="adsbygoogle" style="display: block;"
   data-ad-client="ca-pub-######"
   data-ad-slot="#######"
   data-ad-format="auto"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>

然后,您调用页面底部的adsense代码(请注意,调用脚本时请勿使用该"async"标志adsbygoogle.js):

<script src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

然后在下面添加以下代码片段:

<script>
if (!adsbygoogle.loaded) {
   // do something to alert the user
}
</script>

AdSense的总是创建/设置标志adsbygoogle.loaded,以true当加载广告,您可以将检查在setTimeout函数延迟几秒检查。


2
当然,这取决于如何在广告被封锁。如果您的广告拦截软件阻止了AdSense完全加载,则可以使用。但是,如果您的adblocking软件正在执行诸如将CSS display属性设置为“ none”或将各个div的高度设置为0之类的操作,则此操作可能无效。
曼谷人

真正。我认为没有一种简单的方法可以捕获100%的所有广告块,但至少您可以捕获其中的一些。
Troy Morehouse 2015年

3

大多数adblocker取消对元素的HTTP请求ads.js0px为其创建元素,但有时adblocker 删除了DOM,并且由于未检查元素的存在,上面的某些回答将失败。

使用setTimeout()是一种好习惯,因为没有它,将使脚本与adblocker竞争。

下面的脚本将检查dom是否存在/已删除,并检查offsetHeight元素是否存在。

setTimeout(function() {
  var a = document.querySelector('.showads'),
    b = a ? (a.offsetHeight ? false : true) : true;
  console.log('ads blocked?', b)
}, 200); // don't too fast or will make the result wrong.
<div class="ads showads">
  Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</div>


2

以上所有答案均有效,但是大多数答案不适用于DNS级广告拦截。

DNS级广告拦截器(例如pi-hole的广告阻止程序)基本上返回NXDOMAIN(域不存在)以获取广告阻止域的列表(例如,telemetry.microsoft.com将“不存在”)。

有几种方法可以避免此问题:

方法A:通过IP地址而非域请求广告。

这种方法有点烦人,因为您必须跟踪IP地址。如果您的代码没有得到很好的维护或定期更新,这将是一个问题。

方法B:阻止所有失败的请求-即使客户端报告NXDOMAIN。

如果它是“合法的” NXDOMAIN,这对于用户来说将非常烦人。


1
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>var adb=true;</script>
<script src="./getbanner.cfm?"></script>
<script>
$(document).ready(function(){if(adb)alert('AdBlock!');});
</script>

并在getbanner.cfm文件中:

adb = false;

我认为这是检测adblock的最简单方法。


其他被阻止的文件:easylist-downloads.adblockplus.org/easylist.txt,它是默认的AdBlock过滤器
mikas,2013年

亚行似乎true一直都是
2014年

1

这对我有用:

function isAdBlocked() {
     return (typeof(window.google_jobrunner) === "undefined") ? true : false;
}

$(document).ready(function(){
    if(isAdBlocked()) {
       alert('Y U NO LIKE ADS?');
    }
});

刚刚尝试过 不起作用。即使未安装任何广告拦截软件,也始终返回true。
ecnepsnai

请注意,这仅在您使用AdSense的页面上有效。否则,它将始终返回true,因为这是正确的响应-在所有页面中都不会检测到window.google_jobrunner。仅使用Google AdSense的用户。您实际上可以在我的网站上看到此代码:ruddl.com
jesal 2013年

有趣的是,您的方法恰好使用了与HowToGeek所使用的相同的消息。记录下来,显示一个消息框只会使用户对您的网站感到厌烦。大多数网站都选择在页面上显示消息(HTG尝试同时执行这两种操作,但只有烦人的弹出窗口有效)。
Synetech

1

我知道已经回答了这个问题,但是我查看了建议的示例站点,然后看到他们这样做:

<script type="text/javascript">
if(document.getElementsByTagName("iframe").item(0) == null) {
    document.write("<div style="width: 160px; height: 600px; padding-top: 280px; margin-left: 5px; border: 1px solid #666666; color: #FFF; background-color: #666; text-align:center; font-family: Maven Pro, century gothic, arial, helvetica, sans-serif; padding-left: 5px; padding-right: 5px; border-radius: 7px; font-size: 18px;">Advertising seems to be blocked by your browser.<br><br><span style="font-size: 12px;">Please notice that advertising helps us to host the project.<br><br>If you find these ads intrusive or inappropriate, please contact me.</span><br><img src="http://www.playonlinux.com/images/abp.png" alt="Adblock Plus"></div>");
};
</script>

1

无需超时和DOM嗅探。只需尝试从流行的广告网络加载脚本,然后查看广告拦截器是否拦截了HTTP请求。

/**
 * Attempt to load a script from a popular ad network. Ad blockers will intercept the HTTP request.
 *
 * @param {string} url
 * @param {Function} cb
 */
function detectAdBlockerAsync(url, cb){
    var script = document.createElement('script');

    script.onerror = function(){
        script.onerror = null;
        document.body.removeChild(script);
        cb();
    }

    script.src = url;
    document.body.appendChild(script);
}

detectAdBlockerAsync('http://ads.pubmatic.com/AdServer/js/gshowad.js', function(){
    document.body.style.background = '#c00';
});

1

刚刚创建了自己的“插件”来解决此问题,并且效果很好:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

我添加了移动兼容性和jsBlocking检测等...(就像向用户显示的覆盖图,要求用户禁用adBlocking / jsBlocking软件);还使其响应灵敏。

它是在Coffeeware许可下开源的。


感谢您的努力,但似乎不适用于adblock ...至少在撰写此评论时为止。
2014年

它与adBlock一起使用,我在其中实现了该插件的站点是calyphrox.net,任何人都可以在其中验证该插件是否正常工作。
Jmlevick 2014年

3
链接已死...我们可以删除它吗?
Evan Langlois,2015年

2
请更新链接,这使它成为一个错误的答案。
Yazan Rawashdeh'3

0

我了解您的紧张状况,您可以检查元素是否已由脚本创建或元素是否被隐藏。而且,如果我们谈论广告屏蔽,则只能依靠元素的可见性,而不能依靠元素的存在。

如果当前无法访问脚本(DNS错误,远程Web服务器错误,离线Web页面预加载等),则用第三方脚本创建的元素将永远不会出现,并且您总是会得到误报。

所有其他带检查的答案都是正确的,但请记住这一点。


0

timing's 答案很不错,但是已经无法使用了,所以我已经将js文件的名称从“ ads”更新为“ adsense”,并且可以正常工作了!

这是代码,也许可以帮助某人:

<html>
      <head>
            <script src="/adsense.js"></script>
      </head>
             <body>
                   <script>
                           if( window.adblockDetecter === undefined ){
                           // Do anithing, adblocker detected!
                           alert('Adblocker Detected!');}
                   </script>
            </body>
</html>

在Js文件中,仅输入以下行: var adblockDetecter = true;


0

现在有一种更好的方法,可以使用称为AdBlock Detector 的简单JS脚本执行此操作。
这是使用方法:
将其添加到您的<head>部分:

<script type="text/javascript">
window.onload = function() {
var iframe = document.createElement('iframe'),
    randomDomain = Math.floor(Math.random() * (10000 - 100 + 1)) + 100,
    iframeLoaded = true;

iframe.src = "http://"+ randomDomain +".com/ads.html";
iframe.height = ".1px";
iframe.width = ".1px";
iframe.id = 'some-ad';
iframe.onload = function() {iframeLoaded = false;};

document.body.appendChild(iframe);

setTimeout(function() { 
    var someAd = document.getElementById('some-ad');
    if(!iframeLoaded ||
       someAd == null || 
       someAd.style.display == "none" || 
       someAd.style.display == "hidden" || 
       someAd.style.visibility == "hidden" || 
       someAd.offsetHeight == 0)
        document.getElementById('ab-message').style.display = 'block';
    someAd.remove();
}, 500);
};
</script>`<br>

现在,您可以ab-message在想要向AdBlock用户显示消息的任何地方使用ID:

<div id="ab-message" style="display: none">Your message here!</div>

注意添加的内联样式最初是将其隐藏的(当然,您也可以从自己的CSS文件中执行此操作)。
另请注意,这需要500毫秒,这是因为它必须等待adblocker进行操作,否则将无法正常工作。

关于此脚本如何工作的一些解释

首先,它会向iframe附加一个随机生成的链接的源。(它是随机生成的,因为某些adblock是智能的,在某些时候,它们意识到链接是伪造的)。
然后,它在该iframe上运行多次检查(是否已成功加载或是否修改了其样式)。如果这些测试之一为真,则它将ab-message向adblock用户显示该元素。

该脚本适用于大多数(如果不是全部)广告拦截器。

额外

确实,创建一个要点是没有意义的,但是我创建了一个Github项目,但是仍然可以检查它并给它加星标,以帮助您。
abDetector:简单的香草JavaScript AdBlock检测器。
请享用。


解决方案差。外部.js文件很容易被阻止。
Bangkokian

@Bangkokian只需复制并在显示javascript文件或index.js(或其他内容)的消息中引用它(及其许可证)。
BlueEyesWhiteDragon

1
@BlueEyesWhiteDragon你是正确的。但这根本不是特洛伊最初的答案。现在已经对其进行了100%的编辑以显示嵌入式脚本。我的评论站了。他最初的答案是专门使用外部脚本。stackoverflow.com/posts/34738388/revisions
Bangkokian

正是@Bangkokian,我忘了提及由于您的评论,我编辑了我的答案以遵循SO准则,并使其成为内联脚本。谢谢。
Nick Rameau

0

您可以检查出来,这可能有助于 detect-adblocker

它是一个定时答案的实现

在head标记中的任何脚本之前添加此代码:

<head>
    <title></title>
    <meta/>

    <!--adBlocker detection code - START-->
    <script src="//adblocker.fortiapp.com/ads.js"></script>
    <script>
        (function (i, o, g, r) {
            i[o] = (typeof i[o] == typeof undefined) ? g : r
        })(window, 'adblocker', true, false);
    </script>
    <!--adBlocker detection code - END-->

    // Other scripts

</head>

然后稍后使用它:

if (adblocker) {
    // the add blocker is enabled
}else{
    // ad blocker is not enabled
}

没用 总是表明广告已被屏蔽。
Himanshu Aggarwal,2016年

检查window.adblocker浏览器控制台中的值(如果返回),true则启用adblocker,否则它将返回,false您可以查看完整的文档 detect-adblocker
Mustafa Dwekat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.