为具有广告拦截器的用户显示替代内容

Display Alternative Content for Users with AdBlockers

提问人:Madara's Ghost 提问时间:12/25/2011 最后编辑:Madara's Ghost 更新时间:8/10/2017 访问量:12004

问:

我正在做一个广告资助的项目。真的是一些微妙和内容意识的东西,而不是生殖器增大等的蹩脚弹出窗口。

由于该项目是广告资助的,因此使用广告拦截器的人不会使该项目受益,(因为他们显然不知道该特定网站上的广告并没有那么糟糕)。

如何为使用广告拦截器的用户显示替代内容?类似的东西

我们注意到您有一个活跃的广告拦截器。Example.com 是广告资助的,我们保证我们的广告是高质量的,不显眼。为了保持我们的运行,您可以提供的最佳帮助是将我们列入广告拦截器的白名单。谢谢!

如何测试广告拦截器?

找到一个例子!http://mangastream.com

JavaScript jQuery 广告 adblock

评论

5赞 Oded 12/25/2011
作为一个使用广告拦截器的人,我不知道我对有人规避它有什么感觉。
0赞 Madara's Ghost 12/25/2011
显然,但有时,我们真的别无选择。但是,有些网站我将其列入白名单。StackOverflow 就是一个很好的例子。
0赞 Some Guy 12/25/2011
实际上,有趣的是,Chrome的流行扩展程序在最近的更新中开始允许不显眼的广告。此外,如果您将广告托管在自己的服务器上,则会自动躲避某些人使用的文件广告拦截器。AdBlockhosts
0赞 Madara's Ghost 12/25/2011
是的,但一般来说,托管广告以获取金钱(或链接到另一个网站以获取金钱)是一个很大的禁忌,并且会在搜索引擎上为您带来巨额罚款。
0赞 c69 12/25/2011
@Truth“替代广告内容”还是“替代网页内容”?

答:

0赞 milan 12/25/2011 #1

我不知道广告拦截器是如何工作的,但例如,我有一个 Chrome 广告拦截器让我选择一个包含要删除的广告的特定 DOM 元素:,拦截器会以某种方式删除它。<div id="ad_holder"> ... ads ... </div>

如果你在该 div 中放置一些 javascript,使用一个短计时器,这将修改一个全局变量,然后执行另一个计时器,读取该全局变量,那么如果变量设置正确,您能否假设页面上没有广告拦截器?如果阻止程序在 Chrome 评估该 javascript 后删除了 div,会发生什么情况,尽管删除了父 div,计时器 stil 会设法设置变量吗?

AdBlock 还维护着一个“坏”服务器 (http://www.doubleclick.com?) 的公共列表,并且可能会阻止来自这些服务器的内容的 http 请求。如果它与 Chrome 集成,以便它可以定义某种内容策略——加载什么,不加载什么,就可以做到这一点。您可以使用前面描述的方法检测这种情况。如果您的客户是广告提供商,我想它迟早会被列入黑名单:)

拦截器可能只修改 CSS 并隐藏整个 div,但这很容易被检测到。

2赞 copy 12/25/2011 #2

最常见的技巧是创建一个 JavaScript 文件,其名称通常被广告拦截器阻止,例如。 如果文件被阻止,您就知道访问者启用了广告拦截器。/ads/advert.js

CSS 文件通常不会被广告拦截器列表阻止,因此这是一种更安全的方法。

3赞 Daniel Szabo 12/25/2011 #3

在这里从臀部拍摄,但我认为您可以在页面加载后使用一些 javascript 检查广告 div 的内容。

<!-- html -->
    <div id="MyAdDiv">
       <div id="BeaconContainer" style="display:none">I rendered!</div>
       // Ad content here.  
    </div>

// javascript

    var d = document.getElementById("MyAdDiv");

    if ( d.innerHTML.indexOf("I rendered!") === -1 )  {
       // Your ad has been blocked.
       // Run code to launch WhiteList request message.
    }

我不知道广告拦截器何时会这样做,因此使用 setTimeout() 将此函数的执行延迟几秒钟可能是个好主意。您可能还可以使用一些ajax调用来做一些有趣的事情,例如收集有关有多少用户正在运行广告拦截器的统计信息。管理层就是喜欢这种东西。

更新:我刚刚安装了 Chrome 的 adblock 并针对 StackOverflow 进行了检查。看起来 AdBlock 只是删除了广告容器的内容,因此上述方法将起作用。

17赞 Muhammad Usman 12/25/2011 #4

广告拦截器基本上使用一些 ID 或 jQuery 等元素来操作一些元素,这些元素存储在他们的数据库中,这是在 DOM 准备好一段时间后完成的。

因此,您必须在一定时间后检查您的广告元素是否纵,例如,在 DOM 准备就绪后 3 秒。您基本上可以检查(因为 AdBlockers 隐藏了它)CSS 属性或广告元素的 innerHTML。下面是一个示例:display

工作演示:http://jsfiddle.net/cxvNy/(使用 AdBlock for Chrome 测试,您需要激活此功能)

如果您的广告 HTML 是:

<div id="google_ads_frame1">aa</div>

然后:

$(function(){
   setTimeout(function(){
      if($("#google_ads_frame1").css('display')=="none") //use your ad's id here I have used Google Adense
      {
          $('body').html("We noticed you have an active Ad Blocker. Example.com is ad funded, we promise our ads are of high quality and are unobtrusive. The best help you could provide to keep us running, is to whitelist us in your ad blocker. Thanks!");
      }
  },3000);
});

希望上面的代码是不言自明的:)

评论

0赞 Muhammad Usman 12/25/2011
这是行不通的,因为我说过,在 DOM 准备好一段时间后,广告会纵,所以我们必须在广告纵后检查它。
0赞 Madara's Ghost 12/25/2011
好吧,但 3 秒看起来相当......极端
1赞 Muhammad Usman 12/25/2011
好吧,3 秒不是强制性的,您可以根据需要使用并对其进行测试。我只是在更高的超时下玩得很安全。
0赞 KeizerBridge 7/2/2015
如果广告拦截器删除 div,您还应该测试该 div 是否存在。
0赞 Michael Rogers 5/24/2020
您的演示没有显示任何带有 ublock 源的内容。
6赞 Madara's Ghost 12/25/2011 #5

最终,我使用了以下实现(类似于此站点的实现)。使用以下代码:

function abp() {
    if ($('.ad').height() == 0) {
        $('.ad').css("height", "90px");
        $('.ad').css("background-image", "url(/static/images/msblock.png)");
    }
}
$(abp);

在文档的最后。似乎像专业人士一样工作。感谢大家的精彩回答,为大家点赞!

评论

0赞 user2959229 7/10/2015
像魅力一样工作。我将 .css() 位替换为我想要显示的内容。
0赞 Mike Szostech 6/21/2014 #6

我最喜欢的方法是简单地在我的网站上所有漂亮的大型有用内容块周围添加一类“广告”或“广告”或类似的东西,然后当使用广告拦截器的人查看它时,他们什么也看不到。

他们被迫禁用广告拦截才能看到内容。

不要为警告而烦恼,让他们弄清楚。这不是使用广告拦截软件的傻瓜。

以下是一些流行的 adblock 扩展程序的当前阻止规则列表。只需选择他们阻止的类或 ID(使用您的开发人员工具查看 css 类列表)

评论

0赞 TryHarder 6/22/2014
答案开始很好,但没有必要将所有类粘贴到此处(因此是 -1)。
0赞 Mike Szostech 7/1/2014
删除了类名 - 我只是想提供帮助,让答案成为白痴证明!
2赞 Sandeep Kumar 7/27/2014 #7

这也可以使用简单的 JavaScript 来完成,而无需使用 jQuery。

<script>
window.onload = function(){
  setTimeout(showAdblockImage, 3000); 
};
function showAdblockImage(){
    //get all google ad elements
    var adsList = document.querySelectorAll("ins.adsbygoogle");
    if(!adsList){ return;}
    for(var i=0; i<adsList.length;i++){
        if(adsList[i].innerHTML.replace(/\s/g, "").length != 0){
            //AdBlock is not active, hence exit
            break;
        }
        //apply inline css to force display
        adsList[i].style.cssText = 'display:block !important';
        //modify html content of element
        adsList[i].innerHTML='<img src="imageurl/img_1.jpg" />';
    } 
}
</script>

参考:放置替代内容来代替 AdBlock 审查广告

评论

0赞 Madara's Ghost 7/27/2014
谢谢!TBF 我大约在 2 年前问过这个问题,当时我对 VanillaJS :P不太擅长
0赞 aman yadav 1/10/2015 #8
<script> // Run after all the page elements have loaded  window.onload = function(){ 
// This will take care of asynchronous Google ads
setTimeout(function() {     
  // We are targeting the first banner ad of AdSense
  var ad = document.querySelector("ins.adsbygoogle"); 
  // If the ad contains no innerHTML, ad blockers are at work
  if (ad && ad.innerHTML.replace(/\s/g, "").length == 0) {     
    // Since ad blocks hide ads using CSS too
    ad.style.cssText = 'display:block !important';         
    // You can put any text, image or even IFRAME tags here
    ad.innerHTML = '<img src="http://blog.liveurlifehere.com/wp-content/uploads/2015/01/adblock.jpg" width="300" height="250" />';      
  }      
}, 2000); // The ad blocker check is performed 2 seconds after the page load   }; </script>

使用此代码,您可以设置图像以代替谷歌广告

0赞 Saul Bretado 8/10/2017 #9

您可以实现非常好且易于使用的 https://github.com/sitexw/FuckAdBlock

评论

0赞 DeKaNszn 8/10/2017
在这里放一些示例代码。不要只使用链接回答