Come rilevare Adblock sul mio sito Web?


370

Vorrei essere in grado di rilevare se l'utente utilizza software di blocco degli annunci quando visita il mio sito Web. Se lo stanno usando, voglio visualizzare un messaggio che chiede loro di disattivarlo per supportare il progetto, come fa questo sito Web .

Se accedi a quel sito e il tuo browser ha una sorta di software di blocco degli annunci abilitato, il sito invece di mostrare gli annunci reali mostra un piccolo banner che dice agli utenti che le entrate pubblicitarie sono utilizzate per ospitare il progetto e che dovrebbero considerare di disattivare Adblock .

Voglio farlo sul mio sito Web, sto usando annunci AdSense su di esso, come posso farlo?



5
Per gli utenti alla ricerca di una soluzione più recente,
tenere

5
Ad alcune persone semplicemente non piace essere analizzati e pubblicizzati sul web. Alcuni siti che ho visitato, dicendoci che le entrate supportano il loro progetto, sono così impantanati nelle pubblicità che diventa ridicolo.
Paul

7
Ora che i siti lo fanno sempre di più (e lo abusano e ci mentono sul fatto che i loro annunci non sono invadenti e ci costringono a inserire nella whitelist l'intero sito solo per entrare ...) - Esistono estensioni o trucchi che possiamo usare per impedire loro di rilevare usiamo AdBlock +? - Non mi dispiace vedere alcuni banner pubblicitari mirati qui o là, ma il jack jack e i pop-up video a schermo intero costanti non fanno per me ragazzi.
BrainSlugs83

1
Si prega di vedere la mia soluzione, è semplice e pulita. JS puro, nessuna richiesta extra, nessuna libreria esterna o plugin o qualsiasi altra BS.
Cumulo Nimbus,

Risposte:


410

La mia soluzione non è specifica per una determinata rete pubblicitaria ed è molto leggera. Lo gestisco in produzione da alcuni anni. AdBlock blocca tutti gli URL contenenti la parola "annunci". Quindi questo è quello che ho fatto:

Ho aggiunto un piccolo file js al mio webroot con il nome ads.js

Questa è l'unica riga di codice in quel file

var canRunAds = true;

Quindi da qualche parte nella mia pagina:

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

I file come ads.js sono bloccati da almeno questi adblocker su Chrome:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • Ghostery

Aggiornamento su 15-02-2019:

Aggiunto Ghostery nell'elenco sopra perché l'estensione ora blocca anche le richieste a ads.js. Molto maneggevole. Questo significa che Ghostery ci sta effettivamente aiutando gli sviluppatori a rilevare il blocco degli annunci con la loro estensione?

Non funziona con:

Tasso di segretezza


1
puoi dare il link completo di per js/ads.jsfavore? dato che sono in blogger ho dovuto caricare .jsda qualche parte (come: Google Drive) e il link in quel caso non contiene ads. Sarebbe davvero utile se dai il link del tuo file.
Deb

91
Il file contiene solo le parole "var canRunAds = true;" quindi crealo tu stesso.
tempistica del

5
Alcuni programmi di blocco degli annunci sembrano non bloccare il file ads.js, come per me un semplice blocco degli annunci per Chrome.
Mgamerz,

2
ABP per Chrome sta reagendo bene, quindi tutto funziona correttamente!
Maxime Lafarie,

9
Puoi anche provare a eseguire una richiesta Ajax su un URL bloccato da un blocco annunci. Se riesce, non c'è nessun blocco degli annunci, se fallisce, c'è un blocco degli annunci.
Seth White

138

Non è una risposta diretta, ma metterei il messaggio dietro l'annuncio per caricarlo ... piuttosto che provare a rilevarlo, verrebbe visualizzato solo quando l'annuncio non lo fa.


5
Gli utenti possono comunque bloccare queste notifiche di annunci bloccati utilizzando Adblock: è l'unico difetto che conosco.
Anderson Green,

25
Può essere facile ma non è il modo corretto di farlo, se il layout viene distorto o l'annuncio viene caricato lentamente, l'utente può intravedere un errore che non si riferisce a lui. Inoltre, tieni presente che Adblock sta adottando misure per bloccare i messaggi invadenti indirizzati agli utenti ABP. Se vuoi chiedere all'utente lo sblocco, fallo attraverso un semplice messaggio nascosto che si trova fuori dal layout (non allontana altri elementi). Guarda duckduckgo.com/?q=foo+bar con blocco degli annunci abilitato.
Xeevis,

1
@Xeevis - cosa sto cercando? - Penso che AdBlock + blocchi già tutto ciò che sta facendo 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();
});

Ovviamente, dovresti avere una landing page per AdblockNotice.html e la classe .myTestAd deve riflettere i tuoi contenitori di annunci reali. Ma questo dovrebbe funzionare.

MODIFICARE

Come TD_Nijboer consiglia, un modo migliore è utilizzare il selettore :hidden(o :visible, come di seguito), in modo che display: nonesia anche verificato:

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

Naturalmente, entrambi questi possono essere combinati in un ifblocco se lo si desidera.

Si noti che visibility: hiddennon verrà catturato neanche da entrambi (dove rimane lo spazio del layout, ma l'annuncio non è visibile). Per verificare ciò, è possibile utilizzare un altro filtro:

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

Il che ti darà una serie di elementi pubblicitari che sono "invisibili" (con qualsiasi essere maggiore di 0essere un problema, in teoria).


16
Il reindirizzamento in questo caso è una cattiva idea. Se il servizio pubblicitario diminuisce, tutti i visitatori potrebbero essere reindirizzati a quella pagina. Consiglierei anche di utilizzare l'evento onload della finestra piuttosto che il documento pronto.
Andy E

1
un modo migliore di rilevare sarebbe $ ('. myTestAd'). is (": hidden"); come specificato nel manuale, rileva anche se la larghezza / altezza è 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.Infatti. Per non parlare del fatto che avrebbero semplicemente messo insieme un semplice copione per sconfiggere la contromisura. Inoltre, credi davvero che, essendo aggressivo e forte, gli utenti saranno motivati ​​a disabilitare i loro ad-blocker? No, tutto ciò che realizzerebbe sarebbe farli incazzare e inasprirli contro il tuo sito. La maggior parte dei siti sceglie di visualizzare semplicemente un messaggio anziché diventare ostile.
Synetech,

Questo non funziona per me in Chrome. Nell'evento DOMReady, l'annuncio sembra essere ancora visibile.
nwellnhof

3
Ti preghiamo di non impedire agli utenti di accedere al tuo sito perché gli annunci sono disattivati, il che aumenta la corsa agli armamenti. - Se ci chiedi gentilmente di attivarli, potremmo semplicemente farlo - se provi a forzarci, smetteremo semplicemente di andare sul tuo sito o segnaleremo un bug sul nostro adblocker e otterremo è stato corretto per il tuo sito. - Questo è il tipo esatto di comportamento che esistono gli adblocker per proteggere gli utenti.
BrainSlugs83

93

Nessuna richiesta extra. Nessuna libreria esterna. JavaScript semplice e chiaro:

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

  • Si crea un elemento con la classe adsbox (come definito come elemento rimovibile nel file di definizione di AdBlock Plus)
  • Lo aggiungi al documento e dopo poco tempo leggi il suo offsetHeight
  • Se è installato AdBlock, l'elemento non avrà alcuna altezza.

Ringraziando il post di Christian Heilmann , penso che sia di gran lunga la migliore soluzione per rilevare AdBlock.


5
Per evitare problemi tecnici puoi aggiungerlo testAd.style.display = 'absolute'e spostarlo dallo schermo
Gerald

4
buona soluzione, ma per coloro che soffrono del ritardo di 100 ms suggerisco di aggiungere qualcosa di simile a 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>(ovviamente dopo il test css dovrebbe essere cambiato in <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 Ottimo punto. ma AFAIK, absoluteè un positionvalore.
Em Seven

posso solo aggiungere, ho fatto funzionare questa soluzione solo quando l'ho aggiunta all'interno di una window.onloadfunzione
Peter Cullen,

Nota che questo non funziona con AdBlock per Firefox
Eda190,

42

La maggior parte degli annunci vengono caricati dinamicamente in JavaScript. Ho appena usato l'evento onerror per rilevare se lo script di annunci può essere caricato o meno. Sembra funzionare.

Esempio con GoogleAds:

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

Questo può essere utilizzato anche su altri elementi per vedere se un blocco pubblicità sta bloccando il contenuto. Questo metodo può produrre falsi positivi se gli elementi remoti non esistono o non possono essere raggiunti.


1
Questo è uno dei modi migliori per verificare se l'annuncio è stato caricato o meno ... perché il caricamento manuale del proprio script si basa sul blocco per bloccare il fallimento a volte ..
MaZZly,

Questa sembra essere la soluzione migliore per gli script caricati dinamicamente.
Carca,

Non so se qualcosa è cambiato da quando è stato scritto, ma non riesco a far funzionare onerror con il plug-in di Chrome Fair Adblock by STANDS.
Melchester,

a partire da marzo 2018, rimane la soluzione migliore, semplice e definita
Daniel Vukasovich,

come detto sopra non funziona con un buon adblocker, è meglio controllareoffsetHeight
cieunteung

17

Per rilevare se l'utente sta bloccando gli annunci, tutto ciò che devi fare è trovare una funzione nel javascript dell'annuncio e provare a provarlo. Non importa quale metodo utilizzino per bloccare l'annuncio. Ecco come appare per gli annunci di Google Adsense:

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

Questo metodo è delineato qui: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam


8
google_render_ad ora non è definito in qualsiasi momento, typeof (window.google_jobrunner)! = 'oggetto' funziona per me.
Dmitrii Korotovskii,

4
Dal momento che non è il codice che controlli, penso che sia una cattiva idea fare affidamento su questo, poiché un refactor della libreria farà sì che il tuo script rilevi il blocco degli annunci per tutti gli utenti.
Patrick dimentica il

1
typeofè un sovraccarico se si controlla la proprietà dell'oggetto. Usa semplice === undefined.
Robo Robok,

12

La mia soluzione più semplice con jquery è:

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

advertisement.js non contiene proprio nulla. Quando qualcuno usa il blocco degli annunci, fallisce e viene chiamata la funzione.


10

So che ci sono già abbastanza risposte, ma dal momento che questa domanda viene posta su Google ha cercato "rileva blocco degli annunci" nell'argomento, volevo fornire alcune informazioni nel caso in cui non stai usando AdSense .

In particolare, con questo esempio è possibile rilevare se viene utilizzato l'elenco predefinito di blocco degli annunci fornito da Firefox Adblock. Sfrutta il fatto che in questa blocklist è presente un elemento bloccato con l'id CSS #bottomAd. Se includo un tale elemento nella pagina e provo la sua altezza, so se il blocco degli annunci è attivo o meno:

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

Il resto viene fatto tramite il solito sospetto di jQuery:

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

Come si può vedere, sto usando setTimeoutalmeno un timeout di 1ms. Ho provato questo su vari browser e la maggior parte del tempo, controllando direttamente l'elemento in readysempre restituito 0; indipendentemente dal fatto che l'adblocker fosse attivo o meno. Avevo due idee a riguardo: o il rendering non era ancora stato fatto o Adblock non aveva ancora preso il via. Non mi sono preoccupato di indagare ulteriormente.


Mi piace davvero molto questa risposta perché non implica fare richieste extra, ci sono svantaggi per questo approccio invece di richieste ads.js false?
JeroenVdb,

Invece di testare lunghezza e altezza, non puoi semplicemente usare if ($ ("# bottomAd"). Is (': hidden')) ...?
Evan Langlois,

@EvanLanglois, so che l'hai fatto due anni fa, ma la tua domanda mi ha interessato davvero, quindi sono andato a cercare informazioni su di esso. Apparentemente, il .is(":hidden")controllo dipende dal fatto che sia l'altezza che la larghezza siano zero. Se hai appena impostato l'altezza su 0, ma il div occupa ancora una larghezza, allora non viene considerato "nascosto" da jQuery. Quindi, se puoi dirlo, .is(":hidden")dipende in qualche modo da come l'adblocker decide di ridimensionare / nascondere il contenuto.
Spencer D

10

Il mio consiglio è: non farlo!

Qualsiasi scenario in cui trattate le persone come "trasgressori" si tradurrà in loro una lotta.

Ecco la mia proposta

Inserisci un piccolo messaggio discreto nella parte superiore della pagina (indipendentemente dal fatto che gli annunci vengano bloccati) con il testo I *totally* respect your right to block adse un link a un'altra pagina / pop-up intitolatoRead more ... .

Nell'altra pagina, chiarisci che capisci che è il loro computer e che sono liberi di usare il blocco degli annunci.

Inoltre, chiarisci in modo non accusatorio che l'uso di questi bloccanti ti rende più difficile fornire grandi contenuti (spiegando in dettaglio perché) e che, mentre preferisci che il blocco degli annunci non si verifichi sul tuo sito, è totalmente una loro decisione. Concentrati sugli aspetti positivi della disattivazione del blocco.

Coloro che si oppongono con veemenza alle pubblicità lo ignoreranno, ma non hai mai avuto la possibilità di convincerli comunque. Coloro che sono indifferenti potrebbero essere influenzati dal tuo appello dal momento che non stai facendo tutta la cosa "lasciami fare a modo mio o prenderò la mia palla e tornerò a casa" che onestamente dovrebbe essere il dominio esclusivo dei bambini di cinque anni.

Ricorda, nessuno ti ha tenuto una pistola in testa e ti ha costretto a mettere le tue cose in rete. Tratta i tuoi lettori / utenti con rispetto e probabilmente scoprirai che un buon numero di loro ricambieranno.


1
Che ne dici di "Sembra che tu usi un blocco degli annunci. È fantastico! Anche noi :) Sostieni X raccontando di noi ai tuoi amici!"
ADTC

3
eh cerca di monetizzare qualcosa in questo modo ... gli annunci sono un metodo di pagamento regolare, quindi l'utente dovrebbe pagare
dev1223

che dire del mio layout è rotto quando il blocco degli annunci è attivato?
godblessstrawberry,

5
Se un sito web mi costringe a disabilitare il mio blocco degli annunci, vado avanti. Perdono e non mi interessa. Ho appena preso una copia cache di Google.
RayfenWindspear,

1
@Tallboy, non ci sono etiche nella mia risposta. C'è solo la realtà del pubblico che stai cercando di indirizzare. E, sebbene le tue intenzioni possano essere come descritte, una rilettura della domanda ti mostrerà che era specificamente per chiedere all'utente di consentire gli annunci, non di ripulire il layout o qualcosa del genere. Questa era la domanda a cui stavo rispondendo, non qualche altra domanda prevista dopo mezzo decennio :-)
paxdiablo

9

Stanno utilizzando il fatto che il codice degli annunci di Google crea un iframe con l'id "iframe". Quindi, fintanto che non hai già qualcosa sulla tua pagina con quell'ID, questo funzionerebbe anche per te.

<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

Aggiungi un piccolo script sul tuo sito:

var isAdsDisplayed = true;

Con il nome adsbygoogle.js

Quindi procedere come segue:

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

Ho trovato questa soluzione qui


Questo è un uomo fantastico, grazie mille 💓
Jodyshop,

8

Ho notato che i commenti precedenti utilizzano google adsense come oggetto da testare. Alcune pagine non utilizzano AdSense e l'utilizzo del blocco AdSense come test non è davvero una buona idea. Perché il blocco adsense può danneggiare il tuo SEO. Ecco un esempio di come rilevo da adblocker la semplice classe bloccata:

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" è un ID che blocca adblocker. Quindi controllandolo se è visibile puoi rilevare se il blocco degli annunci è attivato.


7

AdBlock sembra bloccare il caricamento di file JavaScript AdSense (ecc.). Pertanto, se si utilizza la versione asincrona degli annunci AdSense, è possibile verificare se adsbygoogleè un Array. Questo deve essere verificato dopo pochi secondi poiché lo script asincrono è ... asincrono. Ecco un profilo approssimativo :

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

Per chiarire, ecco un esempio di come appare il codice degli annunci asincroni di 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>

Si noti che adsbygoogleè inizializzato come una matrice. La adsbygoogle.jslibreria cambia questo array in Object {push: ...}quando viene eseguito. Controllare il tipo di variabile dopo un certo tempo può dire se lo script è stato caricato.


Funzionerà la maggior parte del tempo, ma cosa succede se un utente ha una connessione lenta (pensa ai dispositivi mobili)?
Luca Steeb,

6

Questo approccio che uso sul mio sito, forse lo troverai utile. Secondo me, è la soluzione più semplice .

AdBlocker blocca specifiche classi ed elementi html, ispezionando questi selettori di eventuali annunci bloccati nella console degli sviluppatori (sono tutti elencati) puoi vedere quali elementi saranno sempre bloccati.

Ad esempio, basta ispezionare questa pagina di domande su StackOverflow e vedrai un sacco di annunci bloccati.

Ad esempio, qualsiasi elemento con bottom-adclasse viene automaticamente bloccato.

  1. Ho creato un elemento div non vuoto con bottom-adclasse: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. Dopo il caricamento della pagina, controlla se questo elemento è nascosto. Ho usato jQuery, ma sentiti libero di usare javascript: $('.bottom-ad').css('display') == "none"o ancora meglio usando$('.bottom-ad').is(':visible')

Se il valore è true, allora AdBlocker è attivo.


6

Non hai bisogno di una richiesta HTTP aggiuntiva, puoi semplicemente calcolare l'altezza di una falsa aggiunta.

A proposito, ecco un elenco completo corrispondente agli elementi che gli adblocker evitano il rendering.

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

il modo sicuro è avvolgere i tuoi annunci all'interno <div>e controllare l'altezza

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

funziona con adblock plus e il firewall bluehell.


6

Un modo efficace per verificare se è presente un blocco degli annunci: è sufficiente controllare se è stato attivato il blocco degli annunci cercando di attivare l'URL degli annunci Google. In caso affermativo, esegui callback_has_adblock, in caso contrario esegui callback_no_adblock. Questa soluzione costa una richiesta in più ma almeno funziona:

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

Questa soluzione funziona per tutti i tipi di annunci, non solo per Google Adsense.


alcuni adblocker bloccano jQuery, quindi lo script non viene eseguito perché "$ non è definito". Meglio usare pure js.
nyx il

3

Nonostante l'età di questa domanda, recentemente l'ho trovata molto utile e quindi posso solo supporre che ci siano ancora altri che la stanno visualizzando. Dopo aver guardato qui e altrove, ho ipotizzato che i tre principali controlli lato client per il rilevamento indiretto di un blocco pubblicità dovessero verificare il blocco div/ img, bloccatoiframe risorse e bloccate (file javascript).

Forse è esagerato o paranoico, ma copre i sistemi di blocco degli annunci che bloccano solo uno o due fuori dalla selezione e quindi potrebbero non essere stati coperti se avessi fatto solo un controllo.

Nella pagina in cui stai eseguendo i controlli aggiungi: (Sto 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 aggiungi quanto segue altrove nella pagina:

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

Ho usato un div con un nome esca e un'immagine ospitata esternamente con il testo "Advert" e nelle dimensioni utilizzate da AdSense (grazie a placehold.it!).

In advertisement.jste dovresti aggiungere qualcosa al documento che possiamo verificare in seguito. Anche se sembra che tu stia facendo lo stesso di prima, stai effettivamente controllando il file ( advertisement.js) stesso che viene caricato, non l'output.

$(document).ready(
{

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

});

E poi lo script di rilevamento del blocco degli annunci che combina tutto

$(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 il documento è pronto , ovvero viene caricato il markup, aggiungiamo anche l'iframe al documento. Quindi, quando viene caricata la finestra , ovvero il contenuto incl. immagini ecc. vengono caricate, controlliamo:

  • Le dimensioni e la visibilità del primo div di prova.
  • Che il contenuto del secondo div test sia "check", come sarebbe stato se nonadvertimsent.js fosse stato bloccato.
  • Le dimensioni (e immagino che la visibilità, in quanto un oggetto nascosto non abbia altezza o larghezza?) Dell'iframe

E gli stili:

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

div#myTestAd2
{
    display: none;
}

Spero che sia di aiuto


3

Se si utilizza il nuovo codice AdSense, è possibile effettuare un controllo semplice, senza ricorrere a controlli contenuti o css.

Inserisci i tuoi annunci normalmente nel markup:

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

Quindi chiami il codice adsense nella parte inferiore della tua pagina (nota che non usare il "async"flag quando chiami lo adsbygoogle.jsscript):

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

Quindi aggiungi questo piccolo frammento di codice qui sotto:

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

AdSense crea sempre / imposta il flag adsbygoogle.loadedsu truequando vengono caricati gli annunci, è possibile inserire il controllo in una funzione setTimeout per ritardare il controllo di alcuni secondi.


2
Questo ovviamente dipende da come gli annunci sono stati bloccati. Se il tuo software di blocco degli annunci impedisce il caricamento completo di AdSense, funzionerà. Ma se il tuo software di blocco degli annunci sta facendo qualcosa come impostare la proprietà di visualizzazione CSS su "none" o l'altezza del rispettivo div su 0, questo potrebbe non funzionare.
Bangkok,

Vero. Non penso che ci sia un modo semplice per catturare il 100% di tutti i blocchi pubblicitari, ma almeno puoi prenderne alcuni.
Troy Morehouse,

3

La maggior parte degli adblocker annulla la richiesta HTTP ads.jse crea 0pxl'elemento, ma a volte l'adblocker ha rimosso il DOM e alcune risposte precedenti falliranno perché non controllano l'esistenza dell'elemento.

utilizzando setTimeout() è una buona pratica perché senza di essa, renderà la corsa allo script con adblocker.

Lo script seguente verificherà se dom esiste / rimosso e verificherà offsetHeightse esiste un elemento.

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

Tutte le risposte sopra sono valide, tuttavia la maggior parte non funzionerà per il blocco degli annunci a livello DNS.

Blocco pubblicità a livello DNS (come pi-hole ) sostanzialmente restituiscono NXDOMAIN (il dominio non esiste) per un elenco di domini di blocco degli annunci (ad esempio telemetry.microsoft.com "non esisterà" quando lo fa).

Ci sono alcuni modi per aggirare questo:

Metodo A : richiesta di annunci per indirizzo IP, non dominio.

Questo metodo è un po 'fastidioso in quanto dovresti tenere traccia degli indirizzi IP. Questo sarà problematico se il tuo codice non è ben mantenuto o aggiornato regolarmente.

Metodo B : blocca tutte le richieste non riuscite, anche se il client segnala NXDOMAIN.

Questo sarà molto fastidioso per gli utenti se si tratta di un NXDOMAIN "legittimo".


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 nel file getbanner.cfm:

adb = false;

Penso che sia il modo più semplice per rilevare il blocco degli annunci.


altri file bloccati: easylist-downloads.adblockplus.org/easylist.txt è il filtro AdBlock predefinito
mikas

adb sembra essere truesempre
Deb

1

Questo è ciò che ha funzionato per me:

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

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

Ho appena provato questo; non funziona. Restituisce sempre vero anche quando non è installato alcun software di blocco degli annunci.
ecnepsnai,

Tieni presente che funzionerà solo su una pagina in cui stai utilizzando AdSense. Altrimenti restituirà sempre true perché è la risposta corretta: window.google_jobrunner non verrà rilevato in nessuna e tutte le pagine. Solo quelli che utilizzano Google AdSense. Puoi effettivamente vedere questo codice funzionare sul mio sito: ruddl.com
jesal

È interessante notare che il tuo metodo utilizza lo stesso messaggio utilizzato da HowToGeek . Per la cronaca, la visualizzazione di una finestra di messaggio non fa altro che infastidire gli utenti dal tuo sito; la maggior parte dei siti sceglie di visualizzare un messaggio in-page (HTG prova a fare entrambe le cose, ma solo i fastidiosi pop-up funzionano).
Synetech,

1

So che questa è già una risposta, ma ho guardato il sito di esempio suggerito e vedo che lo fanno in questo modo:

<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

Non sono necessari timeout e sniffing DOM. Basta provare a caricare uno script dalle reti pubblicitarie più diffuse e vedere se il blocco annunci ha intercettato la richiesta 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

Ho appena creato il mio "plug-in" per risolvere questo problema e funziona davvero bene:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

Ho aggiunto la compatibilità mobile e il rilevamento jsBlocking tra le altre cose ... (Come un overlay che viene mostrato agli utenti che chiedono loro di disabilitare il blocco degli annunci / jsBlocking software ); Anche reso amichevole reattivo.

È aperto con licenza Coffeeware .


Apprezzo lo sforzo, ma non sembra funzionare con il blocco degli annunci ... almeno dalla stesura di questo commento.
arunskrish,

funziona con adBlock, un sito in cui ho implementato questo plugin è calyphrox.net, dove chiunque può effettivamente verificare che il plugin funzioni.
Jmlevick,

3
Link is Dead ... possiamo rimuoverlo?
Evan Langlois,

2
Si prega di aggiornare i collegamenti, sta rendendo questa una cattiva risposta.
Yazan Rawashdeh,

0

Capisco la tua tensione e puoi verificare se l'elemento è stato creato dallo script o l'elemento è nascosto. E se parliamo del blocco degli annunci puoi contare solo sulla visibilità dell'elemento, non sulla presenza dell'elemento.

L'elemento creato con script di terze parti non sarà mai presente, se al momento lo script non è raggiungibile (errore DNS, errore del server Web remoto, precarico della pagina Web offline, ecc.) E otterrai sempre falsi positivi.

Tutte le altre risposte con i controlli sono corrette, ma tienilo a mente.


0

timing's la risposta è buona ma non funziona più, quindi ho aggiornato il nome del file js in "adsense" da "ads" e funziona come un incantesimo!

Ecco il codice, forse questo aiuterà qualcuno:

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

Nel file Js inserisci solo questa riga: var adblockDetecter = true;


0

Ora c'è un modo migliore per farlo usando un semplice script JS chiamato AdBlock Detector
Ecco come usarlo:
aggiungi questo alla tua <head>sezione:

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

Ora puoi utilizzare l' ab-messageid ovunque desideri visualizzare un messaggio per gli utenti di AdBlock:

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

Nota lo stile in linea aggiunto per nasconderlo in origine (Naturalmente, puoi anche farlo dal tuo file CSS).
Nota anche che ci vogliono 500 ms, questo perché deve aspettare che l'adblocker faccia la sua cosa o non funzioni.

Una piccola spiegazione di come funziona questo script

Innanzitutto, aggiunge un iframe con una fonte di un collegamento generato casualmente. (Viene generato casualmente perché alcuni blocchi di annunci sono intelligenti, a un certo punto si rendono conto che un collegamento è falso).
Quindi esegue più controlli su quell'iframe (se è stato caricato correttamente o se il suo stile è stato modificato). Se uno di questi test è vero, viene visualizzato ilab-message elemento per bloccare gli utenti.

Questo script funziona per la maggior parte (se non per tutti) i blocchi pubblicitari.

EXTRA

Inutile dire che in realtà non avrei potuto creare una sintesi, ma invece ho creato un progetto Github, ma comunque, guardalo e inizializzalo se ti ha aiutato.
abDetector: Rivelatore AdBlock JavaScript vaniglia semplice.
Godere.


Scarsa soluzione. Un file .js esterno è facilmente bloccato.
Bangkok,

@Bangkokian Basta copiare e fare riferimento a esso (e alla sua licenza) nel tuo messaggio che mostra il file javascript o index.js (o qualsiasi altra cosa).
BlueEyesWhiteDragon

1
@BlueEyesWhiteDragon Hai ragione. Ma questa non è affatto la risposta originale di Troy. Ora è stato modificato al 100% per mostrare uno script in linea. Il mio commento è valido. La sua risposta originale era specificamente quella di utilizzare uno script esterno. stackoverflow.com/posts/34738388/revisions
Bangkokian

@Bangkokian esattamente, ho dimenticato di dire che grazie al tuo commento ho modificato la mia risposta per seguire le linee guida SO e renderlo uno script in linea. Grazie.
Nick Rameau,

0

Puoi verificarlo che potrebbe aiutare a rilevare-adblocker

È un'implementazione della risposta temporale

Aggiungi questo prima di qualsiasi script nel 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>

Quindi in seguito usalo:

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

Non funziona Mostra sempre che l'annuncio è bloccato.
Himanshu Aggarwal

controlla il valore window.adblockernella tua console del browser se ritorna truequindi adblocker è abilitato altrimenti tornerà falsepuoi controllare la documentazione completa detect-adblocker
Mustafa Dwekat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.