Як виявити Adblock на моєму веб-сайті?


370

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

Якщо ви зайшли на цей сайт і у вашому веб-переглядачі ввімкнено якесь програмне забезпечення для рекламного блоку, то на сайті замість показу реальної реклами відображається невеликий банер, який повідомляє користувачам, що дохід від реклами використовується для розміщення проекту, і вони повинні розглянути можливість вимкнення Adblock. .

Я хочу це зробити на своєму веб-сайті, я використовую на ньому рекламу adsense. Як це зробити?


2
можливий дублікат програми виявлення AdBlocking?
416E64726577

5
Користувачам, які шукають останнє рішення, будь ласка, знайте, що є комплексне підключене рішення, доступне на веб-
yeaske

5
Деякі люди просто не люблять їх аналізувати та рекламувати в Інтернеті. Деякі сайти, які я відвідав, говорять про те, що дохід підтримує їхній проект, настільки завалився в рекламі, що стає смішним.
Павло

7
Тепер, коли сайти роблять це все більше і більше (і зловживають цим, і брешуть нам про те, що їхні реклами не є нав'язливими, і змушують нас додати до списку весь їхній сайт просто для того, щоб увійти ...) - Чи є розширення чи хитрощі, які ми можемо використовувати щоб запобігти їх виявленню, ми використовуємо AdBlock +? - Я не проти бачити кілька таргетованих рекламних банерів тут чи там, але клацнувши підключенням, і постійні повнеекранні спливаючі вікна - це не моє, хлопці.
BrainSlugs83

1
Будь ласка, подивіться моє рішення, це просто і чисто. Чистий JS, без зайвих запитів, без зовнішніх бібліотек чи плагінів чи будь-яких інших BS.
Cumulo Nimbus

Відповіді:


410

Моє рішення не характерне для певної рекламної мережі і дуже легке. Я працюю ним у виробництві вже кілька років. 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 насправді допомагає нам розробникам виявити блокування реклами з їх розширенням?

Не працює з:

Конфіденційність Badger


1
Ви можете дати повне посилання, js/ads.jsбудь ласка? так як я є в блогері, мені довелося .jsдесь завантажити (наприклад: Google Drive), і посилання в цьому випадку не містить ads. Було б дуже корисно, якщо ви дасте посилання вашого файлу.
Деб

91
Файл містить лише слова "var canRunAds = true;" тому просто створіть його самостійно.
час

5
Деякі блокатори оголошень, схоже, не блокують файл ads.js, як на мене, простий рекламний блок для хромування.
Mgamerz

2
ABP для хрому добре реагує, тому все працює належним чином!
Максим Лафарі

9
Ви також можете спробувати запустити запит ajax на URL-адресу, заблоковану adblocker. Якщо це вдасться, немає adblocker, якщо він не працює, є adblocker.
SethWhite

138

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


5
Користувачі все ще можуть заблокувати ці заблоковані оголошення за допомогою Adblock: це єдиний недолік, про який я знаю.
Андерсон Грін

25
Це може бути простим, але це не правильний спосіб зробити це, якщо ваш макет викривляється або реклама завантажується повільно, користувач може помітити помилку, яка не стосується його. Також слід пам’ятати, що Adblock вживає заходів для блокування нав'язливих повідомлень, націлених на користувачів ABP. Якщо ви хочете попросити користувача розблокувати, зробіть це за допомогою простого прихованого повідомлення, яке сидить поза макетом (не відштовхує інші елементи). Подивіться на duckduckgo.com/?q=foo+bar з увімкненою функцією adblock .
Xeevis

1
@Xeevis - що я шукаю? - Я думаю, що AdBlock + вже блокує те, що робить качка.
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 повинен відображати ваші фактичні рекламні контейнери. Але це має працювати.

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


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

1
кращим способом виявлення буде $ ('. myTestAd'). is (": приховано"); як зазначено в посібнику, він також визначає, чи ширина / висота дорівнює 0, а якщо дисплей = немає.
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

92

Без зайвих запитів. Жодних зовнішніх бібліотек немає. Просто звичайний, простий 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);

  • Ви створюєте елемент із рекламним полем класу (як визначено як знімний елемент у файлі визначення AdBlock Plus)
  • Ви додаєте його в документ і через короткий час ви прочитаєте його зміщенняHeight
  • Якщо встановлено AdBlock, елемент не матиме висоти.

Кредит на пост Крістіана Гайлмана в , я думаю , що це, безумовно , є кращим рішенням для виявлення AdBlock.


5
Щоб запобігти збоям, ви можете додати testAd.style.display = 'absolute'та перемістити його з екрану
Gerald

4
хороше рішення, але для тих, хто страждає від затримки 100 мс, я пропоную додати щось подібне до doc body: <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
@Gerald Добре. але AFAIK absolute- positionцінність.
Em Сім

Чи можу я просто додати, я працював лише над цим рішенням, коли я додав його в межах window.onloadфункції
Пітер Каллен

Зауважте, що це не працює для AdBlock для Firefox
Eda190

42

Більшість оголошень динамічно завантажуються у javascript. Я просто використав подія onerror, щоб визначити, чи може сценарій реклами завантажуватися чи ні. Здається, працює.

Приклад з GoogleAds:

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

Це можна використовувати і для інших елементів, щоб побачити, чи блокує вміст рекламний блокатор. Цей метод може створити помилкові позитиви, якщо віддалені елементи не існують або їх неможливо досягти.


1
Це один з найкращих способів перевірити, завантажується чи ні. Оскільки вручну завантажується власний сценарій, спираючись на блокатор, щоб заблокувати той, який часом не вдасться ..
MaZZly

Це здається найкращим рішенням для динамічно завантажених сценаріїв.
Carca

Не знаю, чи щось змінилося з моменту написання цього запису, але я не можу запустити onerror за допомогою Fair Adblock від хромованого плагіна STANDS.
Мельчестер

станом на березень 2018 року, все-таки найкраще, просте та визначене рішення
Данило Вукасович

як сказано вище, це не працює з справедливим adblocker, краще перевіритиoffsetHeight
cieunteung

17

Щоб визначити, чи блокує користувач рекламу, все, що вам потрібно зробити, - це знайти функцію в JavaScript 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


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

Advertisement.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; незалежно від того, активний був блокувальник. У мене були дві ідеї з цього приводу: або візуалізація ще не була зроблена, або Адблок ще не почався. Я не намагався далі розслідувати.


Мені дуже подобається ця відповідь, оскільки вона не передбачає отримання додаткових запитів. Чи є мінуси для цього підходу замість підроблених запитів ads.js?
JeroenVdb

Замість тестування довжини та висоти, ви не можете просто використовувати if ($ ("# bottomAd"). Is (': hidden')) ...?
Еван Ланглуа

@EvanLanglois, я знаю, що ви задали два роки тому, але ваше питання насправді мене зацікавило, тому я пішов пірнати для отримання інформації про нього. Мабуть, це .is(":hidden")перевірка залежить від того, чи дорівнює і висота, і ширина. Якщо ви просто встановите висоту до 0, але div все ще займає ширину, jQuery це не вважається "прихованим". Отже, чи можна сказати, .is(":hidden")дещо залежить від того, яким чином adblocker вирішить змінити розмір / приховати вміст.
Спенсер Д

10

Моя порада: не робіть цього!

Будь-який сценарій, коли ви ставитесь до людей як до "кривдників", призведе до того, що вони дадуть опір.

Ось моя пропозиція.

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

На іншій сторінці дайте зрозуміти, що ви розумієте, що це їхній комп'ютер, і вони можуть безкоштовно блокувати оголошення.

Також переконайтеся , що ясно в НЕ обвинувальним чином , що використання цих блокаторів робить його більш важким для вас , щоб доставити великий вміст (пояснюючи , чому в деталях) , і що, в той час як ви вважаєте за краще блокування реклами , щоб не сталося на вашому сайті, це повністю їх рішення. Орієнтуйтеся на позитиви блокування відключення.

Ті, хто щиро виступає проти реклами, проігнорують це, але ви ніколи не мали шансу переконати їх. Байдужі люди можуть бути порушені вашим зверненням, оскільки ви не займаєтесь цією справою "дозвольте мені пройти, або я візьму свій бал і поїду додому", що, чесно кажучи, має бути ексклюзивним доменом п'ятирічних дітей.

Пам’ятайте, ніхто не тримав гармати до голови і не змушував вас класти свої речі в мережу. Ставтеся до своєї читацької аудиторії / користувачів з повагою, і ви, мабуть, знайдете, що їх кількість буде взаємною.


1
Як щодо "Схоже, ви використовуєте блокатор оголошень. Це здорово! Так ми! :) Будь ласка, підтримайте X, повідомляючи про нас своїм друзям!"
ADTC

3
хе, спробуйте щось монетизувати таким чином ... реклама - це звичайний спосіб оплати, тому користувач повинен платити
dev1223

що з моєю схемою порушено, коли рекламний блок увімкнено?
godblessstrawberry

5
Якщо веб-сайт змушує мене відключити блокатор оголошень, я рухаюся далі. Вони програють, і мені все одно. Я просто витягую кешовану копію з Google.
RayfenWindspear

1
@Tallboy, в моїй відповіді немає етики. Існує лише реальність аудиторій, на яку ви намагаєтеся орієнтуватися. І хоча ваші наміри можуть бути такими, як описано, повторне читання питання покаже вам, що це було спеціально для того, щоб просити користувача дозволити рекламу, а не прибирати макет чи щось подібне. Це питання, на яке я відповідав, а не якесь інше питання, яке передбачалося через пів десятиліття :-)
paxdiablo

9

Вони використовують той факт, що рекламний код Google створює рамку з ідентифікатором "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>

Знайшли це рішення тут


Це дивовижна людина, дуже дякую 💓
Джодішшоп

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


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>


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.


6

Ефективний спосіб перевірити наявність рекламного блоку. Просто перевірте, чи ввімкнено adblock, намагаючись запустити 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.


деякі adblockers блокують jQuery, тоді сценарій не запускається, оскільки "$ не визначено". Краще використовувати чисті js.
nyx

3

Незважаючи на вік цього питання, я нещодавно виявив це дуже корисним, тому можу лише припустити, що його ще переглядають інші. Подивившись тут і в іншому місці, я припустив, що основні три перевірки на стороні клієнта щодо опосередкованого виявлення блокатора оголошень полягають у тому, щоб перевірити наявність заблокованих div/ img, заблокованих iframes та заблокованих ресурсів (файли 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>");

});

А потім скрипт виявлення блокатора реклами, який поєднує все

$(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. Потім, коли вікно завантажується , тобто включно із утриманням. завантажуються зображення тощо, ми перевіряємо:

  • Розміри та видимість першого тестового діва.
  • Що вміст другого тестового діва є "перевірити", як це було б, якби неadvertimsent.js було заблоковано.
  • Розміри (і я думаю, видимість, оскільки прихований об’єкт не має висоти чи ширини?) Iframe

І стилі:

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()є хорошою практикою, оскільки без цього буде гонка сценарію з адблокером.

Сценарій нижче перевірятиме, чи 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>


2

Усі наведені вище відповіді справедливі, однак більшість не працюватимуть для блокування оголошень на рівні DNS.

Блокатори оголошень на рівні DNS (наприклад, пі-дірка) ) в основному повертають NXDOMAIN (домен не існує) для списку доменів блокування реклами (наприклад, telemetry.microsoft.com "не буде існувати", коли він з'явиться).

Є кілька способів обійти це:

Спосіб A : Запит оголошень за ip адресою, а не доменом.

Цей метод трохи дратує, оскільки вам доведеться слідкувати за IP-адресами. Це буде проблематично, якщо ваш код не підтримується або регулярно оновлюється.

Спосіб B : Блокуйте всі запити, які не працюють, навіть якщо клієнт повідомляє про NXDOMAIN.

Це буде дуже дратувати користувачів, якщо це "законний" NXDOMAIN.


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.


інші заблоковані файли: easylist-downloads.adblockplus.org/easylist.txt це фільтр AdBlock за замовчуванням
mikas

adb, здається, trueзавжди
Deb

1

Це для мене працювало:

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

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

Просто спробував це; не працює. Завжди повертає істину, навіть коли не встановлено програмне забезпечення для блокування реклами.
ecnepsnai

Майте на увазі, що це працюватиме лише на сторінці, де ви використовуєте AdSense. Інакше він завжди повернеться істинним, тому що це правильна відповідь - 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';
});

1

Щойно я створив власний "плагін" для вирішення цього питання, і він працює дуже добре:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

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

Він відкритий під ліцензією Coffeeware .


Дякуйте за зусилля, але, здається, не працює з adblock ... принаймні, коли написано цей коментар.
arunskrish

він працює з 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;


0

Тепер є кращий спосіб зробити це за допомогою простого сценарію JS під назвою детектор AdBlock
Ось як його використовувати:
Додайте це до свого <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 елемент для блокування користувачів.

Цей сценарій працює для більшості (якщо не всіх) блокаторів оголошень.

ДОПОМОГА

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


Погане рішення. Зовнішній .js-файл легко блокується.
Бангкокіян

@Bangkokian Просто скопіюйте та посилайтеся на це (та його ліцензію) у своєму повідомленні, у якому відображається файл JavaScript або index.js (або будь-який інший).
BlueEyesWhiteDragon

1
@BlueEyesWhiteDragon Ви маєте рацію. Але це зовсім не те, що було оригінальною відповіддю Трої. Зараз він на 100% відредагований для показу вбудованого сценарію. Мій коментар стоїть. Його оригінальною відповіддю було спеціально використання зовнішнього сценарію. stackoverflow.com/posts/34738388/reitions
Бангкокіян

@Bangkokian точно, я забув згадати, що завдяки вашому коментарю я відредагував свою відповідь, щоб слідувати вказівкам SO, і зробив її вбудованим сценарієм. Дякую.
Нік Рамо

0

Ви можете перевірити це, це може допомогти виявити adblocker

Це реалізація відповіді на терміни

Додайте це перед будь-яким сценарієм у головному тезі:

<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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.