¿Cómo detectar Adblock en mi sitio web?


370

Me gustaría poder detectar si el usuario está usando un software de bloqueo de anuncios cuando visita mi sitio web. Si lo están usando, quiero mostrar un mensaje pidiéndoles que lo apaguen para apoyar el proyecto, como lo hace este sitio web .

Si ingresa a ese sitio y su navegador tiene algún tipo de software adblock habilitado, entonces el sitio en lugar de mostrar los anuncios reales muestra un pequeño banner que le dice a los usuarios que los ingresos publicitarios se utilizan para alojar el proyecto y que deberían considerar desactivar Adblock .

Quiero hacer eso en mi sitio web, estoy usando anuncios de AdSense, ¿cómo puedo hacer eso?


2
posible duplicado del software
416E64726577

55
Para los usuarios que buscan una solución más reciente, sepan que hay una solución conectable completa disponible en github.com/sitexw/BlockAdBlock
yeaske

55
A algunas personas simplemente no les gusta ser analizadas y anunciadas en la web. Algunos sitios que he visitado, que nos dicen que los ingresos respaldan su proyecto, están tan empantanados en anuncios que se vuelve ridículo.
Paul

77
Ahora que los sitios están haciendo esto cada vez más (y abusan de él, y nos mienten acerca de que sus anuncios no son intrusivos y nos obligan a incluir en la lista blanca todo su sitio solo para ingresar ...) - ¿Hay alguna extensión o truco que podamos usar? para evitar que detecten usamos AdBlock +? - No me importa ver algunos anuncios de banner dirigidos aquí o allá, pero hacer clic en jacking y constantes ventanas emergentes de video a pantalla completa no son lo mío.
BrainSlugs83

1
Por favor vea mi solución, es simple y limpio. JS puro, sin solicitudes adicionales, sin bibliotecas externas o complementos o cualquier otra BS.
Cumulo Nimbus

Respuestas:


410

Mi solución no es específica para una determinada red publicitaria y es muy ligera. Lo he estado ejecutando en producción durante algunos años. AdBlock bloquea todas las URL que contienen la palabra "anuncios". Entonces esto es lo que hice:

Agregué un pequeño archivo js a mi raíz web con el nombre ads.js

Esta es la única línea de código en ese archivo

var canRunAds = true;

Luego, en algún lugar de mi 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>

Archivos como ads.js están bloqueados por al menos estos bloqueadores de anuncios en Chrome:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • Fantasma

Actualización el 15/02/2019:

Se agregó Ghostery en la lista anterior porque la extensión ahora también bloquea las solicitudes a ads.js. Muy útil. ¿Significa esto que Ghostery realmente nos está ayudando a los desarrolladores a detectar el bloqueo de anuncios con su extensión?

No funciona con:

Tejón de privacidad


1
¿Puedes dar el enlace completo de js/ads.jspor favor? como estoy en blogger tuve que subir el .jssitio (como: Google Drive) y el enlace en ese caso no contiene ads. Sería realmente útil si proporciona el enlace de su archivo.
Deb

9191
El archivo solo contiene las palabras "var canRunAds = true;" así que solo créalo tú mismo.
calendario

55
Algunos bloqueadores de anuncios parecen no bloquear el archivo ads.js, como para mí, simple adblock for chrome.
Mgamerz el

2
ABP para Chrome está reaccionando bien, por lo que todo funciona correctamente.
Maxime Lafarie

99
También puede intentar ejecutar una solicitud ajax en una URL bloqueada por un bloqueador de anuncios. Si tiene éxito, no hay un bloqueador de anuncios, si falla, hay un bloqueador de anuncios.
SethWhite

138

No es una respuesta directa, pero pondría el mensaje detrás del anuncio que se cargará ... en lugar de tratar de detectarlo, simplemente aparecerá cuando el anuncio no lo haga.


55
Los usuarios aún pueden bloquear estos avisos de anuncios bloqueados usando Adblock: ese es el único defecto que conozco.
Anderson Green

25
Puede ser fácil, pero no es la forma correcta de hacerlo, si su diseño se distorsiona o la publicidad se carga lentamente, el usuario puede ver un error que no se relaciona con él. También tenga en cuenta que Adblock está tomando medidas para bloquear mensajes molestos dirigidos a usuarios de ABP. Si desea pedirle al usuario que desbloquee, hágalo a través de un simple mensaje ocultable que se encuentra fuera del diseño (no elimina otros elementos). Mira duckduckgo.com/?q=foo+bar con adblock habilitado.
Xeevis

1
@Xeevis: ¿qué estoy buscando? - Creo que AdBlock + ya bloquea lo que sea que esté haciendo duckduckgo.
BrainSlugs83

101

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

Con jQuery:

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

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

Por supuesto, necesitaría tener una página de destino para AdblockNotice.html, y la clase .myTestAd debe reflejar sus contenedores de anuncios reales. Pero esto debería funcionar.

EDITAR

Como recomienda TD_Nijboer, una mejor manera es usar el selector :hidden(o :visible, como uso a continuación) para que display: nonetambién esté marcado:

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

Por supuesto, ambos pueden combinarse en un ifbloque si se desea.

Tenga en cuenta que visibility: hiddentampoco será capturado por ninguno (donde permanece el espacio de diseño, pero el anuncio no es visible). Para verificar eso, se puede usar otro filtro:

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

Lo que le dará una serie de elementos publicitarios que son "invisibles" ( 0en teoría, cualquiera puede ser mayor que un problema).


16
Redirigir en este caso es una mala idea. Si su servicio de publicidad deja de funcionar, todos los visitantes podrían ser redirigidos a esa página. También recomendaría usar el evento de carga de la ventana en lugar del documento listo.
Andy E

1
una mejor manera de detectar sería $ ('. myTestAd'). is (": hidden"); como especifica el manual, también detecta si el ancho / alto es 0 y si display = none.
TD_Nijboer

66
Redirecting in this case is a bad idea. If your advertising service goes down, all visitors could be redirected to that page.En efecto. Sin mencionar que simplemente lanzarían un guión simple para derrotar la contramedida. Además, ¿realmente crees que al ser agresivo y enérgico, los usuarios estarán motivados para desactivar sus bloqueadores de anuncios? No, todo lo que lograría sería cabrearlos y agriarlos contra su sitio. La mayoría de los sitios optan por mostrar simplemente un mensaje en lugar de mostrarse hostil.
Synetech

Esto no funciona para mí en Chrome. En el evento DOMReady, el anuncio todavía parece estar visible.
nwellnhof

3
No evite que los usuarios ingresen a su sitio porque tienen anuncios deshabilitados, eso solo aumenta la carrera armamentista. - Si nos pide amablemente que los activemos, podríamos hacerlo; si intenta forzarnos, dejaremos de ir a su sitio o informaremos un error en nuestro bloqueador de anuncios y obtendremos Se arregló para su sitio. - Este es el tipo exacto de comportamiento del que existen los adblockers para proteger a los usuarios.
BrainSlugs83

93

No hay solicitudes adicionales. No hay bibliotecas externas. Simplemente JavaScript simple:

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

  • Crea un elemento con la clase adsbox (como se define como un elemento extraíble en el archivo de definición de AdBlock Plus)
  • Lo agrega al documento y después de un rato lee su desplazamiento.
  • Si AdBlock está instalado, el elemento no tendrá ninguna altura.

El crédito a cargo de Christian Heilmann , creo que es, con mucho, la mejor solución para la detección de AdBlock.


55
Para evitar problemas técnicos, puede agregarlo testAd.style.display = 'absolute'y quitarlo de la pantalla
Gerald

44
buena solución, pero para los que sufren de los 100ms Tiempo Sugiero añadir algo como esto al cuerpo 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>(por supuesto después de probar CSS debe cambiarse a <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 Buen punto. pero AFAIK, absolutees un positionvalor.
Em Seven

puedo agregar, solo conseguí esta solución funcionando cuando la agregué dentro de una window.onloadfunción
Peter Cullen

Tenga en cuenta que esto no funciona para AdBlock para Firefox
Eda190

42

La mayoría de los anuncios se cargan dinámicamente en javascript. Acabo de usar el evento onerror para detectar si el script del anuncio podría cargarse o no. Parece funcionar.

Ejemplo con GoogleAds:

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

Esto también se puede usar en otros elementos para ver si un bloqueador de anuncios está bloqueando el contenido. Este método puede producir falsos positivos si los elementos remotos no existen o no se puede alcanzar.


1
Esta es una de las mejores maneras de comprobar si el anuncio se carga o not..because carga manual de su propio guión basándose en el bloqueador de bloque que se va a fracasar en ocasiones ..
MaZZly

Esta parece ser la mejor solución para scripts cargados dinámicamente.
Carca

No sé si algo ha cambiado desde que esto se escribió, pero no puedo hacer que un error se active con el complemento Chrome de Fair Adblock by STANDS.
Melchester

A partir de marzo de 2018, sigue siendo la mejor solución, simple y definitiva
Daniel Vukasovich

como se dijo anteriormente, no funciona con un bloqueador de anuncios justo, es mejor verificarlooffsetHeight
cieunteung

17

Para detectar si el usuario está bloqueando los anuncios, todo lo que tiene que hacer es encontrar una función en el anuncio javascript e intentar probarlo. No importa qué método estén usando para bloquear el anuncio. Esto es lo que parece para los anuncios de Google Adsense:

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

Este método se describe aquí: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam


8
google_render_ad ahora está indefinido en cualquier momento, typeof (window.google_jobrunner)! = 'objeto' funciona para mí.
Dmitrii Korotovskii

44
Como no es un código que controlas, creo que es una mala idea confiar en esto, ya que un refactor de la biblioteca hará que tu script detecte el bloqueo de anuncios para todos los usuarios.
Patrick Olvida el

1
typeofes una sobrecarga si verifica la propiedad del objeto. Uso sencillo === undefined.
Robo Robok

12

Mi solución más fácil con jquery es:

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

publicidad.js simplemente no contiene nada. Cuando alguien usa adblock, falla y se llama a la función.


10

Sé que ya hay suficientes respuestas, pero dado que esta pregunta aparece en Google buscó "detectar adblock" en el tema, quería proporcionar una idea en caso de que no esté usando AdSense .

Específicamente, con este ejemplo puede detectar si se utiliza la lista de Adblock predeterminada proporcionada por Firefox Adblock. Aprovecha que en esta lista de bloqueo hay un elemento bloqueado con la identificación CSS #bottomAd. Si incluyo dicho elemento en la página y pruebo su altura, sé si el bloqueo de anuncios está activo o no:

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

El resto se realiza a través del sospechoso jQuery habitual:

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

Como se puede ver, estoy usando setTimeoutcon al menos un tiempo de espera de 1 ms. He probado esto en varios navegadores y la mayoría de las veces, comprobando directamente el elemento en readysiempre devuelve 0; sin importar si el bloqueador de anuncios estaba activo o no. Tenía dos ideas sobre esto: o el renderizado aún no se había realizado o Adblock aún no se había implementado. No me molesté en investigar más.


Realmente me gusta esta respuesta porque no implica hacer solicitudes adicionales. ¿Hay inconvenientes para este enfoque en lugar de solicitudes falsas de ads.js?
JeroenVdb

En lugar de probar la longitud y la altura, ¿no puede usar if ($ ("# bottomAd"). Is (': hidden')) ...?
Evan Langlois

@EvanLanglois, sé que preguntaste hace dos años, pero tu pregunta realmente me interesó, así que fui a buscar información al respecto. Aparentemente, la .is(":hidden")verificación depende de si tanto la altura como el ancho son cero. Si solo establece la altura en 0, pero el div aún ocupa un ancho, entonces jQuery no lo considera "oculto". Entonces, si puede decirlo, .is(":hidden")depende en cierta medida de cómo el bloqueador de anuncios decida cambiar el tamaño / ocultar el contenido.
Spencer D

10

Mi consejo es: ¡no lo hagas!

Cualquier escenario en el que trates a las personas como "malhechores" hará que se defiendan.

Aquí está mi propuesta.

Coloque un pequeño mensaje discreto en la parte superior de la página (independientemente de si los anuncios se están bloqueando) con el texto I *totally* respect your right to block adsy un enlace a otra página / ventana emergente titulada Read more ....

En la otra página, deja en claro que entiendes que es su computadora y que son libres de usar el bloqueo de anuncios.

Además, deje en claro de manera no acusatoria que el uso de estos bloqueadores hace que sea más difícil para usted entregar un gran contenido (explicando por qué en detalle) y que, si bien prefiere que el bloqueo de anuncios no ocurra en su sitio, Es totalmente su decisión. Concéntrese en los aspectos positivos de desactivar el bloqueo.

Aquellos que se oponen con vehemencia a los anuncios ignorarán esto, pero de todos modos nunca tuvo la oportunidad de convencerlos. Aquellos que son indiferentes pueden ser influenciados por su atractivo, ya que no están haciendo todo lo de "déjenme seguir o me llevaré mi pelota y me iré a casa" que honestamente debería ser el dominio exclusivo de niños de cinco años.

Recuerde, nadie le apuntó con un arma a la cabeza y lo obligó a poner sus cosas en la red. Trate a sus lectores / usuarios con respeto y probablemente encontrará que un buen número de ellos corresponderá.


1
¿Qué tal "Parece que usas un bloqueador de anuncios. ¡Eso es genial! Nosotros también :) ¡Por favor apoya a X contándoles a tus amigos sobre nosotros!"
ADTC

3
je, intente monetizar algo de esta manera ... los anuncios son una forma de pago regular, por lo que el usuario debe pagar
dev1223

¿Qué pasa con mi diseño se rompe cuando se activa Adblock?
godblessstrawberry

55
Si un sitio web me obliga a desactivar mi bloqueador de anuncios, sigo adelante. Pierden y no me importa. Acabo de sacar una copia en caché de Google.
RayfenWindspear

1
@Tallboy, no hay ética en mi respuesta. Solo existe la realidad de las audiencias a las que intenta dirigirse. Y, aunque sus intenciones pueden ser como se describe, una relectura de la pregunta le mostrará que fue específicamente para pedirle al usuario que permita anuncios, no que limpie el diseño o algo así. Esa fue la pregunta que estaba respondiendo, no otra pregunta prevista media década después :-)
paxdiablo

9

Están utilizando el hecho de que el código de anuncios de Google crea un iframe con la identificación "iframe". Entonces, siempre que no tenga algo en su página con esa ID, esto también funcionaría para usted.

<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

Simplemente agregue un pequeño script en su sitio:

var isAdsDisplayed = true;

Con el nombre adsbygoogle.js

Luego haz lo siguiente:

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

Encontré esta solución aquí


Este es un hombre increíble, muchas gracias 💓
Jodyshop

8

Noté que los comentarios anteriores usan Google Adsense como objeto para probar. Algunas páginas no usan adsense, y usar el bloque adsense como prueba no es realmente una buena idea. Porque el bloqueo de adsense puede dañar tu SEO. Aquí hay un ejemplo de cómo detecto por adblocker la clase simple bloqueada:

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" es una ID que bloquea el bloqueador de anuncios. Entonces, verificando si está visible, puede detectar si el bloqueador de anuncios está activado.


7

AdBlock parece bloquear la carga de archivos JavaScript de AdSense (etc.). Por lo tanto, si está utilizando una versión asíncrona de anuncios de AdSense, puede verificar si adsbygooglees una Array. Esto debe verificarse después de unos segundos ya que el script asincrónico es ... asincrónico. Aquí hay un bosquejo aproximado :

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

Para aclarar, aquí hay un ejemplo de cómo se ve el código de anuncios asíncronos de 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>

Tenga en cuenta que adsbygooglese inicializa como una matriz. La adsbygoogle.jsbiblioteca cambia esta matriz Object {push: ...}cuando se ejecuta. Verificar el tipo de variable después de cierto tiempo puede decirle si se cargó el script.


Esto funcionará la mayor parte del tiempo, pero ¿qué pasa si un usuario tiene una conexión lenta (piense en los dispositivos móviles)?
Luca Steeb

6

Este enfoque que uso en mi sitio, tal vez le sea útil. En mi opinión, es lo más simple. solución más .

AdBlocker bloquea clases específicas y elementos html, al inspeccionar estos selectores de cualquier anuncio bloqueado en la consola del desarrollador (todos están listados) puede ver qué elementos siempre estarán bloqueados.

Por ejemplo, simplemente inspeccione esta página de preguntas en stackoverflow y verá un montón de anuncios bloqueados.

Por ejemplo, cualquier elemento con bottom-adclase se bloquea automáticamente.

  1. Creé un elemento div no vacío con bottom-adclase: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. Después de cargar la página, simplemente verifique si este elemento está oculto. Usé jQuery, pero siéntase libre de usar javascript: $('.bottom-ad').css('display') == "none"o incluso mejor usando$('.bottom-ad').is(':visible')

Si el valor es true, entonces AdBlocker está activo.


6

No necesita una solicitud HTTP adicional, simplemente puede calcular la altura de un anuncio falso.

Por cierto, aquí hay una lista completa que coincide con los elementos que los bloqueadores de anuncios evitan representar.

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

la manera segura es envolver sus anuncios dentro <div>y verificar la 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 con adblock plus y firewall de bluehell.


6

Una forma eficiente de verificar si hay un bloque de anuncios: simplemente verifique si hay un bloque de anuncios habilitado intentando activar la URL de los anuncios de Google. En caso afirmativo, ejecute callback_has_adblock, si no, ejecute callback_no_adblock. Esta solución cuesta una solicitud más pero al 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 solución funciona para todo tipo de anuncios, no solo google adsense.


algunos bloqueadores de anuncios bloquean jQuery, entonces el script no se ejecuta porque "$ no está definido". Mejor use puro js.
nyx

3

A pesar de la antigüedad de esta pregunta, recientemente la encontré muy útil y, por lo tanto, solo puedo suponer que todavía hay otras personas que la están viendo. Después de buscar aquí y en otros lugares, supuse que las tres principales comprobaciones del lado del cliente para detectar indirectamente un bloqueador de anuncios eran para verificar si estaban bloqueadas div / imgbloqueadoiframe s y los recursos bloqueados (archivos JavaScript).

Tal vez sea exagerado o paranoico, pero cubre los sistemas de bloqueo de anuncios que bloquean solo uno o dos de la selección y, por lo tanto, es posible que no se hayan cubierto si solo hubiera realizado una verificación.

En la página que está ejecutando, las comprobaciones agregan: (Estoy 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>

y agregue lo siguiente en cualquier otro lugar de la página:

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

Utilicé un div con un nombre de cebo, así como una imagen alojada externamente con el texto "Anuncio" y en las dimensiones utilizadas por AdSense (¡gracias a placehold.it!).

En advertisement.jsdebe agregar algo al documento que podamos verificar más adelante. Aunque parece que está haciendo lo mismo que antes, en realidad está verificando que el archivo ( advertisement.js) se cargue, no la salida.

$(document).ready(
{

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

});

Y luego el script de detección de bloqueador de anuncios que combina todo

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

});

Cuando el documento está listo , es decir, se carga el marcado, también agregamos el iframe al documento. Luego, cuando se carga la ventana , es decir, el contenido incl. imágenes, etc. está cargado, verificamos:

  • Las dimensiones y la visibilidad de la primera prueba div.
  • Que el contenido de la segunda div prueba es "verificación", ya que habría sido si el advertimsent.jsera no bloqueado.
  • Las dimensiones (y supongo que la visibilidad, ¿como un objeto oculto no tiene altura o ancho?) Del iframe

Y los estilos:

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

div#myTestAd2
{
    display: none;
}

Espero que esto ayude


3

Si usa el nuevo código de AdSense, puede hacer una verificación fácil, sin recurrir a las verificaciones de contenido o CSS.

Coloque sus anuncios normalmente en su marcado:

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

Luego, llama al código de AdSense en la parte inferior de tu página (ten en cuenta que no uses la "async"bandera cuando llames al adsbygoogle.jsscript):

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

Luego agregue este pequeño fragmento de código debajo de eso:

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

AdSense crea siempre / establece el indicador adsbygoogle.loadedde truecuando los anuncios se cargan, puede colocar el cheque en una función setTimeout para retrasar el cheque por unos segundos.


2
Esto, por supuesto, depende de cómo se bloquearon los anuncios. Si su software de bloqueo de anuncios impide que AdSense se cargue por completo, esto funcionará. Pero si su software de bloqueo de anuncios está haciendo algo como establecer la propiedad de visualización CSS en "ninguno" o la altura del div respectivo en 0, entonces esto puede no funcionar.
Bangkokiano

Cierto. No creo que haya una manera fácil de atrapar el 100% de todos los bloqueos de anuncios, pero al menos puedes atrapar algunos de ellos.
Troy Morehouse

3

La mayoría de los bloqueadores de anuncios cancelan la solicitud HTTP ads.jsy realizan 0pxel elemento, pero en algún momento el bloqueador de anuncios eliminó el DOM , y alguna respuesta anterior fallará porque no se verifica la existencia del elemento.

El uso setTimeout()es una buena práctica porque sin él, el script correrá con adblocker.

La secuencia de comandos a continuación verificará si dom existe / eliminado y verificará offsetHeightun elemento si existe.

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

Todas las respuestas anteriores son válidas, sin embargo, la mayoría no funcionará para el bloqueo de anuncios a nivel DNS.

Bloqueadores de anuncios de nivel DNS (como pi-hole ) básicamente devuelven NXDOMAIN (el dominio no existe) para una lista de dominios de bloqueo de anuncios (por ejemplo, telemetry.microsoft.com "no existirá" cuando lo haga).

Hay algunas formas de evitar esto:

Método A : Solicitud de anuncios por dirección IP, no por dominio.

Este método es un poco molesto ya que tendría que hacer un seguimiento de las direcciones IP. Esto será problemático si su código no está bien mantenido o actualizado regularmente.

Método B : Bloquee todas las solicitudes que fallan, incluso si el cliente informa NXDOMAIN.

Esto será muy molesto para los usuarios si se trata de un NXDOMAIN "legítimo".


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>

y en el archivo getbanner.cfm:

adb = false;

Creo que es la forma más fácil de detectar adblock.


otros archivos bloqueados: easylist-downloads.adblockplus.org/easylist.txt es el filtro predeterminado de AdBlock
mikas

adb parece ser truesiempre
Deb

1

Esto es lo que funcionó para mí:

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

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

Solo intenté esto; No funciona. Siempre devuelve verdadero incluso cuando no se instala ningún software de bloqueo de anuncios.
ecnepsnai

Tenga en cuenta que esto solo funcionará en una página en la que esté usando AdSense. De lo contrario, siempre será verdadero porque esa es la respuesta correcta: window.google_jobrunner no se detectará en ninguna y todas las páginas. Solo los que usan Google AdSense. En realidad, puede ver este código funcionando en mi sitio: ruddl.com
jesal

Es interesante que su método utilice el mismo mensaje que el utilizado por HowToGeek . Para el registro, mostrar un cuadro de mensaje no hace más que molestar y agriar a los usuarios contra su sitio; la mayoría de los sitios optan por mostrar un mensaje in-page (HTG intenta hacer ambas cosas, pero solo funciona la molesta ventana emergente).
Synetech

1

Sé que esto ya está respondido, pero miré el sitio de muestra sugerido y veo que lo hacen así:

<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

No hay necesidad de tiempos de espera y detección de DOM. Simplemente intente cargar un script de redes publicitarias populares y vea si el bloqueador de anuncios interceptó la solicitud 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

Acabo de crear mi propio "complemento" para resolver esto y funciona muy bien:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

Agregué compatibilidad móvil y detección de jsBlocking, entre otras cosas ... (como una superposición que se muestra a los usuarios pidiéndoles que deshabiliten el software adBlocking / jsBlocking ); También lo hizo receptivo amigable.

Está abierto bajo la licencia de Coffeeware .


Aprecio el esfuerzo, pero no parece funcionar con adblock ... al menos al momento de escribir este comentario.
Arunskrish

funciona con adBlock, un sitio donde implementé este complemento es calyphrox.net, donde cualquiera puede verificar que el complemento funciona.
Jmlevick

3
Link is Dead ... ¿podemos eliminar esto?
Evan Langlois

2
Actualice los enlaces, es una mala respuesta.
Yazan Rawashdeh

0

Entiendo su tensión y puede verificar si el elemento ha sido creado por script o si el elemento está oculto. Y si hablamos de bloqueo de anuncios, puede contar solo con la visibilidad del elemento, no con la presencia del elemento.

El elemento creado con un script de terceros nunca estará presente, que si el script no es accesible en este momento (error de DNS, error del servidor web remoto, precarga de la página web fuera de línea, etc.), y siempre obtendrá un falso positivo.

Todas las demás respuestas con cheques son correctas, pero tenga esto en cuenta.


0

timing's La respuesta es buena, pero ya no funciona, así que he actualizado el nombre del archivo js a 'adsense' de 'ads' y está funcionando como un encanto.

Aquí está el código, tal vez esto ayude a alguien:

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

En el archivo Js pon solo esta línea: var adblockDetecter = true;


0

Ahora hay una mejor manera de hacerlo usando un script JS simple llamado AdBlock Detector.
Aquí se explica cómo usarlo:
agregue esto a su <head>sección:

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

Ahora puede usar la ab-messageidentificación donde desee mostrar un mensaje a los usuarios de AdBlock:

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

Tenga en cuenta el estilo en línea agregado para ocultarlo originalmente (por supuesto, también puede hacerlo desde su propio archivo CSS).
También tenga en cuenta que tarda 500 ms, eso es porque tiene que esperar a que el bloqueador de anuncios haga lo suyo o no funcionará.

Una pequeña explicación de cómo funciona este script

Primero, agrega un iframe con una fuente de un enlace generado aleatoriamente. (Se genera aleatoriamente porque algunos bloques de anuncios son inteligentes, en algún momento, se dan cuenta de que un enlace es falso).
Luego ejecuta múltiples comprobaciones en ese iframe (si se cargó correctamente o si se modificó su estilo). Si una de estas pruebas es verdadera, muestra el ab-messageelemento para bloquear usuarios.

Este script funciona para la mayoría (si no todos) los bloqueadores de anuncios.

EXTRA

No tiene sentido, realmente, podría haber creado una esencia, pero en su lugar, creé un proyecto de Github, pero aún así, échale un vistazo y ponlo en una estrella si te ayudó.
abDetector: Detector simple de JavaScript AdBlock de vainilla.
Disfrutar.


Mala solución. Un archivo externo .js se bloquea fácilmente.
Bangkokiano

@Bangkokian Simplemente copie y haga referencia (y su licencia) en su mensaje que muestra el archivo javascript o index.js (o lo que sea).
BlueEyesWhiteDragon

1
@BlueEyesWhiteDragon Estás en lo correcto. Pero esa no es en absoluto la respuesta original de Troy. Ahora se ha editado al 100% para mostrar un script en línea. Mi comentario se mantiene. Su respuesta original fue específicamente usar un script externo. stackoverflow.com/posts/34738388/revisions
Bangkokian

@Bangkokian exactamente, olvidé mencionar que gracias a tu comentario edité mi respuesta para seguir las pautas de SO y lo convertí en un script en línea. Gracias.
Nick Rameau

0

Puede verificar esto, podría ayudar a detectar-adblocker

Es una implementación de respuesta de tiempo

Agregue esto antes de cualquier secuencia de comandos en la etiqueta principal:

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

Luego, más tarde, úsalo:

if (adblocker) {
    // the add blocker is enabled
}else{
    // ad blocker is not enabled
}

No funciona Siempre muestra que el anuncio está bloqueado.
Himanshu Aggarwal

verifique el valor window.adblockeren la consola de su navegador si regresa, trueentonces adblocker está habilitado; de lo contrario, regresará false, puede verificar la documentación completa detect-adblocker
Mustafa Dwekat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.