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

我希望能够检测用户访问我的网站时是否使用了广告拦截软件。 如果他们正在使用它,我想显示一个消息,要求他们closures它以支持该项目,就像这个网站一样。

如果您进入该网站,并且您的浏览器启用了某种adblock软件,则该网站不会显示实际的广告,而会显示一个小横幅,告知用户广告收入用于托pipe该项目,并且应该考虑closuresAdblock 。

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

我的解决scheme并不特定于特定的广告networking,而且非常轻巧。 我已经在生产几年了。 AdBlock阻止所有包含单词“ads”的url。 所以这就是我所做的:

我添加了一个名为ads.js的小型js文件到我的webroot

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

 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> 

像ads.js这样的文件在Chrome上至less被这些adblock拦截器阻止:

  • 广告拦截
  • Adblock Plus
  • Adblock Pro

(是的,这些是完全不同的浏览器扩展)

这不适用于:

  • Ghostery(只阻止实际的双击/ appnexusurl)

不是一个直接的答案,但我会把广告后面的信息加载…而是试图检测它,只是当广告没有显示。

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_Nijboerbuild议的,更好的方法是使用:hidden (或:visible ,如下所示)select器,以便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也不会被捕获(布局空间保留,但广告不可见)。 要检查,可以使用另一个filter:

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

这将给你一系列“隐形”的广告元素(理论上任何大于0的问题都是一个问题)。

没有额外的要求。 没有外部库。 简单而简单的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); 

大部分广告都是以javascriptdynamic加载的。 我只是使用onerror事件来检测是否可以加载广告脚本。 似乎工作。

Google广告示例:

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

这也可以在其他元素上使用,以查看广告拦截器是否阻止了内容。 如果远程元素不存在或无法到达,此方法可能会产生误报。

要检测用户是否阻止了广告,您只需在广告JavaScript中find一个函数,然后尝试进行testing。 使用什么方法阻止广告并不重要。 以下是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

我知道已经有足够的答案,但由于这个问题出现在谷歌search“检测adblock”的话题,我想提供一些洞察力,以防你不使用的AdSense

具体来说,在这个例子中,您可以检测是否使用Firefox Adblock提供的默认Adblock列表。 在这个blocklist中有一个被CSS id #bottomAd阻塞的元素。 如果我在页面中包含这样一个元素并testing它的高度,我知道广告拦截是否处于活动状态:

 <!-- 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至less有1ms的超时。 我已经在各种浏览器和大多数时间testing过了,直接检查ready元素总是返回0; 不pipeadblocker是否激活。 我对此有两个想法:渲染还没有完成,或者Adblock没有启动。 我没有打算进一步调查。

我最简单的解决scheme与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时,它失败,函数被调用。

他们正在利用Google的广告代码创buildID为“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="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.comhttp://img.dovov.comabp.jpg' alt='Adblock Plus' /></div>"); } --></script> 

我注意到以前的评论使用谷歌的AdSense作为对象进行testing。 有些网页不使用AdSense,并使用AdSense块作为testing是不是一个好主意。 因为AdSense块可能会损害您的search引擎优化。 这里是我如何检测由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是否打开。

AdBlock似乎阻止AdSense(等)JavaScript文件的加载。 因此,如果您使用的是AdSense广告的asynchronous版本,则可以检查adsbygoogle是否为Array 。 由于asynchronous脚本是asynchronous的,因此必须在几秒钟后检查。 这是一个粗略的概述

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

为了澄清,以下是AdSenseasynchronous广告代码的示例:

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

请注意adsbygoogle被初始化为一个数组。 adsbygoogle.js库在执行时将该数组更改为Object {push: ...} 。 在一段时间后检查variables的types可以告诉你脚本是否被加载。

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

 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> 

在这里find解决scheme

我在我的网站上使用这种方法,也许你会发现它有帮助。 在我看来,这是最简单的解决scheme。

AdBlocker阻止特定的类和html元素,通过检查开发者控制台中的任何被封锁的广告的这些select器(他们都列出),你可以看到哪些元素将永远被阻止。

例如,只要在stackoverflow上检查这个问题页面,你会看到一堆被封锁的广告。

例如,任何具有bottom-ad类的元素都会被自动屏蔽。

  1. 我创build了一个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处于活动状态。

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

顺便说一句,这是一个完整的列表匹配adblockers避免呈现的元素。

 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> 

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

任何你把人们视为“不法行为者”的情况都会导致他们反击。

这是我的build议。

在页面顶部放置一个小小的不显眼的信息(不pipe广告是否被阻止),而I *totally* respect your right to block ads并链接到另一个页面/popup窗口“ Read more ...

在另一页上,清楚地表明你明白这是他们的电脑,他们可以自由使用广告屏蔽。

同样要以非指责的方式清楚说明,使用这些阻止程序会使您更难以提供精彩的内容(详细解释原因),而且您希望广告拦截不会发生在您的网站上,这完全是他们的决定。 关注closures阻塞的积极因素。

那些强烈反对广告的人会忽略这一点,但是你从来没有机会说服他们。 那些无动于衷的人可能会因为你的吸引力而摇摆不定,因为你并没有做到“让我走我的路,我会把我的球,回家”的东西,诚实地应该是五岁的孩子的专属领域。

请记住,没有人拿枪对你的头,强迫你把你的东西上网。 尊重你的读者/用户,你可能会发现很多人会回报。

如果使用新的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代码(请注意在调用adsbygoogle.js脚本时不要使用"async"标志):

 <script src="pagead/js/adsbygoogle.js"></script> 

然后添加下面这个小小的代码:

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

在加载广告时,AdSense始终adsbygoogle.loadedadsbygoogle.loadedtrue ,您可以将支票放置在setTimeout函数中,以将支票延迟几秒钟。

安全的方法是将您的广告包裹在<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防火墙。

检查是否存在广告屏蔽的有效方法:只需通过尝试触发Google广告的url来检查是否启用了广告屏蔽。 如果是,则运行callback_has_adblock,如果没有则运行callback_no_adblock。 这个解决scheme花费了一个更多的请求,但至less它工作:

 var hasAdBlock = function (callback_has_adblock, callback_no_adblock) { $.getScript( "pagead/show_ads.js" ) .done(function( script, textStatus ) { callback_no_adblock(); }) .fail(function( jqxhr, settings, exception ) { callback_has_adblock(); }); }; 

这个解决scheme适用于所有types的广告,不仅是谷歌的AdSense。

尽pipe这个问题的年龄,我最近发现它非常有用,因此只能假设还有其他人正在观看它。 看了这里和其他地方后,我猜测主要的三个客户端检查间接检测广告拦截器是检查阻止的div / img ,阻止iframe和阻止的资源(javascript文件)。

也许它是过于顶端或偏执,但它涵盖了广告拦截系统,只阻止一个或两个select,因此可能没有被覆盖,只有你做了一个检查。

在页面上运行检查添加:(我正在使用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”文本的外部托pipe图像以及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添加到文档中。 然后,当窗口被加载 ,即内容包括。 图像等被加载,我们检查:

  • 第一个testingdiv的尺寸和可见性。
  • 第二个testingdiv的内容是“检查”,就像它没有阻止advertimsent.js
  • iframe的尺寸(我猜可见度,作为一个隐藏的对象没有高度或宽度?)

风格:

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

希望这可以帮助

我知道这已经回答了,但我看了build议的示例网站,我看到他们这样做:

 <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.comhttp://img.dovov.comabp.png" alt="Adblock Plus"></div>"); }; </script> 

不需要超时和DOM嗅探。 只需尝试从热门广告networking加载脚本,并查看广告拦截器是否拦截了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('AdServer/js/gshowad.html', function(){ document.body.style.background = '#c00'; }); 

刚刚创build了我自己的“插件”来解决这个问题,它工作得很好:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

我添加了移动兼容性和jsBlocking检测等等…(就像向用户显示的要求禁用adBlocking / jsBlocking软件的叠加 )一样。 也使它响应友好。

根据“ 咖啡软件许可证”进行开源。

 <script src="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最简单的方法。

这对我来说是有效的:

 function isAdBlocked() { return (typeof(window.google_jobrunner) === "undefined") ? true : false; } $(document).ready(function(){ if(isAdBlocked()) { alert('YU NO LIKE ADS?'); } }); 

timing's答案是不错的想法,但没有更多的工作,所以我已经更新了从'广告'的'adsense'的js文件的名称,它正在像一个魅力工作!

这里是代码,也许这将有助于某人:

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

现在有一个更好的方法来使用一个名为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> 

现在,您可以在任何要显示AdBlock用户ab-message地方使用ab-message id:

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

注意添加的内联样式来隐藏它(当然,你也可以从你自己的CSS文件做到这一点)。
另外请注意,这需要500毫秒,这是因为它必须等待adblocker做它的事情,否则将无法正常工作。

对这个脚本如何工作的一点解释

首先,它附加一个iframe与一个随机生成的链接的来源。 (它是随机生成的,因为一些adblocks是聪明的,在某些时候,他们意识到一个链接是假的)。
然后,它会在该iframe上运行多个检查(如果它已成功加载或者其样式已被修改)。 如果其中一个testing结果为真,则会显示ab-message元素以阻止用户。

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

额外

没有任何意义,真的可以创造一个主意,但是我创build了一个Github项目,但是,如果它帮助了你,那么请检查一下,然后看看它。
abDetector:简单的香草JavaScript AdBlock检测器。
请享用。

你可以检查一下,它可能有助于检测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 } 

I understand your tension and you can check if element has been created by script or element is hidden. And if we speak about ad-blocking you can count only on the element visibility, not on the element presence.

Element created with third-party script will never be present, that if script is not reachable at the moment (DNS error, remote web server error, offline web page preload, etc), and you'll always get false positive.

All other answers with checks are correct, but keep this in mind.

I'm a bit late to the party here but here's the simplest solution I know for the old AdSense code with jQuery:

 $ads = $("ins"); if ($ads.length == 0) { // Replacement code about you needing ad income } 

And in plain JavaScript:

 $ads = document.getElementsByTagName("ins"); if ($ads.length == 0) { // Replacement code about you needing ad income } 

For $ads you can use any selector that you know is consistent with the ad being generated. Eg for the new AdSense code you can use $("iframe#google_ads_frame1") .

If you have problem with adblock blocking new tab in browser you can do something like this:

 $('a').click(function(e){ // change $('a') into more specific var w = window.open(this.href, '_blank'); setTimeout(function(){ if(w.closed){ alert('Adblock detected!'); } }, 300); // if you can close new tab in less than 0.3 sec you're very fast ;) e.preventDefault(); // return false if you like }); 

This code is ONLY useful IF you don't want to block entire site AND just tell users why their browser tabs are closed 😉