Как обнаружить Adblock на моем сайте? - PullRequest
345 голосов
/ 02 февраля 2011

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

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

Ответы [ 38 ]

384 голосов
/ 11 декабря 2013

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

Я добавил небольшой файл js в свой корень с именем 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 на самом деле помогает разработчикам обнаруживать блокировку рекламы с ее расширением?

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

Privacy Badger

140 голосов
/ 02 февраля 2011

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

102 голосов
/ 02 февраля 2011

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 должен отражать ваши фактические рекламные контейнеры. Но это должно сработать.

EDIT

Как рекомендует 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, теоретически является проблемой).

85 голосов
/ 16 августа 2016

Никаких дополнительных запросов.Нет внешних библиотек.Просто, просто, 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);
  • Вы создаете элемент с классом adsbox (определяемый как съемный элемент в файле определения AdBlock Plus)
  • Вы добавляете егок документу и через некоторое время вы читаете его offsetHeight
  • Если AdBlock установлен, у элемента не будет высоты.

Кредит Пост Кристиана Хайльмана , я думаю, что это лучшее решение для определения AdBlock.

40 голосов
/ 12 января 2016

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

Пример с GoogleAds:

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

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

19 голосов
/ 03 февраля 2011

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

14 голосов
/ 27 октября 2014

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

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

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

11 голосов
/ 10 августа 2016

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

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

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

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

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

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

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

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

11 голосов
/ 26 февраля 2013

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

В частности, в этом примере вы можете определить, используется ли список Adblock по умолчанию, предоставленный Firefox Adblock.Преимущество заключается в том, что в этом блок-листе есть элемент, заблокированный с помощью идентификатора CSS #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 голосов
/ 08 июня 2012

Они используют тот факт, что рекламный код 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>
...