Javascript Ad阻止程序检测又名Adblock Plus

Javascript Ad阻止程序检测又名Adblock Plus,javascript,html,adblock,Javascript,Html,Adblock,在搜索Google和Stackoverflow几个小时后,我找不到解决方案。 我现在要做的是检测Adblock plus并显示一条简单的消息 我想做的是不使用JavaScript文件或jQuery检测Adblock plus。 大多数adblock plus检测脚本都使用一个文件,例如“show_ads.js”,该文件托管在自己的域中,其中有一行代码将其设置为“adblock=false” 使用JavaScript文件的问题是,用户可以将该JavaScript文件列为白名单,它将不再检测到该文件

在搜索Google和Stackoverflow几个小时后,我找不到解决方案。 我现在要做的是检测Adblock plus并显示一条简单的消息

我想做的是不使用JavaScript文件或jQuery检测Adblock plus。 大多数adblock plus检测脚本都使用一个文件,例如“show_ads.js”,该文件托管在自己的域中,其中有一行代码将其设置为“adblock=false”

使用JavaScript文件的问题是,用户可以将该JavaScript文件列为白名单,它将不再检测到该文件。我要找的是一个JavaScript,它可以直接加载到HTML中,检测是否有人在不使用文件的情况下使用了ad blocker

示例如下:

<script type="text/javascript">
 // line of code that detects if using ad blocker

 if so display message
 </script>

//检测是否使用ad阻止程序的代码行
如果是,则显示消息
这样做的原因是没有广告拦截器可以将服务器上的JavaScript文件列为白名单。是的,我知道有其他方法可以通过NoScript插件解决这个问题,但我已经有了一个解决方案。我有一个从未尝试过的好主意,一旦我完成了,广告拦截器就无法阻止它


任何建议和例子都将不胜感激

我在现场看到的是在广告后面使用背景图像。如果adblock未激活,广告将显示在背景图像上(这使得背景图像无法查看)。如果adblock处于活动状态,则广告被阻止,用户将看到背景图像

<div id="ad-container">
  <img src="../ad/ad.png" id="ad">
</div>

如果您想显示广告,即使AdBlock处于活动状态,您也必须了解AdBlock的功能

  • AdBlock可以阻止资源加载
  • AdBlock可以隐藏DOM中的特定元素
  • 虽然有人说AdBlock也可以修改CSS,但除了隐藏和折叠元素之外,我找不到任何关于它的文档


    那么,为了比AdBlock更“聪明”,你到底能做些什么呢

    你可以用一种永远不会“匹配”的方式来伪装你的请求(例如
    http://domain.com/ae9a70e0a.png
    ,其中图像名称每次都是随机的,并且没有公共前缀)。据我所知,AdBlock中的规则不能包含正则表达式。规则要么不匹配广告,要么匹配太多资源。可以在服务器上重写这样一个url以指向您的广告

    然而,虽然AdBlock可能无法阻止您的广告加载,但它可能仍然能够隐藏它。没有真正的办法解决这个问题。总会有一个智能的CSS选择器来选择你的元素。但是,您可以添加带有内容的背景图像。这对于广告(不可单击)没有用处,但可能有助于显示其他消息。缺点是,若有人决定阻止那个讨厌的背景图像,它也会隐藏你们的内容


    就脚本而言,您可以使用ajax请求加载广告。我认为(但无法测试)如果资源无法加载(因为它被阻止),它将给出一个错误。(
    $.ajax(request).error(function(){…});
    在jQuery中,或在常规javascript中的某些等效项)。你可以用它来做别的事情。您可以将其包含在文档本身中,而不是外部资源中,以确保它始终运行(如果启用了javascript)。即便如此,你也无法确定“你做的任何其他事情”都会被清晰地显示出来。作为最后手段,您可以创建一个
    窗口。警报(…)
    。假设在3个页面内,如果您使用该页面,您的访问者将永远不会回来

    我可以想到的另一种方法是,在服务器上创建一个websocket(当然这不能被AdBlock阻止)。在服务器端,您需要检查在加载特定页面时是否未加载广告页面。这些信息可以通过套接字发送,可以在脚本中使用套接字执行“某些操作”。然而,这听起来非常复杂,对于检测AdBlock的脚本来说是一个巨大的开销。

    使用我的插件“FuckAdBlock”,它可以很容易地检测AdBlock:

    例如:

    fuckAdBlock.on(true, function() {
        alert('AdBlock detected !');
    }).on(false, function() {
        alert('AdBlock is not detected =)');
    });
    

    在线示例:

    检测adblock不需要插件,只需使用以下方法:

    <script type="text/javascript">
        var adblock = true;
    </script>
    <script type="text/javascript" src="adframe.js"></script>
    <script type="text/javascript">
        if(adblock) {
              //adblock is installed and enabled on this site :-D
        }
    </script>
    
    更新: Adblock Plus根据其已有的模式阻止某些请求或隐藏某些元素。其中一种模式是(在patterns.ini中):

    它阻止任何包含
    /adframe.
    的URL

    2018年8月25日更新

    Adblock plus改变了它查找列表和阻止广告的方式。它有一组称为订阅的列表,用于阻止。例如,此选项是默认选项:

    您可以使用此文件的规则查找要使用的文件名。例如,您可以使用seo-ads.js

    p.S for developers:由于某种原因,我无法让ABP在本地环境中阻止这些文件


    p.S:ABP是我最喜欢的广告拦截器:-D

    以下是检测广告拦截器的代码。您可以了解代码是如何工作的


    这当然是一场军备竞赛,我支持任何人阻止广告的权利,但我也支持依赖广告收入的网站试图说服用户,或者说服他们订阅或捐款以弥补广告收入的损失。我不赞成网站试图强迫用户看到广告,但礼貌的信息是可以的

    无论如何,现在值得注意的是,有许多adblocking扩展/插件,它们都可以有不同的方式来实现,而且操作系统和浏览器之间有时也会有所不同。我发现,就我目前的目的而言,这个jQuery选择器至少足以看到AdBlock或AdBlockplus是否正在跨平台使用,至少可以跨Chrome和Firefox使用:

    if($("div[id^=google_ads_iframe_] iframe:visible").length == 0)  {
        // pop up a message or whatever
    } 
    

    如果你使用第三方广告,我发现了一个最好的脚本

    免责声明我不是af
    adblock = false;
    
    [Filter]
    text=/adframe.
    hitCount=843
    lastHit=1456391595626
    
    function detect()
    {
        //create a iframe. Append the iframe to the body. And then after 100ms check if their offsetHeight, display or visibility is set such a way that user cannot see them.
        //In the URL use the words specific to advertising so that Adblock can do string matching.
        var iframe = document.createElement("iframe");
        iframe.height = "1px";
        iframe.width = "1px";
        iframe.id = "ads-text-iframe";
        iframe.src = "http://domain.com/ads.html";
    
        document.body.appendChild(iframe);
    
        setTimeout(function()
                   {
                       var iframe = document.getElementById("ads-text-iframe");
                       if(iframe.style.display == "none" || iframe.style.display == "hidden" || iframe.style.visibility == "hidden" || iframe.offsetHeight == 0)
                       {
                            alert("Adblock is blocking ads on this page");
                            iframe.remove();
                       }
                       else
                       {
                            alert("Adblock is not detecting ads on this page");
                            iframe.remove();
                       }
                   }, 100);
    }
    
    if($("div[id^=google_ads_iframe_] iframe:visible").length == 0)  {
        // pop up a message or whatever
    } 
    
    <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>
    
    <div id="ab-message" style="display: none">Your message here!</div>
    
    <body style="display: block !important;">
      <img src="url-containg-ad-ads-word.jpg" alt="you should see this anyway" >
    </body> 
    
    var xmlhttp = new XMLHttpRequest()
    xmlhttp.onreadystatechange = function() {
      if( xmlhttp.readyState == XMLHttpRequest.DONE ){
        if( xmlhttp.status !== 404 ){
            console.log("Blocking ads")
        }else{
            console.log("Not blocking ads")
        }
      }
    }
    xmlhttp.open("GET", "/498100ffe815d700cd838d1/ads/showad.js", true)
    xmlhttp.send()
    
    var adBlockTester = document.createElement('div');
    adBlockTester.innerHTML = '&nbsp;';
    adBlockTester.className = 'adsbox';
    document.body.appendChild(adBlockTester);
    window.setTimeout(function() {
      if( adBlockTester.offsetHeight === 0 ){
        console.log("Blocking ads")
      }else{
        console.log("Not blocking ads")
      }
      document.body.removeChild(adBlockTester);
    }, 60);
    
    $('body').append('<div id="ad-container" style="position:absolute;"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=" id="ad"></div>');
    var ad_container = $('body').children('#ad-container');
    if(!ad_container.is(":visible")) {
      // Add your warning and/or adblock detection logic here.
    }
    ad_container.remove();
    
    window.onload = function() {
       if (document.getElementsByClassName('google-auto-placed').length == 0){
                    // Adblock Detected
       }        
    }
    
    <div id="bait" class="pub_300x250" style="color: #fff">.</div>
    
    if (document.getElementById("bait").offsetHeight === 0) {
        // function code or alert (whatever) here.
       alert("Ad-Blocker DETECTED");
    }
    
    var elem = document.createElement('div');
    elem.className = 'adclass';
    document.body.appendChild(elem);
    window.setTimeout(function () {
        var isAdblockEnabled = !(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
        if (isAdblockEnabled) {
            // Adblock is enabled
        }
    }, 0);