我希望能够检测用户访问我的网站时是否正在使用adblocking软件。如果他们正在使用它,我想显示一条消息,要求他们关闭它以支持该项目,例如本网站一样。
如果您进入该站点,并且浏览器启用了某种adblock软件,则该站点会显示一个小横幅,告诉用户该广告收入用于托管该项目,而不是显示实际的广告,因此应考虑关闭Adblock 。
我想在我的网站上这样做,我在上面使用adsense广告,该怎么办?
我希望能够检测用户访问我的网站时是否正在使用adblocking软件。如果他们正在使用它,我想显示一条消息,要求他们关闭它以支持该项目,例如本网站一样。
如果您进入该站点,并且浏览器启用了某种adblock软件,则该站点会显示一个小横幅,告诉用户该广告收入用于托管该项目,而不是显示实际的广告,因此应考虑关闭Adblock 。
我想在我的网站上这样做,我在上面使用adsense广告,该怎么办?
Answers:
我的解决方案不特定于某个广告网络,并且非常轻巧。我已经在生产中运行了几年。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之类的文件:
于2019-02-15更新:
在上面的列表中添加了Ghostery,因为该扩展程序现在还阻止了对ads.js的请求。非常便利。这是否意味着Ghostery实际上正在帮助我们的开发人员通过扩展对其广告进行拦截?
不适用于:
隐私Bad
js/ads.js
吗?就像我在博客中一样,我必须上载.js
某个地方(例如Google云端硬盘),这种情况下的链接不包含ads
。如果您提供文件的链接,这将非常有帮助。
这不是一个直接的答案,但我会将消息放在要加载的广告后面...而是试图检测到它,只是在广告没有显示时才显示出来。
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
从理论上讲,任何元素都大于问题)。
Redirecting in this case is a bad idea. If your advertising service goes down, all visitors could be redirected to that page.
确实。更不用说他们会简单地拼凑一个简单的脚本来击败反措施。此外,您是否真的通过积极主动地使用户有动力禁用其广告拦截器?不,它所要做的就是惹恼他们,使他们对您的网站不利。大多数站点选择只显示一条消息而不是敌对。
没有额外的要求。没有外部库。简单,简单的JavaScript:
var adBlockEnabled = false;
var testAd = document.createElement('div');
testAd.innerHTML = ' ';
testAd.className = 'adsbox';
document.body.appendChild(testAd);
window.setTimeout(function() {
if (testAd.offsetHeight === 0) {
adBlockEnabled = true;
}
testAd.remove();
console.log('AdBlock Enabled? ', adBlockEnabled)
}, 100);
感谢基督教海尔曼的职位,我认为这是迄今为止检测的AdBlock的最佳解决方案。
testAd.style.display = 'absolute'
屏幕并将其移出屏幕
<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;"> </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;"> </div>
)
absolute
是一个position
值。
window.onload
函数中后才能使该解决方案正常工作
大多数广告都是以javascript动态加载的。我只是使用onerror事件来检测是否可以加载广告脚本。似乎可以工作。
GoogleAds示例:
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" onerror="adBlockFunction();"></script>
也可以将其用于其他元素,以查看广告拦截器是否拦截了该内容。如果远程元素不存在或无法访问,则此方法可能会产生误报。
offsetHeight
要检测用户是否正在屏蔽广告,您要做的就是在广告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
typeof
如果检查对象的属性,则是开销。使用简单=== undefined
。
用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在该主题上搜索“检测广告块”的情况下,因此我想提供一些见解,以防您不使用adsense。
具体而言,通过此示例,您可以检测是否使用了Firefox Adblock提供的默认Adblock-list。利用此阻止列表的好处是,有一个元素被CSS id阻止#bottomAd
。如果我在页面中包含此类元素并测试其高度,我就会知道adblocking是否处于活动状态:
<!-- some code before -->
<div id="bottomAd" style="font-size: 2px;"> </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尚未启动。我没有去做进一步的调查。
.is(":hidden")
检查取决于高度和宽度是否均为零。如果仅将height设置为0,但div仍然占据宽度,则jQuery不会将其视为“隐藏”。因此,您是否可以说,.is(":hidden")
在某种程度上取决于adblocker如何决定调整内容/隐藏内容的大小。
我的建议是:不要这样做!
任何将人们视为“做错人”的情况都会导致他们反击。
这是我的建议。
在页面顶部(无论广告是否被屏蔽)在页面顶部放一条不引人注意的消息,并附上文字I *totally* respect your right to block ads
和指向标题为另一页面/弹出窗口的链接Read more ...
。
在另一页上,请清楚说明您了解这是他们的计算机,并且他们可以自由使用广告屏蔽功能。
另外,请以非蓄意的方式明确指出,使用这些阻止程序使您难以传递精美的内容(详细说明原因),并且尽管您希望广告阻止不会在您的网站上发生,这完全是他们的决定。专注于关闭阻止的积极作用。
那些强烈反对广告的人会忽略这一点,但无论如何您都无法说服他们。那些无动于衷的人很可能会因您的上诉而受到影响,因为您没有做完整的“让我走我的路,否则我就带我的球回家”这件事实际上应该是五岁孩子的专属领域。
请记住,没有人将枪对准您的头部,强迫您将自己的东西放到网上。尊重您的读者群/用户,您可能会发现他们之间会有很多互惠互利的关系。
他们利用了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>
我注意到以前的评论使用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是否已打开。
AdBlock似乎阻止了AdSense(etc)JavaScript文件的加载。因此,如果您使用的是异步版本的AdSense广告,则可以检查是否adsbygoogle
为Array
。由于异步脚本是...异步的,因此必须在几秒钟后进行检查。这是一个粗略的轮廓:
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: ...}
在执行时。在一定时间后检查变量的类型可以告诉您脚本是否已加载。
我在网站上使用的这种方法,也许您会发现它很有用。我认为这是最简单的解决方案。
AdBlocker会阻止特定的类和html元素,方法是在开发者控制台中检查所有被阻止广告的选择器(它们都已列出),您可以看到哪些元素将始终被阻止。
例如,只需检查stackoverflow上的此问题页面,您就会看到一堆被阻止的广告。
例如,具有bottom-ad
class的任何元素都会被自动阻止。
bottom-ad
类创建了一个非空的div元素:
<div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
$('.bottom-ad').css('display') == "none"
或者通过使用甚至更好$('.bottom-ad').is(':visible')
如果值为true
,则AdBlocker处于活动状态。
您不需要额外的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>
一种检查广告块的有效方法:只需尝试触发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。
尽管这个问题年代久远,但我最近发现它非常有用,因此只能假定仍有其他人在查看它。在这里和其他地方查看之后,我推测间接检测广告拦截器的三项主要客户端检查是检查被阻止的 div
/ img
,被阻止的iframe
s和被阻止的资源(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添加到文档中。然后,当窗口是加载,即包含内容。图片等已加载,我们检查:
advertimsent.js
是不阻止。以及样式:
div#myTestAd, iframe#adServer
{
display: block;
position: absolute;
left: -9999px;
top: -9999px;
}
div#myTestAd2
{
display: none;
}
希望这可以帮助
如果使用新的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函数延迟几秒检查。
大多数adblocker取消对元素的HTTP请求ads.js
并0px
为其创建元素,但有时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>
<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的最简单方法。
true
一直都是
这对我有用:
function isAdBlocked() {
return (typeof(window.google_jobrunner) === "undefined") ? true : false;
}
$(document).ready(function(){
if(isAdBlocked()) {
alert('Y U NO LIKE ADS?');
}
});
我知道已经回答了这个问题,但是我查看了建议的示例站点,然后看到他们这样做:
<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>
无需超时和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';
});
刚刚创建了自己的“插件”来解决此问题,并且效果很好:
adBuddy + jsBuddy:
我添加了移动兼容性和jsBlocking检测等...(就像向用户显示的覆盖图,要求用户禁用adBlocking / jsBlocking软件);还使其响应灵敏。
它是在Coffeeware许可下开源的。
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;
现在有一种更好的方法,可以使用称为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检测器。
请享用。
您可以检查出来,这可能有助于 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
}