Как определить Adblock на моем веб-сайте?

Я хотел бы узнать, пользуется ли пользователь приложением adblocking при посещении моего сайта. Если они его используют, я хочу показать сообщение с просьбой отключить его для поддержки проекта, например этот веб-сайт.

Если вы входите на этот сайт, и в вашем браузере есть какое-то программное обеспечение для рекламных блоков, тогда сайт вместо показа фактических объявлений показывает небольшой баннер, сообщающий пользователям, что доход от рекламы используется для размещения проекта, и они должны рассмотреть отключить Adblock.

Я хочу сделать это на своем веб-сайте, я использую в нем объявления AdSense, как я могу это сделать?

Ответ 1

Мое решение не относится к определенной рекламной сети и очень легкое. Я запускал его в производство в течение нескольких лет. AdBlock блокирует все URL, содержащие слово "реклама". Вот что я сделал:

Я добавил небольшой файл 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>

Такие файлы, как ads.js, заблокированы как минимум следующими рекламодателями в Chrome:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • Ghostery

Обновление на 2019-02-15:

Добавлен Ghostery в списке выше, потому что расширение теперь также блокирует запросы к ads.js. Очень кстати. Означает ли это, что Ghostery на самом деле помогает разработчикам обнаруживать блокировку рекламы с ее расширением?

Не работает с:

Конфиденциальность Badger

Ответ 2

Не прямой ответ, но я поместил сообщение за рекламу, которое нужно загрузить... скорее, пытаясь обнаружить его, оно просто появится, когда объявление не будет.

Ответ 3

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).

Ответ 4

Нет дополнительных запросов. Нет внешних библиотек. Просто простой, простой 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);

Ответ 5

Большинство объявлений динамически загружаются в javascript. Я просто использовал событие onerror, чтобы определить, можно ли загрузить объявление script или нет. Кажется, работает.

Пример с GoogleAds:

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

Это можно использовать и для других элементов, чтобы увидеть, блокирует ли рекламный блок блокирование содержимого. Этот метод может создавать ложные срабатывания, если удаленные элементы не существуют или не могут быть достигнуты.

Ответ 6

Чтобы определить, блокирует ли пользователь рекламу, вам нужно найти функцию в 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

Ответ 7

Мое самое простое решение с jquery:

$.ajax({
    url: "/scripts/advertisement.js", // this is just an empty js file
    dataType: "script"
}).fail(function () {
    // redirect or display message here
});

Реклама .js просто ничего не содержит. Когда кто-то использует adblock, он терпит неудачу, и функция вызывается.

Ответ 8

Я знаю, что ответов уже достаточно, но поскольку этот вопрос возникает в Google, для поиска "обнаружения рекламного блока" в этой теме я хотел бы дать некоторое представление о том, что вы не используете adsense.

В частности, в этом примере вы можете определить, используется ли по умолчанию Adblock-список, предоставленный Firefox Adblock. Он использует преимущество, что в этом списке блоков есть элемент, заблокированный с помощью CSS id #bottomAd. Если я включу такой элемент в страницу и проведу его высоту, я знаю, активна ли рекламная блокировка:

<!-- some code before -->
<div id="bottomAd" style="font-size: 2px;">&nbsp;</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, по крайней мере, с интервалом 1 мс. Я тестировал это в разных браузерах и большую часть времени, прямо проверяя, что элемент в ready всегда возвращается 0; независимо от того, активен ли рекламный блок или нет. У меня было две идеи об этом: либо рендеринг еще не был выполнен, либо Adblock еще не ударил. Я не стал больше исследовать.

Ответ 9

Мой совет: не делай этого!

Любой сценарий, в котором вы относитесь к людям как к "правонарушителям", приведет к тому, что они будут сопротивляться.

Вот мое предложение.

Поместите небольшое ненавязчивое сообщение в верхней части страницы (независимо от того, заблокированы ли объявления) с текстом I *totally* respect your right to block ads и ссылкой на другую страницу/всплывающее окно под названием Read more ....

На другой странице дайте понять, что вы понимаете это на своем компьютере, и они могут свободно использовать блокировку рекламы.

Также ясно укажите, что использование этих блокировщиков затрудняет вам предоставление отличного контента (объяснение почему именно) и что, хотя вы предпочитаете, чтобы блокировка рекламы не выполнялась на ваш сайт, это полностью их решение. Сосредоточьтесь на позициях отключения блокировки.

Те, кто категорически против рекламы, будут игнорировать это, но у вас никогда не было шанса убедить их в любом случае. Те, кто безразличен, могут быть поколебаны вашей апелляцией, так как вы не делаете целое "позвольте мне получить мой путь, или я возьму свой мяч и вернусь домой", что, честно говоря, должно быть эксклюзивной областью пятилетних детей.

Помните, никто не держал пистолет в вашу голову и заставлял вас класть ваши вещи в сеть. Относитесь к своим читателям/пользователям с уважением, и вы, вероятно, найдете, что их большое число будет отвечать взаимностью.

Ответ 10

Они используют тот факт, что рекламный код Google создает iframe с идентификатором iframe. Так что пока у вас еще нет чего-то на вашей странице с этим идентификатором, это тоже работает для вас.

<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>

Ответ 11

Я заметил, что предыдущие комментарии используют 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" - это идентификатор, который блокирует блок. Поэтому, проверяя это, если он виден, вы можете обнаружить, включен ли рекламный блок.

Ответ 12

Просто добавьте небольшой скрипт на свой сайт:

var isAdsDisplayed = true;

С именем adsbygoogle.js

Затем сделайте следующее:

<script src="/js/adsbygoogle.js"></script>
<script>
if(window.isAdsDisplayed === undefined ) {
  // AdBlock is enabled. Show message or track custom data here
}
</script>

Нашел это решение здесь

Ответ 13

AdBlock блокирует загрузку файлов JavaScript AdSense (и т.д.). Итак, если вы используете асинхронную версию объявлений AdSense, вы можете проверить, является ли adsbygoogle Array. Это необходимо проверить через несколько секунд, так как асинхронный script... асинхронный. Вот грубая схема:

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 инициализируется как массив. Библиотека adsbygoogle.js меняет этот массив на Object {push: ...}, когда он выполняется. Проверка типа переменной через определенное время может сказать вам, был ли загружен script.

Ответ 14

Этот подход, который я использую на своем сайте, может быть, вы найдете его полезным. По-моему, это самое простое решение.

AdBlocker блокирует определенные классы и элементы html, проверяя эти селекторы заблокированных объявлений в консоли разработчика (все они перечислены), вы можете видеть, какие элементы будут всегда заблокированы.

например. просто просмотрите эту страницу вопросов в stackoverflow, и вы увидите кучу заблокированных объявлений.

Например, любой элемент с классом bottom-ad автоматически блокируется.

  • Я создал непустой элемент div с классом bottom-ad: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  • После загрузки страницы просто проверьте, скрыт ли этот элемент. Я использовал jQuery, но не стесняюсь использовать javascript: $('.bottom-ad').css('display') == "none" или даже лучше, используя $('.bottom-ad').is(':visible')

Если значение true, то AdBlocker активен.

Ответ 15

Вам не нужен дополнительный HTTP-запрос, вы можете просто рассчитать высоту поддельного добавления.

Кстати, вот полный список, соответствующий элементам, которые рекламодатели избегают рендеринга.

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>

Ответ 16

безопасный способ состоит в том, чтобы обернуть ваши объявления внутри <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);

он работает с брандмауэром adblock plus и bluehell.

Ответ 17

Эффективный способ проверки наличия рекламного блока: Просто проверьте, включен ли рекламный блок, пытаясь вызвать URL-адрес объявлений Google. Если да, то запустите callback_has_adblock, если нет, запустите callback_no_adblock. Это решение стоит по одному запросу больше, но по крайней мере оно работает:

var hasAdBlock = function (callback_has_adblock, callback_no_adblock) {

    $.getScript( "http://pagead2.googlesyndication.com/pagead/show_ads.js" )
        .done(function( script, textStatus ) {
            callback_no_adblock();
        })
        .fail(function( jqxhr, settings, exception ) {
            callback_has_adblock();
    });
};

Это решение работает для всех видов объявлений, а не только для Google adsense.

Ответ 18

Если вы используете новый код 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 на внизу вашей страницы (обратите внимание не) при вызове adsbygoogle.js script используйте флаг "async"):

<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, чтобы задержать проверку на несколько секунд.

Ответ 19

Несмотря на возраст этого вопроса, я недавно нашел его очень полезным и поэтому могу только предположить, что другие продолжают его просматривать. После просмотра здесь и в другом месте я предположил, что проверка на трех основных клиентах для косвенного обнаружения блока объявлений заключалась в том, чтобы проверить заблокированные div/img, заблокированные iframe и заблокированные ресурсы (файлы 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 с именем наживки, а также внешне размещенное изображение с текстом "Реклама" и в размерах, используемых AdSense (благодаря placehold.it!).

В advertisement.js вы должны добавить что-то в документ, который мы можем проверить позже. Хотя кажется, что вы делаете то же самое, что и раньше, вы фактически проверяете загрузку самого файла (advertisement.js), а не вывод.

$(document).ready(
{

    $("body").append("<div id=\"myTestAd2\">check</div>");

});

И затем обнаружение блока объявлений script, которое объединяет все

$(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 в документ. Затем, когда окно загружено, то есть содержание, вкл. изображения и т.д., мы проверяем:

  • Размеры и видимость первого тестового div.
  • Чтобы содержимое второго тестового div было "проверено", как это было бы, если advertimsent.js был не заблокирован.
  • Размеры (и я предполагаю, что видимость, поскольку скрытый объект не имеет высоты или ширины?) iframe

И стили:

div#myTestAd, iframe#adServer
{
    display: block;
    position: absolute;
    left: -9999px;
    top: -9999px;
}

div#myTestAd2
{
    display: none;
}

Надеюсь, что это поможет

Ответ 20

Большинство 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>

Ответ 21

Я знаю, что это уже ответили, но я посмотрел на предлагаемый образец сайта, и я вижу, что они делают это следующим образом:

<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>

Ответ 22

Просто создал мой собственный "плагин" для решения этого вопроса, и он работает очень хорошо:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

Я добавил мобильную совместимость и обнаружение jsBlocking между прочим... (Как и наложение, которое показано пользователям, которые просят их отключить программное обеспечение adBlocking/jsBlocking); Также сделал его отзывчивым.

Он открывается в соответствии с Лицензия на Coffeeware.

Ответ 23

Нет необходимости в тайм-аутах и ​​обнюхивании DOM. Просто попробуйте загрузить script из популярных рекламных сетей и посмотрите, перехватил ли рекламный блоксервер 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';
});

Ответ 24

<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;

Я думаю, что это самый простой способ обнаружить рекламный блок.

Ответ 25

Это то, что сработало для меня:

function isAdBlocked() {
     return (typeof(window.google_jobrunner) === "undefined") ? true : false;
}

$(document).ready(function(){
    if(isAdBlocked()) {
       alert('Y U NO LIKE ADS?');
    }
});

Ответ 26

timing's Ответ приятный, но не более рабочий, поэтому я обновил имя js файла до "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;

Ответ 27

Теперь есть лучший способ сделать это, используя простой JS script, называемый AdBlock Detector
Вот как его использовать:
Добавьте это в раздел <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:

<div id="ab-message" style="display: none">Your message here!</div>

Обратите внимание, что встроенный стиль добавлен, чтобы скрыть его изначально (конечно, вы также можете сделать это из своего собственного файла CSS).
Также обратите внимание, что это занимает 500 мс, потому что ему нужно дождаться, когда рекламный блок выполнит свою работу, или он не будет работать.

Небольшое объяснение того, как работает script

Во-первых, он добавляет iframe с источником случайно сгенерированной ссылки. (Он генерируется случайно, потому что некоторые рекламные блоки являются умными, в какой-то момент они понимают, что ссылка является фальшивой).
Затем он выполняет несколько проверок на этом iframe (если он был загружен успешно или был изменен его стиль). Если один из этих тестов верен, он отображает элемент ab-message для размещения пользователей в блоке.

Этот script работает для большинства (если не всех) рекламных блокировщиков.

EXTRA

Нет смысла, действительно, мог бы создать только gist, но вместо этого я создал проект Github, но все же, проверьте его и запустите его, если он вам поможет.
abDetector: Простой ванильный JavaScript AdBlock Detector.
Наслаждайтесь.

Ответ 28

Вы можете проверить это, это может помочь detect-adblocker

Его реализация ответа времени

Добавьте это перед любым script в тег заголовка:

<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
}

Ответ 29

Все приведенные выше ответы действительны, однако большинство из них не будут работать для блокировки рекламы на уровне DNS.

Блокировщики рекламы на уровне DNS (например, pi-hole) в основном возвращают NXDOMAIN (домен не существует) для списка доменов, блокирующих рекламу (например, telemetry.microsoft.com "не будет существовать", когда это произойдет).

Есть несколько способов обойти это:

Способ A: Запрос объявлений по IP-адресу, а не по домену.

Этот метод немного раздражает, так как вам придется отслеживать IP-адреса. Это будет проблематично, если ваш код плохо поддерживается или регулярно обновляется.

Способ B: заблокировать все запросы, которые fail-, даже если клиент сообщает NXDOMAIN.

Это будет очень раздражать пользователей, если это "законный" NXDOMAIN.

Ответ 30

Я понимаю ваше напряжение, и вы можете проверить, был ли элемент создан script, или элемент скрыт. И если мы говорим об ad-blocking, вы можете рассчитывать только на видимость элемента, а не на присутствие элемента.

Элемент, созданный с помощью стороннего script, никогда не будет присутствовать, если script недоступен на данный момент (ошибка DNS, ошибка удаленного веб-сервера, предварительная загрузка в автономном режиме и т.д.), и вы всегда будете получить ложный результат.

Все остальные ответы с проверками правильны, но помните об этом.