我希望能够在用户访问我的网站时检测用户是否使用了广告拦截软件.如果他们正在使用它,我想显示一条消息,要求他们关闭它以支持该项目,就像这个网站一样.
如果您进入该网站并且您的浏览器启用了某种广告拦截软件,则该网站会显示一个小横幅,告诉用户广告收入用于托管项目,他们应该考虑关闭Adblock .
我想在我的网站上这样做,我正在使用adsense广告,我该怎么做?
tim*_*ing 391
我的解决方案并非特定于某个广告网络,而且非常轻量级.我已经在生产中运行了几年.AdBlock会阻止包含"广告"一词的所有网址.所以这就是我做的:
我在我的webroot上添加了一个小js文件的名字 ads.js
这是该文件中唯一的代码行
var canRunAds = true;
Run Code Online (Sandbox Code Playgroud)
然后在我的页面的某个地方:
<html>
<head>
<script src="/js/ads.js"></script>
</head>
<body>
<script>
if( window.canRunAds === undefined ){
// adblocker detected, show fallback
showFallbackImage();
}
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
ads.js等文件至少被Chrome上的这些广告拦截器拦截:
2019-02-15更新:
在上面的列表中添加了Ghostery,因为扩展现在也阻止了对ads.js的请求.非常便利.这是否意味着Ghostery实际上正在帮助我们开发人员检测广告的扩展名?
不适用于:
隐私獾
小智 138
这不是一个直接的答案,但我会将广告背后的信息加载...而不是试图检测它,它只会在广告没有时显示出来.
Jar*_*ish 102
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();
});
Run Code Online (Sandbox Code Playgroud)
当然,您需要拥有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...
}
}
Run Code Online (Sandbox Code Playgroud)
当然,if如果需要,这两者都可以组合成一个块.
请注意,它们visibility: hidden也不会被捕获(布局空间停留,但广告不可见).要检查,可以使用另一个过滤器:
$('.myTestAd').filter(function fi(){
return $(this).css('visibility') == 'hidden';
})
Run Code Online (Sandbox Code Playgroud)
这将为您提供一系列"隐形"的广告元素(0理论上任何一个都不是问题).
Cum*_*bus 87
没有额外的要求.没有外部库.简单明了的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);Run Code Online (Sandbox Code Playgroud)
感谢基督教海尔曼的职位,我认为这是迄今为止检测的AdBlock的最佳解决方案.
小智 40
大多数广告都是在javascript中动态加载的.我刚刚使用onerror事件来检测是否可以加载广告脚本.似乎工作.
GoogleAds示例:
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" onerror="adBlockFunction();"></script>
Run Code Online (Sandbox Code Playgroud)
这也可以用于其他元素,以查看广告拦截器是否阻止内容.如果远程元素不存在或无法到达,则此方法可能会产生误报.
Bea*_*eau 19
要检测用户是否阻止了广告,您只需在广告JavaScript中找到一个功能并尝试对其进行测试即可.他们用什么方法阻止广告并不重要.以下是Google Adsense广告的外观:
if(!window.hasOwnProperty('google_render_ad') || window.google_render_ad === undefined) {
//They're blocking ads, display your banner
}
Run Code Online (Sandbox Code Playgroud)
此方法概述如下:http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam
Luc*_*eeb 14
我用jquery最简单的解决方案是:
$.ajax({
url: "/scripts/advertisement.js", // this is just an empty js file
dataType: "script"
}).fail(function () {
// redirect or display message here
});
Run Code Online (Sandbox Code Playgroud)
advertisement.js只包含任何内容.当有人使用adblock时,它会失败并调用该函数.
mar*_*ark 11
我知道已经有足够的答案了,但是自从谷歌在这个主题上搜索"检测广告块"时出现了这个问题,我想提供一些见解,以防你没有使用adsense.
具体来说,通过此示例,您可以检测是否使用了Firefox Adblock提供的默认Adblock列表.它利用了这个阻止列表中有一个用CSS id阻塞的元素#bottomAd.如果我在页面中包含这样的元素并测试它的高度,我知道adblocking是否处于活动状态:
<!-- some code before -->
<div id="bottomAd" style="font-size: 2px;"> </div>
<!-- some code after -->
Run Code Online (Sandbox Code Playgroud)
其余的是通过通常的jQuery嫌疑人完成的:
$(document).ready( function() {
window.setTimeout( function() {
var bottomad = $('#bottomAd');
if (bottomad.length == 1) {
if (bottomad.height() == 0) {
// adblocker active
} else {
// no adblocker
}
}
}, 1);
}
Run Code Online (Sandbox Code Playgroud)
可以看出,我使用setTimeout至少1ms的超时.我在各种浏览器上测试了这个,大多数时候,直接检查ready总是返回0 的元素; 无论广告拦截器是否有效.我对此有两个想法:渲染尚未完成或Adblock尚未启动.我没有打扰进一步调查.
pax*_*blo 11
我的建议是:不要这样做!
任何将人视为"违法者"的情况都会导致他们反击.
这是我的建议.
在页面顶部放置一个小的不显眼的消息(无论广告是否被阻止),文本I *totally* respect your right to block ads和指向另一个页面/弹出窗口的链接Read more ....
在另一页上,清楚地表明您了解它是他们的计算机并且他们可以自由地使用广告拦截.
还要以非指责的方式明确指出,使用这些阻止程序会使您更难以提供优质内容(详细解释原因),而且您希望广告拦截不会发生在您的网站上,这完全是他们的决定.专注于关闭阻止的积极因素.
那些强烈反对广告的人会忽视这一点,但无论如何你都没有机会说服他们.那些漠不关心的人很可能会被你的吸引力所左右,因为你不是在做"让我走自己的路,或者我会把球带回家",这应该是五岁儿童的专属领域.
记住,没有人拿着枪对着你的头,迫使你把你的东西放在网上.尊重您的读者/用户,您可能会发现其中很多人会回报.
小智 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>
Run Code Online (Sandbox Code Playgroud)
检查是否有广告拦截的有效方法:只需通过尝试触发谷歌广告的 URL 来检查是否启用了广告拦截。如果是,则运行 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();
});
};
Run Code Online (Sandbox Code Playgroud)
此解决方案适用于所有类型的广告,不仅适用于 google adsense。
我注意到以前的评论使用google adsense作为测试对象.有些页面不使用adsense,使用adsense块作为测试并不是一个好主意.因为adsense块可能会损害您的SEO.以下是我通过adblocker检测简单阻止类的示例:
HTML:
<div class="ad-placement" id="ablockercheck"></div>
<div id="ablockermsg" style="display: none"></div>
Run Code Online (Sandbox Code Playgroud)
jQuery的:
$(document).ready(function()
{
if(!$("#ablockercheck").is(":visible"))
{
$("#ablockermsg").text("Please disable adblocker.").show();
}
});
Run Code Online (Sandbox Code Playgroud)
"ablockercheck"是adblocker阻止的ID.因此,检查它是否可见,您可以检测adblocker是否已打开.
只需在您的网站上添加小脚本:
var isAdsDisplayed = true;
Run Code Online (Sandbox Code Playgroud)
名称为adsbygoogle.js
然后做以下事项:
<script src="/js/adsbygoogle.js"></script>
<script>
if(window.isAdsDisplayed === undefined ) {
// AdBlock is enabled. Show message or track custom data here
}
</script>
Run Code Online (Sandbox Code Playgroud)
在这里找到了解决方案
AdBlock似乎阻止加载AdSense(等)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);
Run Code Online (Sandbox Code Playgroud)
为了澄清,以下是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>
Run Code Online (Sandbox Code Playgroud)
请注意,它adsbygoogle被初始化为数组.该adsbygoogle.js库Object {push: ...}在执行时将此数组更改为.在一定时间后检查变量的类型可以告诉您脚本是否已加载.
我在我的网站上使用这种方法,也许你会觉得它很有帮助.在我看来,这是最简单的解决方案.
AdBlocker会阻止特定的类和html元素,通过检查开发者控制台中任何被阻止的广告的这些选择器(它们都已列出),您可以看到哪些元素将始终被阻止.
例如,只需在stackoverflow上检查此问题页面,您就会看到一堆被屏蔽的广告.
例如,任何具有bottom-ad类的元素都会被自动阻止.
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请求,您可以简单地计算假添加的高度.
顺便说一下,这里有一个完整的列表,与adblockers避免渲染的元素相匹配.
window.adBlockRunning = function() {
return (getComputedStyle(document.getElementById("detect"))["display"] == "none") ? true : false;
}()
console.log(window.adBlockRunning);Run Code Online (Sandbox Code Playgroud)
#detect {
height: 1px;
width: 1px;
position: absolute;
left: -999em;
top: -999em
}Run Code Online (Sandbox Code Playgroud)
<div id="detect" class="ads ad adsbox doubleclick ad-placement carbon-ads"></div>Run Code Online (Sandbox Code Playgroud)
这个效果很好
如果有广告拦截器,它会提醒您
简而言之,它向一家知名广告公司发送一个针对所有广告拦截器(谷歌广告)的标头请求,如果请求被拦截,则 adbloker 存在。
checkAdBlocker();
function checkAdBlocker() {
try {
fetch(
new Request("https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js", {
method: 'HEAD',
mode: 'no-cors'
})).catch(error => {
showNotification()
});
} catch (e) {
// Request failed, likely due to ad blocker
showNotification()
}
}
function showNotification() {
alert("Please disable adBlocker")
}Run Code Online (Sandbox Code Playgroud)
[2022 年 10 月 - uBlock Origin、Adblock Plus、Brave 浏览器]
如今广告拦截器非常聪明,它们甚至可以通过重定向来欺骗广告服务器请求并返回虚假响应。以下是我发现的唯一好的解决方案,它甚至可以与我测试过的最好的广告拦截器扩展(如 uBlock Origin、Adblock Plus)和浏览器内广告拦截器(如 Brave、Opera)配合使用。它适用于那些阻止访问广告服务器以及欺骗广告服务器的人。它适用于任何广告提供商,而不仅仅是 Google!它专门使用谷歌广告服务进行检测,因为它被所有拦截器拦截,所以它的可用性始终很高并且速度很快。
最聪明的广告拦截器不会拦截,而是重定向请求并返回虚假的“成功”响应。截至目前,Google 从未重定向请求,因此我们可以检测重定向,从而检测拦截器。
重要的:
您可以随时随地 ( <head>/ <body>) 使用此解决方案。通过在任何浏览器中使用任何广告拦截器点击“运行代码片段”,直接在此处尝试:
function detectAdblock(callback) {
fetch('https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js', {
method: 'HEAD',
mode: 'no-cors',
}).then((response) => {
// If the request is redirected, then the ads are blocked.
callback(response.redirected)
}).catch(() => {
// If the request fails completely, then the ads are blocked.
callback(true)
})
}
detectAdblock((isAdblockerDetected) => {
console.log(`ads are ${isAdblockerDetected ? 'blocked' : 'not blocked'}`)
});Run Code Online (Sandbox Code Playgroud)
安全的方法是将您的广告包装在内部<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);
Run Code Online (Sandbox Code Playgroud)
它适用于adblock plus和bluehell防火墙.
大多数 adblocker 会取消对元素的 HTTP 请求并ads.js进行创建0px,但有时 adblocker会删除 DOM,并且上面的一些答案将失败,因为没有检查元素的存在。
使用setTimeout()是一个很好的做法,因为如果没有它,脚本将会与广告拦截器竞争。
下面的脚本将检查 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.Run Code Online (Sandbox Code Playgroud)
<div class="ads showads">
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</div>Run Code Online (Sandbox Code Playgroud)
小智 5
html文件
<script src="wp-banners.js"></script>
<script>
if(document.getElementById('LavXngdFojBe')){
alert('Blocking Ads: No');
} else {
alert('Blocking Ads: Yes');
}
</script>
Run Code Online (Sandbox Code Playgroud)
wp-banners.js
var e=document.createElement('div');
e.id='LavXngdFojBe';
e.style.display='none';
document.body.appendChild(e);
Run Code Online (Sandbox Code Playgroud)
这也显示在 https://detectadblock.com上。
async function hasAdBlock() {
try {
await fetch("https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js", {
method: "HEAD",
mode: "no-cors",
})
return false;
} catch(e) {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
234006 次 |
| 最近记录: |