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

Jml*_*ick 353 adsense adblock

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

如果您进入该网站并且您的浏览器启用了某种广告拦截软件,则该网站会显示一个小横幅,告诉用户广告收入用于托管项目,他们应该考虑关闭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上的这些广告拦截器拦截:

  • 广告拦截
  • Adblock Plus
  • Adblock Pro
  • Ghostery的

2019-02-15更新:

在上面的列表中添加了Ghostery,因为扩展现在也阻止了对ads.js的请求.非常便利.这是否意味着Ghostery实际上正在帮助我们开发人员检测广告的扩展名?

不适用于:

隐私獾

  • 该文件仅包含单词"var canRunAds = true;" 所以只需自己创建. (83认同)
  • 更新:如果您将文件命名为showads.js,则此方法有效 (18认同)
  • 您还可以尝试在由广告拦截器阻止的网址上运行ajax请求.如果成功,则没有广告拦截器,如果失败,则会有广告拦截器. (9认同)
  • 使用adsbygoogle.js名称,它将100%正常工作 (9认同)
  • 一些广告拦截器似乎没有阻止ads.js文件,就像对我来说,简单的广告块为chrome. (3认同)
  • 我正在使用 AdBlock Plus,“ads.js”解决方案在一段时间内运行良好,但在某一时刻,他们让它变得更加智能,因此现在“ads.js”和“prebid-ads.js”都不起作用。然而,“ads-prebid.js”似乎确实有效。 (3认同)
  • 你能给出`js/ads.js`的完整链接吗?由于我在博客中,我不得不将 `.js` 上传到某个地方(例如:Google Drive),并且这种情况下的链接不包含 `ads`。如果您提供文件的链接,那将非常有帮助。 (2认同)
  • 镀铬的ABP反应良好,所以一切正常! (2认同)
  • 工作了很长时间,但今天(2020 年 5 月 4 日)ads.js 和 adsbygoogle.js 在 Windows 上的最新 Chrome 下都停止为我工作。 (2认同)

小智 138

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

  • 它可能很容易,但这不是正确的方法,如果您的布局变形或广告加载缓慢,用户可以看到与他无关的错误.另请注意,Adblock正在采取措施阻止针对ABP用户的突兀信息.如果您想要求用户取消阻止,请通过位于布局外的简单可隐藏消息(不会推送其他元素)来执行此操作.在启用了adblock的情况下查看https://duckduckgo.com/?q=foo+bar. (22认同)
  • 用户仍然可以使用Adblock阻止这些被屏蔽的广告通知:这是我所知道的唯一缺陷. (5认同)

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理论上任何一个都不是问题).

  • 在这种情况下重定向是一个坏主意.如果您的广告服务出现故障,_all_访客可能会被重定向到该页面.我还建议使用窗口onload事件而不是文档就绪. (16认同)
  • 在这种情况下重定向是一个坏主意.如果您的广告服务出现故障,所有访问者都可能被重定向到该页面.确实如此.更不用说他们只是简单地将一个简单的脚本放在一起来打败反措施.此外,你是否真的认为用户会有动力去禁用他们的广告拦截器?不,它所能完成的任务就是将它们惹恼并使它们对你的网站恶化.大多数网站选择只是显示消息而不是变得敌对. (6认同)
  • 请不要阻止用户进入您的网站,因为他们禁用了广告 - 这只是升级了军备竞赛. - 如果您要求我们打开它们,我们可能会这样做 - 如果您试图强迫我们,我们要么停止访问您的网站,要么我们会报告我们的广告拦截器上的错误,并获取它为您的网站修复. - 这是广告拦截器为保护用户而存在的确切行为类型. (3认同)

Cum*_*bus 87

没有额外的要求.没有外部库.简单明了的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);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 为防止出现故障,您可以添加`testAd.style.display ='absolute'`并将其移出屏幕 (4认同)
  • 很好的解决方案,但对于那些遭受100毫秒延迟的人,我建议在doc body中添加这样的东西:`<div id ="detect"class ="ads ad adsbox doubleclick ad-placement carbon-ads"style ="background-color :红色;高度:300px;宽度:300px;位置:绝对;左:0;顶部: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>`) (3认同)
  • @Gerald好点.但是AFAIK,`绝对'是一个'位置'值. (2认同)
  • 请注意,这不适用于 Firefox 的 AdBlock (2认同)

小智 40

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

GoogleAds示例:

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

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

  • 这是检查广告是否加载的最佳方法之一..因为手动加载自己的脚本依赖于拦截器来阻止该脚本有时会失败.. (3认同)

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

  • google_render_ad现在随时都未定义,typeof(window.google_jobrunner)!='object'适合我. (8认同)
  • 由于它不是您控制的代码,因此我认为依赖于此是一个坏主意,因为库的重构将导致您的脚本检测所有用户的广告块. (4认同)
  • 如果您检查对象的属性,`typeof` 是一种开销。使用简单的 `=== undefined`。 (2认同)

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;">&nbsp;</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 ....

在另一页上,清楚地表明您了解它是他们的计算机并且他们可以自由地使用广告拦截.

还要以非指责的方式明确指出,使用这些阻止程序会使您更难以提供优质内容(详细解释原因),而且您希望广告拦截不会发生在您的网站上,这完全是他们的决定.专注于关闭阻止的积极因素.

那些强烈反对广告的人会忽视这一点,但无论如何你都没有机会说服他们.那些漠不关心的人很可能会被你的吸引力所左右,因为你不是在做"让我走自己的路,或者我会把球带回家",这应该是五岁儿童的专属领域.

记住,没有人拿着枪对着你的头,迫使你把你的东西放在网上.尊重您的读者/用户,您可能会发现其中很多人会回报.

  • “看起来您使用了广告拦截器。太酷了!我们也是:) 请向您的朋友介绍我们,以支持 X!”怎么样? (5认同)
  • 如果一个网站强迫我禁用我的广告拦截器,我继续前进.他们输了,我不在乎.我只是从Google上提取了一个缓存副本. (4认同)
  • 嘿试着以这种方式货币化......广告是常规付款方式,因此用户应付费 (3认同)

小智 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)


Joh*_*dis 9

检查是否有广告拦截的有效方法:只需通过尝试触发谷歌广告的 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。


Rom*_*sev 9

我注意到以前的评论使用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是否已打开.


dru*_*uss 8

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

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)

在这里找到了解决方案


Sal*_*n A 7

AdBlock似乎阻止加载AdSense(等)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);
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.jsObject {push: ...}在执行时将此数组更改为.在一定时间后检查变量的类型可以告诉您脚本是否已加载.


NGi*_*Gix 7

我在我的网站上使用这种方法,也许你会觉得它很有帮助.在我看来,这是最简单的解决方案.

AdBlocker会阻止特定的类和html元素,通过检查开发者控制台中任何被阻止的广告的这些选择器(它们都已列出),您可以看到哪些元素将始终被阻止.

例如,只需在stackoverflow上检查此问题页面,您就会看到一堆被屏蔽的广告.

例如,任何具有bottom-ad类的元素都会被自动阻止.

  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处于活动状态.


vor*_*laz 7

您不需要额外的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)


Mas*_*Mas 7

这个效果很好

如果有广告拦截器,它会提醒您

简而言之,它向一家知名广告公司发送一个针对所有广告拦截器(谷歌广告)的标头请求,如果请求被拦截,则 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)

  • 这是行不通的,例如 ublock origin 会欺骗响应并返回一个有效的 js 文件,就像 adsense 已加载一样 (3认同)

Kri*_*dor 7

[2022 年 10 月 - uBlock Origin、Adblock Plus、Brave 浏览器]

如今广告拦截器非常聪明,它们甚至可以通过重定向来欺骗广告服务器请求并返回虚假响应。以下是我发现的唯一好的解决方案,它甚至可以与我测试过的最好的广告拦截器扩展(如 uBlock Origin、Adblock Plus)和浏览器内广告拦截器(如 Brave、Opera)配合使用。它适用于那些阻止访问广告服务器以及欺骗广告服务器的人。它适用于任何广告提供商,而不仅仅是 Google!它专门使用谷歌广告服务进行检测,因为它被所有拦截器拦截,所以它的可用性始终很高并且速度很快。

最聪明的广告拦截器不会拦截,而是重定向请求并返回虚假的“成功”响应。截至目前,Google 从未重定向请求,因此我们可以检测重定向,从而检测拦截器。

重要的:

  • 我们只发送一个HEAD 请求,该请求运行速度快,不会给客户端的数据流量带来负担
  • adsbygoogle.js 必须使用完整的原始路径来调用,该路径在每个广告拦截器的黑名单中(不要将js复制到您自己的网站!)

您可以随时随地 ( <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)


uin*_*tea 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);
Run Code Online (Sandbox Code Playgroud)

它适用于adblock plus和bluehell防火墙.


cie*_*ung 6

大多数 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上。


Cod*_*ler 5

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)