Подтвердить что ты не робот

Обнаружение блокировки рекламы AKA Adblock Plus

После поиска Google и Stackoverflow в течение нескольких часов я не смог найти решение. То, что я пытаюсь сделать, это обнаружить Adblock plus и показывать простое сообщение.

Что я хочу сделать, это обнаружить Adblock plus без, используя файл JavaScript или jQuery. Большинство скриптов adblock plus обнаруживают, что они используют файл, например "show_ads.js", который размещен на собственном домене, с линией, в которой он установлен, чтобы установить его "adblock = false;"

Проблема с использованием файла JavaScript, пользователи могут белым списком этого файла JavaScript, и он больше не будет его обнаруживать. Я ищу JavaScript, который загружается непосредственно в HTML, который обнаружит, что кто-то использует блокировщик рекламы без использования файла.

Пример ниже:

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

 if so display message
 </script>

Причина, по которой это делается, не блокирует блокировку рекламы на JavaScript файле на вашем сервере. Да, я знаю, что есть другие способы обойти это с помощью дополнений NoScript, но у меня уже есть решение для этого. У меня есть отличная идея, которая никогда не была проверена, и блокировщики рекламы не могут заблокировать ее, как только я с ней справится.

Приветствуются любые предложения и примеры.

4b9b3361

Ответ 1

Я нашел один из лучших сценариев, если вы используете сторонние объявления.

antiblock.org Отказ от ответственности Я вообще не связан с этим сайтом.

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

Ответ 2

Вам не нужно иметь плагин для обнаружения рекламного блока, просто используйте это:

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

Содержимое adframe.js:

adblock = false;

Update: Adblock Plus блокирует определенные запросы или скрывает определенные элементы на основе уже существующих шаблонов. Один из этих шаблонов - это (в patterns.ini):

[Filter]
text=/adframe.
hitCount=843
lastHit=1456391595626

который блокирует любой URL с /adframe. в нем.

Ответ 3

Используйте мой плагин "FuckAdBlock", он может очень легко обнаружить AdBlock: https://github.com/sitexw/FuckAdBlock

Пример:

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

Пример онлайн: http://fuckadblock.sitexw.fr/

Ответ 4

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

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

С CSS:

#ad-container {
  background-image: url( http://domain.com/pleasedonotuseadblocker.png );
  height: 200px;
  width: 200px;
}

#ad {
  height: 200px;
  width: 200px;
}

Ответ 5

Если вы хотите показывать объявления, даже когда AdBlock активен, вам нужно будет понять, что AdBlock способен сделать.

  • AdBlock может блокировать ресурсы при загрузке
  • AdBlock может скрывать определенные элементы в DOM.

Хотя сказано, что AdBlock также может изменять CSS, я не могу найти какую-либо документацию, кроме скрыть и свернуть элементы.


Итак, что именно вы могли сделать, чтобы быть "умнее", чем AdBlock?

Вы можете замаскировать свой запрос таким образом, чтобы он никогда не был "сопоставим" (например, http://domain.com/ae9a70e0a.png, где имя изображения будет случайным каждый раз и без общего префикса). Насколько мне известно, правило в AdBlock не может содержать регулярное выражение. Правило не будет равно ни объявлений, ни слишком большого количества ресурсов. Можно было бы переписать такой URL-адрес на сервере, чтобы указать на ваше объявление.

Однако, хотя AdBlock, возможно, не сможет заблокировать ваше объявление от загрузки, он все равно сможет его скрыть. Никакого реального способа обойти это невозможно. Всегда найдется умный селектор CSS, который будет -just- выбирать ваш элемент. Однако вы можете добавить фоновое изображение с контентом. Это не полезно для объявления (не доступно для кликов), но может помочь вам отобразить другое сообщение. Недостатком является то, что если кто-то решит заблокировать это раздражающее фоновое изображение, он также скроет ваш контент.


Что касается script, вы можете загрузить объявление с помощью запроса ajax. Я полагаю (но не могу проверить), что он даст ошибку, если ресурс не может быть загружен (потому что он был заблокирован). ($.ajax( request ).error( function() { ... } ); в jQuery или какой-либо эквивалент в обычном javascript). Вы можете использовать это, чтобы сделать что-то еще. Вы можете включить это в сам документ вместо внешнего ресурса, чтобы гарантировать, что он всегда будет работать (если включен javascript). Даже тогда вы не можете быть уверены, что "что бы вы ни делали" никогда не будет заметно отображаться. В качестве последней меры вы можете сделать window.alert( ... ). Предположим, что в течение 3 страниц ваши посетители никогда не вернутся, если вы их используете.

Другим способом, о котором я могу думать, является создание websocket на сервере (afaik это не может быть заблокировано AdBlock). На стороне сервера вам нужно будет проверить, не загружены ли страницы объявлений, когда загружена определенная страница. Эта информация может быть отправлена ​​через сокет, который можно использовать в script для выполнения "чего-то". Это, однако, кажется сумасшедшим сложным и является значительным накладным капиталом для "всего лишь" script, который обнаруживает AdBlock.

Ответ 6

Вот код для обнаружения рекламного блока. Вы можете узнать, как работает код здесь

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

Ответ 7

Следующий фрагмент будет в значительной степени определять все блокировки рекламы. Требуется jQuery.

(function(){
    var bait = 'http://googleads.g.doubleclick.net/pagead/gen_204?id=wfocus&gqid=advertisment&advert=ads';
      $.ajax({ url: bait, dataType: "script"})
      .fail(function () { alert('ad blocked'); })
      .abort(function () { alert('ad blocked'); });
    })();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Ответ 8

Простой вызов Ajax выполняет задание:

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

Или даже лучше, без дополнительных HTTP-ресурсов:

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

Ответ 9

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

В любом случае, сейчас стоит отметить, что есть много расширений/плагинов для adblocking, и все они могут иметь разные способы сделать это, и иногда они различаются между ОС и браузерами. Я обнаружил, что для моих целей прямо сейчас этот селектор jQuery достаточно, чтобы хотя бы увидеть, используется ли AdBlock или AdBlockplus, кросс-платформенный, по крайней мере, в Chrome и Firefox:

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

Ответ 10

В моем случае ADB скрывал контент даже в том случае, если не было рекламы. (просто потому, что слово ad присутствовало во многих URL-адресах, потому что это был пул типа post.)

Но я заметил, что они не удаляют контент, просто применяя отображение: none к телу

Итак, как дополнительное решение,

Я только заметил, что применение display: block! important; к телу, предотвращает скрытие содержимого с помощью Adblock plus

<body style="display: block !important;"> <img src="url-containg-ad-ads-word.jpg" alt="you should see this anyway" > </body>

Ответ 11

Простое обнаружение javascript/jQuery, которое прекрасно работает:

$('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();

Ответ 12

Я знаю, что это уже давно, но здесь ИМХО - лучший способ сделать это:
Добавьте это в раздел <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

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