Как обнаружить Adblock на моем сайте?

370

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

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

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

Jmlevick
источник
2
возможный дубликат программы обнаружения AdBlocking?
416E64726577
5
Для пользователей, которые ищут новейшее решение, имейте в
виду, что
5
Некоторые люди просто не любят, когда их анализируют и рекламируют в Интернете. Некоторые сайты, которые я посетил, рассказывая нам, что доход поддерживает их проект, настолько увязли в рекламе, что это становится нелепым.
Пол
7
Теперь, когда сайты делают это все больше и больше (и злоупотребляют ими, лгут нам о том, что их реклама ненавязчива, и заставляют нас вносить в белый список весь их сайт, чтобы просто войти ...) - Есть ли какие-либо расширения или приемы, которые мы можем использовать чтобы предотвратить их обнаружение мы используем AdBlock +? - Я не против увидеть несколько целевых баннеров здесь или там, но клик, и постоянные полноэкранные видео-всплывающие окна - не мое дело, ребята.
BrainSlugs83
1
Пожалуйста, посмотрите мое решение, оно простое и чистое. Чистый JS, никаких дополнительных запросов, никаких внешних библиотек или плагинов или каких-либо других BS.
Кумуло Нимбус

Ответы:

410

Мое решение не относится к определенной рекламной сети и очень легкое. Я запускал его в производство в течение нескольких лет. 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

синхронизация
источник
1
Можете ли вы дать полную ссылку, js/ads.jsпожалуйста? поскольку я нахожусь в блоггере, я должен был загрузить .jsгде-нибудь (как: Google Drive), и ссылка в этом случае не содержит ads. Было бы очень полезно, если бы вы дали ссылку на ваш файл.
Deb
91
Файл содержит только слова "var canRunAds = true;" так что просто создай это сам.
время
5
Некоторые блокировщики рекламы, похоже, не блокируют файл ads.js, как для меня, простой adblock для chrome.
Mgamerz
2
ABP для хрома хорошо реагирует, поэтому все работает правильно!
Максим Лафари
9
Вы также можете попытаться выполнить запрос ajax для URL-адреса, заблокированного блокировщиком рекламы. Если это удастся, там нет adblocker, если это не удается, есть adblocker.
SethWhite
138

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

mavrck
источник
5
Пользователи по-прежнему могут блокировать эти заблокированные объявления, используя Adblock: это единственный недостаток, о котором я знаю.
Андерсон Грин
25
Это может быть легко, но это неправильный способ сделать это, если ваш макет искажается или реклама загружается медленно, пользователь может увидеть ошибку, которая не имеет к нему отношения. Также имейте в виду, что Adblock принимает меры для блокировки навязчивых сообщений, предназначенных для пользователей ABP. Если вы хотите попросить пользователя о разблокировке, сделайте это с помощью простого скрываемого сообщения, которое находится вне макета (не отталкивает другие элементы). Посмотрите на duckduckgo.com/?q=foo+bar с включенной блокировкой рекламы.
Xeevis
1
@Xeevis - что я ищу? - Я думаю, что AdBlock + уже блокирует все, что делает duckduckgo.
BrainSlugs83
101

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теоретически, любой из них больше, чем проблема).

Джаред Фарриш
источник
16
Перенаправление в этом случае плохая идея. Если ваша рекламная служба не работает, все посетители могут быть перенаправлены на эту страницу. Я также рекомендовал бы использовать событие onload окна, а не готовый документ.
Энди Э
1
лучший способ обнаружения был бы $ ('. myTestAd'). is (": hidden"); как указано в руководстве, оно также определяет, если ширина / высота равна 0 и если display = none.
TD_Nijboer
6
Redirecting in this case is a bad idea. If your advertising service goes down, all visitors could be redirected to that page.Верно. Не говоря уже о том, что они просто соединили бы простой сценарий, чтобы победить контрмеры. Кроме того, действительно ли вы считаете, что, будучи агрессивными и решительными, пользователи будут мотивированы отключать свои блокировщики рекламы? Нет, все, что можно было бы сделать, - это разозлить их и отравить их против вашего сайта. Большинство сайтов предпочитают просто отображать сообщение, а не становиться враждебным.
Synetech
Это не работает для меня в Chrome. В событии DOMReady объявление все еще кажется видимым.
nwellnhof
3
Пожалуйста, не запрещайте пользователям заходить на ваш сайт, потому что у них отключена реклама - это только усиливает гонку вооружений. - Если вы просите нас включить их, мы можем просто сделать это - если вы попытаетесь насильно заставить нас, мы либо просто перестанем заходить на ваш сайт, либо сообщим об ошибке на нашем блокировщике рекламы, и получим это исправлено для вашего сайта. - Это именно тот тип поведения, который существует для защиты пользователей от блокировщиков рекламы.
BrainSlugs83
93

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

Кумуло Нимбус
источник
5
Чтобы предотвратить сбои, вы можете добавить testAd.style.display = 'absolute'и убрать его с экрана
Gerald
4
хорошее решение, но для тех, кто страдает от задержки в 100 мс, я предлагаю добавить что-то вроде этого в тело документа: <div id="detect" class="ads ad adsbox doubleclick ad-placement carbon-ads" style="background-color:red;height:300px;width:300px;position: absolute;left:0;top:0;">&nbsp;</div>(конечно, после тестирования css следует изменить на <div id="detect" class="ads ad adsbox doubleclick ad-placement carbon-ads" style="height:1px;width:1px;position: absolute;left:-999px;top:-999px;">&nbsp;</div>)
godblessstrawberry
2
@ Джеральд Хороший вопрос. но AFAIK, absoluteэто positionценность.
Em Seven
могу ли я просто добавить, что это решение работает только тогда, когда я добавил его в window.onloadфункцию
Питер Каллен,
Обратите внимание, что это не работает для AdBlock для Firefox
Eda190,
42

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

Пример с GoogleAds:

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

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

JonMayer
источник
1
Это один из лучших способов проверить, загружено или нет объявление .. потому что вручную загружать свой собственный скрипт, полагаясь на блокировщик, чтобы блокировать тот, который будет иногда терпеть неудачу ..
MaZZly
Это, кажется, лучшее решение для динамически загружаемых скриптов.
Карка
Не знаю, изменилось ли что-то с тех пор, как это было написано, но я не могу вызвать ошибку с плагином chrome Fair Adblock от STANDS.
Мельчестер
по состоянию на март 2018 года все еще лучшее, простое и определенное решение
Даниил Вукасович
как сказано выше, это не работает с честным adblocker, это лучше проверитьoffsetHeight
cieunteung
17

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

кавалер
источник
9
google_render_ad теперь в любое время не определен, typeof (window.google_jobrunner)! = 'object' работает для меня.
Дмитрий Коротовский
4
Поскольку это не код, которым вы управляете, полагать, что это плохая идея, так как рефакторинг библиотеки приведет к тому, что ваш скрипт обнаружит рекламный блок для всех пользователей.
Патрик Забыл
1
typeofэто накладные расходы, если вы проверяете свойство объекта. Используйте просто === undefined.
Робо Робок
12

Мое самое простое решение с помощью 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, он терпит неудачу, и функция вызывается.

Лука Стиб
источник
10

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

отметка
источник
Мне очень нравится этот ответ, потому что он не требует дополнительных запросов. Есть ли минусы для этого подхода вместо поддельных запросов ads.js?
JeroenVdb
Вместо проверки длины и высоты, вы не можете просто использовать if ($ ("# bottomAd"). Is (': hidden')) ...?
Эван Ланглуа
@EvanLanglois, я знаю, что ты спрашивал два года назад, но твой вопрос действительно заинтересовал меня, поэтому я отправился в поиски информации об этом. По-видимому, .is(":hidden")проверка зависит от того, равны ли высота и ширина нулю. Если вы просто установили высоту на 0, но div все еще занимает ширину, то jQuery не считает его «скрытым». Так что, можете ли вы сказать, .is(":hidden")в некоторой степени зависит от того, как рекламодатель решает изменить размер / скрыть контент.
Спенсер D
10

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

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

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

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

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

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

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

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

paxdiablo
источник
1
Как насчет "Похоже, вы используете блокировщик рекламы. Это круто! Мы тоже :) Пожалуйста, поддержите X, рассказав о нас своим друзьям!"
ADTC
3
хех, попытайтесь монетизировать что-то таким образом ... реклама - это обычный способ оплаты, поэтому пользователь должен заплатить
dev1223
а что у меня с макетом не работает при включенном adblock?
Godblessstrawberry
5
Если веб-сайт вынуждает меня отключить блокировку рекламы, я продолжаю. Они проигрывают, а мне все равно. Я просто вытащил кэшированную копию из Google.
RayfenWindspear
1
@ Tallboy, в моем ответе нет этики. Существует только реальность аудитории, на которую вы пытаетесь ориентироваться. И, хотя ваши намерения могут быть такими, как описано, повторное чтение вопроса покажет вам, что оно было специально для того, чтобы попросить пользователя разрешить рекламу, а не убирать макет или что-то подобное. Это был вопрос , который я отвечал, не какой - то другой вопрос envisgaged половины десятилетия позже :-)
paxdiablo
9

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

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

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>

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

дресвы
источник
Это удивительный человек, большое спасибо 💓
Jodyshop
8

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

Роман Лосев
источник
7

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

Салман А
источник
Это будет работать в большинстве случаев, но что, если у пользователя медленное соединение (например, мобильные устройства)?
Лука Стиб
6

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

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 активен.

NGix
источник
6

Вам не нужен дополнительный 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>

vorillaz
источник
6

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

uingtea
источник
6

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

var hasAdBlock = function (callback_has_adblock, callback_no_adblock) {

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

Это решение работает для всех видов рекламы, а не только для Google AdSense.

Джон Скумбурдис
источник
некоторые блокировщики рекламы блокируют jQuery, тогда скрипт не запускается, потому что «$ не определено». Лучше использовать чистый JS.
nyx
3

Несмотря на возраст этого вопроса, я недавно нашел его очень полезным и поэтому могу только предположить, что есть другие, все еще просматривающие его. Посмотрев здесь и в других местах, я предположил, что основные три проверки на стороне клиента для косвенного обнаружения блокировщика рекламы заключались в проверке заблокированных 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 с именем приманки, а также размещенное снаружи изображение с текстом «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 является «проверка», как это было бы , если advertimsent.jsбыл не заблокировано.
  • Размеры (и я думаю, видимость, поскольку скрытый объект не имеет высоты или ширины?) Фрейма

И стили:

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

div#myTestAd2
{
    display: none;
}

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

Люк С
источник
3

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

Трой Морхаус
источник
2
Это, конечно, зависит от того, как реклама была заблокирована. Если ваше программное обеспечение для блокировки рекламы вообще не позволяет загружать AdSense, это будет работать. Но если ваша программа блокировки рекламы делает что-то вроде установки свойства отображения CSS на «none» или высоты соответствующего div на 0, то это может не сработать.
Бангкок
Правда. Я не думаю, что есть простой способ поймать 100% всех рекламных блоков, но, по крайней мере, вы можете поймать некоторые из них.
Трой Морехаус
3

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

cieunteung
источник
2

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

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

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

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

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

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

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

Kot
источник
1
<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;

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

Mikas
источник
другие заблокированные файлы: easylist-downloads.adblockplus.org/easylist.txt это фильтр AdBlock по умолчанию
mikas
АБР, кажется, trueвсегда
Deb
1

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

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

$(document).ready(function(){
    if(isAdBlocked()) {
       alert('Y U NO LIKE ADS?');
    }
});
jesal
источник
Просто попробовал это; не работает. Всегда возвращает true, даже если программное обеспечение для блокировки рекламы не установлено.
ecnepsnai
Имейте в виду, что это будет работать только на той странице, где вы используете AdSense. В противном случае он всегда будет возвращать true, потому что это правильный ответ - window.google_jobrunner не будет обнаружен ни на одной странице. Только те, которые используют Google AdSense. Вы можете увидеть этот код работает на моем сайте: ruddl.com
jesal
Интересно, что ваш метод использует то же сообщение, что и HowToGeek . Для справки, отображение окна сообщения не раздражает и не раздражает пользователей вашего сайта; большинство сайтов предпочитают отображать сообщение на странице (HTG пытается сделать и то, и другое, но работает только раздражающее всплывающее окно).
Synetech
1

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

<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>
Джон
источник
1

Нет необходимости в тайм-аутах и ​​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';
});
Rodrigo-Силвейра
источник
1

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

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

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

Он открыт по лицензии Coffeeware .

Jmlevick
источник
Оцените усилия, но, похоже, не работает с adblock ... по крайней мере, на момент написания этого комментария.
Арунскриш
он работает с adBlock, сайт, где я реализовал этот плагин - calyphrox.net, где любой может действительно проверить, работает ли плагин.
Jmlevick
3
Ссылка мертва ... мы можем удалить это?
Эван Ланглуа
2
Пожалуйста, обновите ссылки, это делает это плохим ответом.
Язан Равашде
0

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

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

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

Эйр Ним
источник
0

timing's Ответ хорошо продуман, но больше не работает, поэтому я изменил имя файла js на «adsense» из «ads», и теперь он работает как шарм!

Вот код, может быть, это кому-то поможет:

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

eclipseR
источник
0

Теперь есть лучший способ сделать это с помощью простого JS-скрипта под названием 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 мс, потому что он должен ждать, пока adblocker сделает свое дело, или он не будет работать.

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

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

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

EXTRA

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

Ник Рамо
источник
Плохое решение Внешний файл .js легко блокируется.
Бангкок
@Bangkokian Просто скопируйте, и он ссылается на него (и его лицензию) в вашем сообщении, показывая файл javascript или index.js (или любой другой).
BlueEyesWhiteDragon
1
@BlueEyesWhiteDragon Вы правы. Но это совсем не то, что был первоначальный ответ Трои. Теперь он на 100% отредактирован, чтобы показать встроенный скрипт. Мой комментарий стоит. Его оригинальный ответ был специально использовать внешний скрипт. stackoverflow.com/posts/34738388/revisions
Бангкок
@Bangkokian точно, я забыл упомянуть, что благодаря вашему комментарию я отредактировал свой ответ, чтобы следовать рекомендациям SO и сделал его встроенным сценарием. Спасибо.
Ник Рамо
0

Вы можете проверить это, это может помочь обнаружить-adblocker

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

Добавьте это перед любым скриптом в теге head:

<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
}
Мустафа Двекат
источник
Не работает Он всегда показывает, что реклама заблокирована.
Химаншу Аггарвал
проверьте значение window.adblockerв консоли браузера, если оно вернется, trueтогда adblocker включен, в противном случае он вернется. falseВы можете проверить полную документацию Detect-Adblocker
Mustafa Dwekat