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

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

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

Ответы [ 38 ]

2 голосов
/ 18 февраля 2014

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

<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>
2 голосов
/ 22 февраля 2019

Большинство 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>
2 голосов
/ 21 февраля 2014

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

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

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

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

1 голос
/ 09 января 2016

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;

1 голос
/ 19 апреля 2019

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

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

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

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

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

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

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

1 голос
/ 21 марта 2013
<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.

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

Теперь есть лучший способ сделать это, используя простой 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 для пользователей adblock.

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

EXTRA

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

1 голос
/ 19 июля 2013

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

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

$(document).ready(function(){
    if(isAdBlocked()) {
       alert('Y U NO LIKE ADS?');
    }
});
1 голос
/ 10 апреля 2016

Вы можете проверить это, это может помочь detect-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
}
0 голосов
/ 12 апреля 2019

В React.js вы можете делать следующее:

class AdblockDetect extends Component {
  constructor (props) {
    super(props)
    this.state = {
      usingAdblock: false
    }
  }

  componentDidMount() {
    this.setState({ usingAdblock: this.fakeAdBanner.offsetHeight === 0 });
  }

  render() {
    if (this.state.usingAdblock === true) {
      return this.props.children;
    }

    return (
      <div
        ref={r => (this.fakeAdBanner = r)}
        style={{ height: '1px', width: '1px', visiblity: 'none', pointerEvents: 'none' }}
        className="adBanner"
      />
    );
  }
}

class App extends Component {
  render() {
    return (
      <div className="App">
        <AdblockDetect>You are using adblock</AdblockDetect>
      </div>
    );
  }
}

Источник: https://stackoverflow.com/a/55635499/5539715

...