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

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

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

Ответы [ 38 ]

9 голосов
/ 27 апреля 2015

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

7 голосов
/ 03 января 2016

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

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

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>
7 голосов
/ 30 мая 2014

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

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

7 голосов
/ 07 августа 2015

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

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

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

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

  1. Я создал непустой элемент div с классом bottom-ad: <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 активен.

7 голосов
/ 09 января 2015

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

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>

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

6 голосов
/ 31 августа 2016

безопасный способ - обернуть вашу рекламу внутри <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.

4 голосов
/ 28 марта 2015

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

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

4 голосов
/ 14 декабря 2013

Эффективный способ проверить, есть ли рекламный блок: Просто проверьте, включен ли рекламный блок, попытавшись вызвать 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.

3 голосов
/ 02 марта 2014

Несмотря на возраст этого вопроса, недавно я обнаружил, что он очень полезен, и поэтому могу только предполагать, что другие его еще просматривают.Посмотрев здесь и в других местах, я предположил, что основные три проверки на стороне клиента для косвенного обнаружения блокировщика рекламы заключались в проверке заблокированных div / img, заблокированных iframe s и заблокированных ресурсов (файлов javascript).

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

На страницевы запускаете проверки add: (я использую 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 с именем приманки кака также внешнее размещенное изображение с текстом «Advert» и размерами, используемыми AdSense (благодаря placehold.it!).

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

$(document).ready(
{

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

});

А затем сценарий обнаружения блокировщика рекламы, которыйобъединяет все

$(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 является "check", как это было быбыли, если advertimsent.js был не заблокирован.
  • Размеры (и я предполагаю, что скрытый объект не имеет высоты или ширины?) iframe

И стили:

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

div#myTestAd2
{
    display: none;
}

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

2 голосов
/ 22 июня 2015

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