Como detectar o Adblock no meu site?

370

Gostaria de poder detectar se o usuário está usando um software de bloqueio de anúncios quando visitar meu site. Se eles estiverem usando, quero exibir uma mensagem pedindo para desativá-lo para dar suporte ao projeto, como este site faz.

Se você entrar nesse site e seu navegador tiver algum tipo de software de bloqueio de anúncios ativado, o site, em vez de mostrar os anúncios reais, exibirá uma pequena faixa informando aos usuários que a receita do anúncio é usada para hospedar o projeto e eles devem considerar desativar o Adblock .

Quero fazer isso no meu site, estou usando anúncios adsense, como posso fazer isso?

Jmlevick
fonte
2
possível duplicata do software Detecting AdBlocking?
416E64726577
5
Para usuários que procuram uma solução mais recente, saiba que existe uma solução plugável abrangente disponível em github.com/sitexw/BlockAdBlock
yeaske
5
Algumas pessoas simplesmente não gostam de ser analisadas e anunciadas na web. Alguns sites que visitei, informando que a receita apóia o projeto, estão tão atolados em anúncios que se tornam ridículos.
Paul
7
Agora que os sites estão fazendo isso cada vez mais (e abusando dele, e mentindo para nós sobre seus anúncios serem intrusivos e nos forçando a colocar na lista branca todo o site apenas para entrar ...) - Existem extensões ou truques que podemos usar para impedir que eles detectem, usamos o AdBlock +? - Não me importo de ver alguns banners direcionados aqui ou ali, mas clique em jacking e pop-ups constantes de vídeo em tela cheia não são a minha cara.
precisa saber é o seguinte
11
Por favor, veja minha solução, é simples e limpa. JS puro, sem solicitações extras, sem bibliotecas ou plugins externos ou qualquer outro BS.
Cumulo Nimbus 30/08/16

Respostas:

410

Minha solução não é específica para uma determinada rede de anunciantes e é muito leve. Venho produzindo isso há alguns anos. O AdBlock bloqueia todos os URLs que contêm a palavra "anúncios". Então foi isso que eu fiz:

Adicionei um pequeno arquivo js ao meu webroot com o nome ads.js

Esta é a única linha de código nesse arquivo

var canRunAds = true;

Em algum lugar da minha página:

<html>
  <head>
    <script src="/js/ads.js"></script>
  </head>
  <body>
    <script>
      if( window.canRunAds === undefined ){
        // adblocker detected, show fallback
        showFallbackImage();
      }
    </script>
  </body>
</html>

Arquivos como ads.js são bloqueados por pelo menos esses bloqueadores de anúncios no Chrome:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • Ghostery

Atualizar em 2019-02-15:

Ghostery adicionado na lista acima, porque a extensão agora também bloqueia solicitações para ads.js. Muito conveniente. Isso significa que Ghostery está realmente nos ajudando os desenvolvedores a detectar o bloqueio de anúncios com sua extensão?

Não funciona com:

Texugo de privacidade

cronometragem
fonte
11
você pode dar o link completo de js/ads.jspor favor? como estou no blogger, tive que fazer o upload de .jsalgum lugar (como: Google Drive) e o link nesse caso não contém ads. Seria realmente útil se você der o link do seu arquivo.
Deb
91
O arquivo contém apenas as palavras "var canRunAds = true;" então apenas crie você mesmo.
sincronismo
5
Alguns bloqueadores de anúncios parecem não bloquear o arquivo ads.js, como para mim, o simples adblock for chrome.
Mgamerz
2
O ABP para chrome está reagindo bem, então tudo funciona corretamente!
Maxime Lafarie
9
Você também pode tentar executar uma solicitação ajax em um URL bloqueado por um bloqueador de anúncios. Se for bem-sucedido, não haverá bloqueador de anúncios; se falhar, haverá um bloqueador de anúncios.
SethWhite 16/11/2015
138

Não é uma resposta direta, mas eu colocaria a mensagem por trás do anúncio a ser carregado ... em vez de tentar detectá-lo, seria exibido apenas quando o anúncio não fosse.

mavrck
fonte
5
Os usuários ainda podem bloquear esses avisos de anúncios bloqueados usando o Adblock: essa é a única falha que eu conheço.
Anderson Green
25
Pode ser fácil, mas não é a maneira correta de fazê-lo. Se o layout ficar distorcido ou o anúncio for carregado lentamente, o usuário poderá vislumbrar um erro que não está relacionado a ele. Lembre-se também de que o Adblock está tomando medidas para bloquear mensagens invasivas direcionadas aos usuários do ABP. Se você deseja solicitar ao usuário o desbloqueio, faça-o através de uma mensagem oculta simples que fica fora do layout (não afasta outros elementos). Veja duckduckgo.com/?q=foo+bar com o adblock ativado.
Xeevis 30/04
11
@Xeevis - o que estou procurando? - Acho que o AdBlock + já bloqueia o que o duckduckgo está fazendo.
precisa saber é o seguinte
101

http://thepcspy.com/read/how_to_block_adblock/

Com jQuery:

function blockAdblockUser() {
    if ($('.myTestAd').height() == 0) {
        window.location = 'http://example.com/AdblockNotice.html';
    }
}

$(document).ready(function(){
    blockAdblockUser();
});

Obviamente, você precisa ter uma página de destino para AdblockNotice.html, e a classe .myTestAd precisa refletir seus contêineres de anúncios reais. Mas isso deve funcionar.

EDITAR

Como TD_Nijboer recomenda, a melhor maneira é usar o seletor :hidden(ou :visible, como eu uso abaixo), para que display: nonetambém seja verificado:

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

Obviamente, ambos podem ser combinados em um ifbloco, se desejado.

Observe que visibility: hiddentambém não será capturado (onde o espaço do layout fica, mas o anúncio não está visível). Para verificar isso, outro filtro pode ser usado:

$('.myTestAd').filter(function fi(){
    return $(this).css('visibility') == 'hidden';
})

O que fornecerá uma variedade de elementos de anúncio que são "invisíveis" (sendo qualquer um maior do que 0um problema, em teoria).

Jared Farrish
fonte
16
Redirecionar neste caso é uma má ideia. Se o seu serviço de publicidade for desativado, todos os visitantes poderão ser redirecionados para essa página. Eu também recomendo usar o evento onload da janela em vez de pronto para o documento.
Andy E
11
uma maneira melhor de detectar seria $ ('. myTestAd'). is (": hidden"); como o manual especifica, ele também detecta se a largura / altura é 0 e se 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.De fato. Sem mencionar que eles simplesmente juntariam um script simples para derrotar a contramedida. Além disso, você realmente acha que, sendo agressivo e forte, os usuários serão motivados a desativar seus bloqueadores de anúncios? Não, tudo o que faria seria irritá-los e azedá-los contra o seu site. A maioria dos sites prefere simplesmente exibir uma mensagem em vez de se tornar hostil.
22414 Synetech
Isso não funciona para mim no Chrome. No evento DOMReady, o anúncio ainda parece estar visível.
Nwellnhof 28/05
3
Não impeça que os usuários entrem no seu site porque eles têm anúncios desativados - isso apenas aumenta a corrida armamentista. - Se você nos pedir para ativá-los, podemos fazê-lo - se você tentar nos forçar, pararemos de ir ao seu site ou informaremos um bug no bloqueador de anúncios e obteremos foi corrigido para o seu site. - Esse é o tipo exato de comportamento do qual existem bloqueadores de anúncios para proteger os usuários.
BrainSlugs83
93

Sem pedidos extras. Nenhuma biblioteca externa. Simplesmente, JavaScript simples:

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

  • Você cria um elemento com a caixa de anúncios da classe (conforme definido como um elemento removível no arquivo de definição do AdBlock Plus)
  • Você o adiciona ao documento e, após alguns instantes, lê o offsetHeight
  • Se o AdBlock estiver instalado, o elemento não terá altura.

Crédito para o post de Christian Heilmann , acho que é de longe a melhor solução para detectar o AdBlock.

Cumulo Nimbus
fonte
5
Para evitar falhas, você pode adicioná testAd.style.display = 'absolute'-lo e movê-lo para fora da tela
Gerald
4
boa solução, mas para aqueles que sofrem as 100ms atrasar Sugiro adicionando algo como isto ao corpo doc: <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>(claro que depois de testar css deve ser alterado para <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 Bom ponto. mas AFAIK, absoluteé um positionvalor.
Em Sete
eu só posso acrescentar, eu só tenho essa solução de trabalho quando eu adicionei-lo dentro de uma window.onloadfunção
Peter Cullen
Observe que isso não funciona no AdBlock para Firefox
Eda190 30/17
42

A maioria dos anúncios é carregada dinamicamente em javascript. Acabei de usar o evento onerror para detectar se o script do anúncio pode ser carregado ou não. Parece funcionar.

Exemplo com GoogleAds:

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

Isso também pode ser usado em outros elementos para verificar se um bloqueador de anúncios está bloqueando o conteúdo. Este método pode produzir falsos positivos se os elementos remotos não existirem ou não puderem ser alcançados.

JonMayer
fonte
11
Esta é uma das melhores maneiras de verificar se o anúncio é carregado ou not..because carregar manualmente seu próprio script contando com o bloqueador para o bloco que se está indo falhar, às vezes ..
MaZZly
Essa parece ser a melhor solução para scripts carregados dinamicamente.
Carca
Não sei se algo mudou desde que isso foi escrito, mas não consigo disparar o onerror com o plug-in chrome Fair Adblock by STANDS.
Melchester
a partir de março de 2018, ainda o melhor, simples e solução definitiva
Daniel Vukasovich
como dito acima não é o trabalho com justa AdBlocker, é melhor verificaroffsetHeight
cieunteung
17

Para detectar se o usuário está bloqueando anúncios, tudo o que você precisa fazer é encontrar uma função no javascript do anúncio e tentar testá-la. Não importa qual método eles estão usando para bloquear o anúncio. Aqui está a aparência dos anúncios do Google Adsense:

if(!window.hasOwnProperty('google_render_ad') || window.google_render_ad === undefined) { 
    //They're blocking ads, display your banner
}

Este método é descrito aqui: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam

Beau
fonte
8
O google_render_ad agora está indefinido a qualquer momento, typeof (window.google_jobrunner)! = 'objeto' funciona para mim.
Dmitrii Korotovskii
4
Como não é um código que você controla, acho uma má idéia confiar nisso, pois um refator da biblioteca fará com que seu script detecte um bloco de anúncios para todos os usuários.
Patrick Esqueça
11
typeofé uma sobrecarga se você verificar a propriedade do objeto. Use simples === undefined.
Robo Robok
12

Minha solução mais fácil com o jquery é:

$.ajax({
    url: "/scripts/advertisement.js", // this is just an empty js file
    dataType: "script"
}).fail(function () {
    // redirect or display message here
});

advertisement.js não contém nada. Quando alguém usa o adblock, ele falha e a função é chamada.

Luca Steeb
fonte
10

Sei que já existem respostas suficientes, mas como essa pergunta surge no Google, procurei "detectar adblock" no tópico, queria fornecer algumas dicas caso você não estivesse usando o adsense .

Especificamente, com este exemplo, você pode detectar se a lista de Adblock padrão fornecida pelo Firefox Adblock é usada. É vantajoso que nesta lista de bloqueio haja um elemento bloqueado com o ID do CSS #bottomAd. Se eu incluir esse elemento na página e testar sua altura, eu sei se o bloqueio de anúncios está ativo ou não:

<!-- some code before -->
<div id="bottomAd" style="font-size: 2px;">&nbsp;</div>
<!-- some code after -->

O resto é feito através do suspeito jQuery usual:

$(document).ready( function() {
  window.setTimeout( function() {
    var bottomad = $('#bottomAd');
    if (bottomad.length == 1) {
      if (bottomad.height() == 0) {
        // adblocker active
      } else {
        // no adblocker
      }
    }      
  }, 1);
}

Como pode ser visto, estou usando setTimeoutcom pelo menos um tempo limite de 1ms. Eu testei isso em vários navegadores e na maioria das vezes, verificando diretamente o elemento readysempre retornado 0; independentemente de o bloqueador de anúncios estar ativo ou não. Eu estava tendo duas idéias sobre isso: ou a renderização ainda não foi concluída ou o Adblock ainda não foi lançado. Não me preocupei em investigar mais.

marca
fonte
Gosto muito dessa resposta porque ela não envolve solicitações extras. Há contras para essa abordagem, em vez de solicitações falsas de ads.js?
precisa saber é o seguinte
Em vez de testar comprimento e altura, você não pode simplesmente usar if ($ ("# bottomAd"). Is (': hidden')) ...?
Evan Langlois
@EvanLanglois, eu sei que você perguntou há dois anos, mas sua pergunta realmente me interessou, então fui procurar informações sobre ela. Aparentemente, a .is(":hidden")verificação depende se a altura e a largura são zero. Se você acabou de definir a altura como 0, mas a div ainda ocupa uma largura, ela não é considerada "oculta" pelo jQuery. Portanto, se você pode dizer, .is(":hidden")depende um pouco de como o bloqueador de anúncios decide redimensionar / ocultar o conteúdo.
Spencer D
10

Meu conselho é: não faça isso!

Qualquer cenário em que você trate as pessoas como "malfeitores" resultará em uma revanche.

Aqui está a minha proposta.

Coloque uma pequena mensagem discreta no topo da página (independentemente de os anúncios estarem bloqueados) com o texto I *totally* respect your right to block adse um link para outra página / pop-up intitulada Read more ....

Na outra página, deixe claro que você entende que é o computador deles e que eles são livres para usar o bloqueio de anúncios.

Também deixe claro , de maneira não acusatória, que o uso desses bloqueadores dificulta a exibição de um ótimo conteúdo (explicando detalhadamente o motivo) e que, embora você prefira que o bloqueio de anúncios não ocorra no seu site, é totalmente a decisão deles. Concentre-se nos aspectos positivos de desativar o bloqueio.

Aqueles que se opõem veementemente a anúncios ignoram isso, mas você nunca teve a chance de convencê-los. Aqueles que são indiferentes podem muito bem ser influenciados pelo seu apelo, já que você não está fazendo o todo "deixe-me fazer o que eu quero ou vou pegar minha bola e vou para casa", coisa que honestamente deveria ser o domínio exclusivo de crianças de cinco anos.

Lembre-se, ninguém colocou uma arma na sua cabeça e forçou você a colocar suas coisas na rede. Trate seus leitores / usuários com respeito e provavelmente encontrará um bom número deles.

paxdiablo
fonte
11
Que tal "Parece que você usa um bloqueador de anúncios. Isso é legal! Nós também :) Por favor, apoie o X contando seus amigos sobre nós!"
ADTC 01/09/16
3
heh tentar monetizar algo assim ... anúncios são maneira regular de pagamento, assim que o usuário deve prestar
dev1223
e o meu layout está quebrado quando o adblock está ativado?
godblessstrawberry
5
Se um site me forçar a desativar meu bloqueador de anúncios, seguirei em frente. Eles perdem, e eu não me importo. Acabei de pegar uma cópia em cache do Google.
RayfenWindspear
11
@Tallboy, não há ética na minha resposta. Existe apenas a realidade do público que você está tentando atingir. E, embora suas intenções possam ser as descritas, uma releitura da pergunta mostrará que ela foi especificamente solicitada ao usuário para permitir anúncios, não para limpar o layout ou algo parecido. Essa foi a pergunta que eu estava respondendo, não alguma outra questão envisgaged meia década mais tarde :-)
paxdiablo
9

Eles estão utilizando o fato de que o código de anúncio do Google cria um iframe com o ID "iframe". Portanto, desde que você ainda não tenha algo em sua página com esse ID, isso funcionará para você também.

<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>
Robbie
fonte
9

Basta adicionar um pequeno script ao seu site:

var isAdsDisplayed = true;

Com o nome adsbygoogle.js

Em seguida, faça o seguinte:

<script src="/js/adsbygoogle.js"></script>
<script>
if(window.isAdsDisplayed === undefined ) {
  // AdBlock is enabled. Show message or track custom data here
}
</script>

Encontrei esta solução aqui

druss
fonte
Isso é incrível, muito obrigado 💓
Jodyshop 17/04
8

Notei comentários anteriores usa o Google Adsense como objeto para testar. Algumas páginas não usam o adsense, e usar o bloco do adsense como teste não é realmente uma boa ideia. Porque o bloco do adsense pode prejudicar o seu SEO. Aqui está um exemplo de como eu detecto por classe bloqueada simples do 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" é um ID que o bloqueador de anúncios bloqueia. Portanto, verificando se está visível, você pode detectar se o bloqueador de anúncios está ativado.

Roman Losev
fonte
7

O AdBlock parece bloquear o carregamento de arquivos JavaScript do AdSense (etc). Portanto, se você estiver usando a versão assíncrona dos anúncios do AdSense, poderá verificar se adsbygoogleé um Array. Isso deve ser verificado após alguns segundos, pois o script assíncrono é ... assíncrono. Aqui está um esboço :

window.setTimeout(function(){
    if(adsbygoogle instanceof Array) {
        // adsbygoogle.js did not execute; probably blocked by an ad blocker
    } else {
        // adsbygoogle.js executed
    }
}, 2000);

Para esclarecer, veja um exemplo de como é o código de anúncios assíncronos do 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>

Observe que adsbygoogleé inicializado como uma matriz. A adsbygoogle.jsbiblioteca altera essa matriz para Object {push: ...}quando é executada. A verificação do tipo de variável após um certo tempo pode dizer se o script foi carregado.

Salman A
fonte
Isso funcionará mais tempo, mas e se um usuário tiver uma conexão lenta (pense em dispositivos móveis)?
Luca Steeb #
6

Essa abordagem eu uso no meu site, talvez você ache útil. Na minha opinião, é a solução mais simples .

O AdBlocker bloqueia classes específicas e elementos html. Ao inspecionar esses seletores de anúncios bloqueados no console do desenvolvedor (todos listados), você pode ver quais elementos serão sempre bloqueados.

Por exemplo, basta inspecionar esta página de pergunta no stackoverflow e você verá vários anúncios bloqueados.

Por exemplo, qualquer elemento com bottom-adclasse é bloqueado automaticamente.

  1. Criei um elemento div não vazio com a bottom-adclasse: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. Após o carregamento da página, verifique se este elemento está oculto. Eu usei o jQuery, mas fique à vontade para usar o javascript: $('.bottom-ad').css('display') == "none"ou melhor ainda, usando$('.bottom-ad').is(':visible')

Se o valor for true, o AdBlocker estará ativo.

NGix
fonte
6

Você não precisa de uma solicitação HTTP extra; basta calcular a altura de um complemento falso.

A propósito, aqui está uma lista completa dos elementos que os bloqueadores de anúncios evitam renderizar.

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

a maneira segura é envolver seus anúncios por dentro <div>e verificar a altura

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

funciona com adblock plus e firewall bluehell.

uingtea
fonte
6

Uma maneira eficiente de verificar se há um bloco de anúncios: basta verificar se há um bloco de anúncios ativado, tentando acionar o URL dos anúncios do Google. Se sim, execute o callback_has_adblock; caso contrário, execute o callback_no_adblock. Esta solução custa mais um pedido, mas pelo menos funciona:

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

Esta solução funciona para todos os tipos de anúncios, não apenas para o Google Adsense.

John Skoumbourdis
fonte
alguns bloqueadores de anúncios bloqueiam o jQuery, então o script não é executado porque "$ não está definido". Melhor usar js puro.
nyx 10/03
3

Apesar da idade dessa pergunta, recentemente a achei muito útil e, portanto, só posso assumir que ainda há outras pessoas que a visualizam. Depois de procurar aqui e em outros lugares, supus que as três principais verificações do lado do cliente para detectar indiretamente um bloqueador de anúncios fossem verificar recursos bloqueados div/ img, bloqueados iframee bloqueados (arquivos javascript).

Talvez esteja exagerado ou paranóico, mas cobre sistemas de bloqueio de anúncios que bloqueiam apenas um ou dois da seleção e, portanto, podem não ter sido cobertos se você tivesse feito apenas uma verificação.

Na página em que você está executando as verificações, adicione: (Estou usando 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>

e adicione o seguinte em qualquer outro lugar da página:

<div id="myTestAd"><img src="http://placehold.it/300x250/000000/ffffff.png&text=Advert" /></div>

Usei uma div com um nome de isca e uma imagem hospedada externamente com o texto "Advert" e nas dimensões usadas pelo AdSense (graças a placehold.it!).

Em advertisement.jsvocê deve acrescentar algo ao documento que podemos verificar mais tarde. Embora pareça que você está fazendo o mesmo que antes, na verdade você está verificando se o próprio arquivo ( advertisement.js) está sendo carregado, não a saída.

$(document).ready(
{

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

});

E então o script de detecção do bloqueador de anúncios que combina tudo

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

});

Quando o documento está pronto , ou seja, a marcação é carregada, adicionamos o iframe ao documento também. Então, quando a janela estiver carregada , ou seja, o conteúdo incl. imagens etc. é carregada, verificamos:

  • As dimensões e a visibilidade da primeira div de teste.
  • Que o conteúdo da segunda div de teste é "cheque", como teria sido se nãoadvertimsent.js estivesse bloqueado.
  • As dimensões (e acho que a visibilidade, como um objeto oculto, não tem altura ou largura?) Do iframe

E os estilos:

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

div#myTestAd2
{
    display: none;
}

Espero que isto ajude

Luke S
fonte
3

Se você estiver usando o novo código do Google AdSense, poderá fazer uma verificação fácil, sem recorrer a verificações de conteúdo ou CSS.

Coloque seus anúncios normalmente na sua marcação:

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

Em seguida, você chama o código do adsense na parte inferior da sua página (note que não use a "async"sinalização ao chamar o adsbygoogle.jsscript):

<script src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

Em seguida, adicione este pequeno trecho de código abaixo:

<script>
if (!adsbygoogle.loaded) {
   // do something to alert the user
}
</script>

O AdSense sempre cria / define o sinalizador adsbygoogle.loadedpara truequando os anúncios são carregados. Você pode colocar a verificação em uma função setTimeout para atrasar a verificação por alguns segundos.

Troy Morehouse
fonte
2
Obviamente, isso depende de como os anúncios foram bloqueados. Se o seu software de bloqueio de anúncios estiver impedindo o carregamento total do AdSense, isso funcionará. Mas se o seu software de bloqueio de anúncios estiver fazendo algo como definir a propriedade de exibição CSS como "none" ou a altura da respectiva div como 0, isso poderá não funcionar.
Bangkokian
Verdade. Eu não acho que exista uma maneira fácil de capturar 100% de todos os adblocks, mas pelo menos você pode capturar alguns deles.
Troy Morehouse
3

A maioria dos adblocker cancela a solicitação HTTP para ads.jse faz 0pxo elemento, mas em algum momento o adblocker removeu o DOM , e algumas respostas acima falharão porque não verificam a existência do elemento.

Usar setTimeout()é uma boa prática, porque sem ela, o script será executado com o adblocker.

O script abaixo verificará se o dom existe / foi removido e verificará offsetHeightum elemento, se existir.

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

Todas as respostas acima são válidas, no entanto, a maioria não funcionará no bloqueio de anúncios no nível DNS.

Os bloqueadores de anúncios no nível do DNS (como pi-hole ) basicamente retornam NXDOMAIN (o domínio não existe) para uma lista de domínios de bloqueio de anúncios (por exemplo, telemetry.microsoft.com "não existe" quando existe).

Existem algumas maneiras de contornar isso:

Método A : solicitação de anúncios por endereço IP, não por domínio.

Este método é um pouco chato, pois você precisaria acompanhar os endereços IP. Isso será problemático se o seu código não for bem mantido ou atualizado regularmente.

Método B : Bloqueie todas as solicitações que falharem, mesmo que o cliente relate NXDOMAIN.

Isso será muito irritante para os usuários se for um NXDOMAIN "legítimo".

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

e no arquivo getbanner.cfm:

adb = false;

Eu acho que é a maneira mais fácil de detectar adblock.

mikas
fonte
outros arquivos bloqueados: easylist-downloads.adblockplus.org/easylist.txt -lo do filtro AdBlock padrão
mikas
adb parece ser truesempre #
23414 Deb
1

Isto é o que funcionou para mim:

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

$(document).ready(function(){
    if(isAdBlocked()) {
       alert('Y U NO LIKE ADS?');
    }
});
jesal
fonte
Apenas tentei isso; não funciona. Sempre retorna true mesmo quando nenhum software de bloqueio de anúncios está instalado.
ecnepsnai
Lembre-se de que isso só funcionará em uma página em que você estiver usando o AdSense. Caso contrário, ele sempre retornará true, porque essa é a resposta correta - window.google_jobrunner não será detectado em nenhuma e em todas as páginas. Somente aqueles que estão usando o Google AdSense. Você pode realmente ver esse código funcionando no meu site: ruddl.com
jesal 3/13/13
Interessante que o seu método use a mesma mensagem que a usada pelo HowToGeek . Para o registro, exibir uma caixa de mensagem não faz nada além de irritar e agredir usuários no seu site; a maioria dos sites opta por exibir uma mensagem na página (o HTG tenta fazer as duas coisas, mas apenas o pop-up irritante funciona).
22414 Synetech
1

Sei que isso já foi respondido, mas examinei o site de amostra sugerido e vejo que eles fazem o seguinte:

<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>
John
fonte
1

Não há necessidade de timeouts e farejadores DOM. Simplesmente tente carregar um script de redes de anúncios populares e veja se o bloqueador de anúncios interceptou a solicitação 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-silveira
fonte
1

Acabei de criar meu próprio "plugin" para resolver isso e funciona muito bem:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

Adicionei compatibilidade móvel e detecção de jsBlocking entre outras coisas ... (como uma sobreposição que é mostrada aos usuários pedindo para desativar o software adBlocking / jsBlocking ); Também fez responsivo amigável.

É de código aberto sob a licença Coffeeware .

Jmlevick
fonte
Aprecie o esforço, mas parece não funcionar com o adblock ... pelo menos ao escrever este comentário.
arunskrish
funciona com o adBlock, um site em que implementei esse plugin é o calyphrox.net, onde qualquer pessoa pode realmente verificar se o plugin funciona.
precisa saber é o seguinte
3
O link está inoperante ... podemos remover isso?
Evan Langlois
2
Por favor, atualize os links, isso está tornando uma resposta ruim.
Yazan Rawashdeh 10/0316
0

Entendo sua tensão e você pode verificar se o elemento foi criado pelo script ou se o elemento está oculto. E se falamos de bloqueio de anúncios, você pode contar apenas com a visibilidade do elemento, não com a presença do elemento.

O elemento criado com script de terceiros nunca estará presente, se o script não estiver acessível no momento (erro de DNS, erro de servidor da Web remoto, pré-carregamento de página da Web offline etc.), e você sempre terá um falso positivo.

Todas as outras respostas com verificações estão corretas, mas lembre-se disso.

Eir Nym
fonte
0

timing's a resposta é boa, mas não funciona mais, por isso atualizei o nome do arquivo js para 'adsense' a partir de 'ads' e ele está funcionando como um encanto!

Aqui está o código, talvez isso ajude alguém:

<html>
      <head>
            <script src="/adsense.js"></script>
      </head>
             <body>
                   <script>
                           if( window.adblockDetecter === undefined ){
                           // Do anithing, adblocker detected!
                           alert('Adblocker Detected!');}
                   </script>
            </body>
</html>

No arquivo Js, coloque apenas esta linha: var adblockDetecter = true;

eclipseR
fonte
0

Agora, há uma maneira melhor de fazer isso usando um script JS simples chamado AdBlock Detector.
Veja como usá-lo:
Adicione isto à sua <head>seção:

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

Agora você pode usar o ab-messageID sempre que desejar exibir uma mensagem para os usuários do AdBlock:

<div id="ab-message" style="display: none">Your message here!</div>

Observe o estilo embutido adicionado para ocultá-lo originalmente (é claro, você também pode fazer isso no seu próprio arquivo CSS).
Observe também que são necessários 500 ms, é porque ele precisa aguardar o adblocker fazer o seu trabalho ou não funcionará.

Uma pequena explicação de como esse script funciona

Primeiro, ele anexa um iframe à fonte de um link gerado aleatoriamente. (É gerado aleatoriamente porque alguns adblocks são inteligentes, em algum momento, eles percebem que um link é falso).
Em seguida, ele executa várias verificações nesse iframe (se ele foi carregado com sucesso ou se seu estilo foi modificado). Se um desses testes for verdadeiro, ele exibirá o ab-messageelemento para bloquear usuários.

Esse script funciona para a maioria (se não todos) dos bloqueadores de anúncios.

EXTRA

Nenhum ponto, na verdade, poderia ter apenas criado uma essência, mas, em vez disso, criei um projeto no Github, mas mesmo assim, confira e dê uma olhada se ajudou.
abDetector: detector simples de JavaScript AdBlock com baunilha.
Aproveitar.

Nick Rameau
fonte
Solução ruim. Um arquivo .js externo é facilmente bloqueado.
Bangkokian
@Bangkokian Basta copiar e referenciá-lo (e sua licença) na sua mensagem mostrando o arquivo javascript ou index.js (ou o que for).
BlueEyesWhiteDragon 18/03/16
11
@BlueEyesWhiteDragon Você está correto. Mas isso não é de todo a resposta original de Troy. Agora, foi 100% editado para mostrar um script embutido. Meu comentário permanece. Sua resposta original foi especificamente para usar um script externo. stackoverflow.com/posts/34738388/revisions
Bangkokian 19/03
@ Bangkokian exatamente, esqueci de mencionar que, graças ao seu comentário, editei minha resposta para seguir as diretrizes do SO e o tornei um script embutido. Obrigado.
Nick Rameau
0

Você pode verificar isso, pode ajudar a detectar o adblocker

É uma implementação de resposta de tempo

Adicione isso antes de qualquer script na tag 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>

Depois, use-o:

if (adblocker) {
    // the add blocker is enabled
}else{
    // ad blocker is not enabled
}
Mustafa Dwekat
fonte
Isso não funciona. Está sempre mostrando que o anúncio está bloqueado.
Himanshu Aggarwal
verifique o valor window.adblockerno console do navegador se ele retornar truee o adblocker estiver ativado. Caso contrário, ele retornará. falseVocê pode verificar a documentação completa detect-adblocker
Mustafa Dwekat