Wie erkenne ich Adblock auf meiner Website?

370

Ich möchte in der Lage sein zu erkennen, ob der Benutzer beim Besuch meiner Website Adblocking-Software verwendet. Wenn sie es verwenden, möchte ich eine Meldung anzeigen, in der sie aufgefordert werden, es zu deaktivieren, um das Projekt zu unterstützen, wie dies auf dieser Website der Fall ist.

Wenn Sie diese Website aufrufen und in Ihrem Browser eine Art Adblock-Software aktiviert ist, wird auf der Website anstelle der tatsächlichen Anzeigen ein kleines Banner angezeigt, das den Nutzern mitteilt, dass die Werbeeinnahmen für das Hosting des Projekts verwendet werden, und sie sollten in Betracht ziehen, Adblock zu deaktivieren .

Ich möchte das auf meiner Website tun. Ich verwende Adsense-Anzeigen. Wie kann ich das tun?

Jmlevick
quelle
2
Mögliches Duplikat der AdBlocking-Software erkennen?
416E64726577
5
Für Benutzer, die nach einer neuesten Lösung suchen, wissen Sie bitte, dass eine umfassende steckbare Lösung unter github.com/sitexw/BlockAdBlock
yeaske
5
Manche Leute mögen es einfach nicht, im Web analysiert und beworben zu werden. Einige Websites, die ich besucht habe und die uns mitteilen, dass die Einnahmen ihr Projekt unterstützen, sind in Anzeigen so festgefahren, dass es lächerlich wird.
Paul
7
Jetzt, wo Websites dies immer mehr tun (und es missbrauchen und uns anlügen, dass ihre Anzeigen nicht aufdringlich sind, und uns zwingen, ihre gesamte Website auf die Whitelist zu setzen, nur um einzutreten ...) - Gibt es Erweiterungen oder Tricks, die wir verwenden können? Um zu verhindern, dass sie erkannt werden, verwenden wir AdBlock +? - Es macht mir nichts aus, hier oder da ein paar gezielte Bannerwerbung zu sehen, aber Click Jacking und ständige Vollbild-Video-Popups sind nicht mein Ding.
BrainSlugs83
1
Bitte sehen Sie meine Lösung, es ist einfach und sauber. Pure JS, keine zusätzlichen Anfragen, keine externen Bibliotheken oder Plugins oder andere BS.
Cumulo Nimbus

Antworten:

410

Meine Lösung ist nicht spezifisch für ein bestimmtes Werbenetzwerk und sehr leicht. Ich habe es für ein paar Jahre in der Produktion betrieben. AdBlock blockiert alle URLs, die das Wort "Anzeigen" enthalten. Das habe ich also getan:

Ich habe meiner Webroot eine kleine JS-Datei mit dem Namen hinzugefügt ads.js

Dies ist die einzige Codezeile in dieser Datei

var canRunAds = true;

Dann irgendwo auf meiner Seite:

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

Dateien wie ads.js werden von mindestens diesen Adblockern in Chrome blockiert:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • Ghostery

Update am 15.02.2019:

Ghostery wurde in der obigen Liste hinzugefügt, da die Erweiterung jetzt auch Anforderungen an ads.js blockiert. Sehr praktisch. Bedeutet dies, dass Ghostery uns Entwicklern tatsächlich hilft, die Blockierung von Anzeigen mit ihrer Erweiterung zu erkennen?

Funktioniert nicht mit:

Datenschutz Dachs

zeitliche Koordinierung
quelle
1
Kannst du js/ads.jsbitte den vollständigen Link von geben ? Da ich in Blogger bin, musste ich das .jsirgendwo hochladen (wie: Google Drive) und der Link enthält in diesem Fall nicht ads. Es wäre sehr hilfreich, wenn Sie den Link Ihrer Datei angeben.
Deb
91
Die Datei enthält nur die Wörter "var canRunAds = true;" Also erstelle es selbst.
Timing
5
Einige Werbeblocker scheinen die Datei ads.js nicht zu blockieren, wie für mich der einfache Werbeblock für Chrome.
Mgamerz
2
ABP für Chrom reagiert gut, also funktioniert alles richtig!
Maxime Lafarie
9
Sie können auch versuchen, eine Ajax-Anforderung für eine von einem Adblocker blockierte URL auszuführen. Wenn es erfolgreich ist, gibt es keinen Adblocker. Wenn es fehlschlägt, gibt es einen Adblocker.
SethWhite
138

Keine direkte Antwort, aber ich würde die Nachricht hinter die zu ladende Anzeige stellen ... anstatt zu versuchen, sie zu erkennen, wird sie nur angezeigt, wenn die Anzeige dies nicht tut.

mavrck
quelle
5
Benutzer können diese blockierten Anzeigenbenachrichtigungen weiterhin mit Adblock blockieren. Dies ist der einzige mir bekannte Fehler.
Anderson Green
25
Es mag einfach sein, aber es ist nicht die richtige Methode. Wenn Ihr Layout verzerrt wird oder die Anzeige langsam geladen wird, kann der Benutzer einen Fehler erkennen, der sich nicht auf ihn bezieht. Beachten Sie auch, dass Adblock Maßnahmen ergreift, um aufdringliche Nachrichten an ABP-Benutzer zu blockieren. Wenn Sie den Benutzer zum Entsperren auffordern möchten, tun Sie dies durch eine einfache versteckte Nachricht, die sich außerhalb des Layouts befindet (ohne andere Elemente wegzuschieben). Schauen Sie sich duckduckgo.com/?q=foo+bar mit aktiviertem Adblock an.
Xeevis
1
@Xeevis - wonach suche ich? - Ich denke, AdBlock + blockiert bereits alles, was duckduckgo tut.
BrainSlugs83
101

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

Mit jQuery:

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

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

Natürlich benötigen Sie eine Zielseite für AdblockNotice.html, und die .myTestAd-Klasse muss Ihre tatsächlichen Anzeigencontainer widerspiegeln. Das sollte aber funktionieren.

BEARBEITEN

Wie von TD_Nijboer empfohlen, ist es besser, den Selektor :hidden(oder :visible, wie ich unten verwende) zu verwenden, damit auch Folgendes display: noneüberprüft wird:

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

Natürlich können beide auf Wunsch zu einem ifBlock kombiniert werden.

Beachten Sie, dass dies visibility: hiddenauch nicht von beiden erfasst wird (wo der Layoutbereich verbleibt, die Anzeige jedoch nicht sichtbar ist). Um dies zu überprüfen, kann ein anderer Filter verwendet werden:

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

Dadurch erhalten Sie eine Reihe von Anzeigenelementen, die "unsichtbar" sind (wobei jedes Element 0theoretisch größer als ein Problem ist).

Jared Farrish
quelle
16
Eine Umleitung ist in diesem Fall eine schlechte Idee. Wenn Ihr Werbedienst ausfällt, können alle Besucher auf diese Seite weitergeleitet werden. Ich würde auch empfehlen, das Fenster-Onload-Ereignis zu verwenden, anstatt das Dokument fertig zu stellen.
Andy E
1
eine bessere Methode zum Erkennen wäre $ ('. myTestAd'). is (": hidden"); Wie im Handbuch angegeben, wird auch erkannt, ob die Breite / Höhe 0 ist und ob 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.Tatsächlich. Ganz zu schweigen davon, dass sie einfach ein einfaches Skript zusammenstellen würden, um die Gegenmaßnahme zu besiegen. Denken Sie außerdem wirklich, dass Nutzer durch ihre aggressive und energische Haltung motiviert werden, ihre Werbeblocker zu deaktivieren? Nein, alles, was es erreichen würde, wäre, sie wütend zu machen und sie gegen Ihre Website zu säuern. Die meisten Websites entscheiden sich dafür, einfach eine Nachricht anzuzeigen, anstatt feindlich zu werden.
Synetech
Dies funktioniert bei mir in Chrome nicht. Im DOMReady-Ereignis scheint die Anzeige weiterhin sichtbar zu sein.
Nwellnhof
3
Bitte verhindern Sie nicht, dass Nutzer Ihre Website betreten, da sie Anzeigen deaktiviert haben - dies eskaliert nur das Wettrüsten. - Wenn Sie uns freundlich bitten, sie einzuschalten, können wir es einfach tun. Wenn Sie versuchen, uns zu zwingen, werden wir entweder einfach aufhören, auf Ihre Website zu gehen, oder wir werden einen Fehler in unserem Adblocker melden und erhalten es wurde für Ihre Site behoben. - Dies ist genau die Art von Verhalten, vor der Adblocker existieren, um Benutzer zu schützen.
BrainSlugs83
93

Keine zusätzlichen Anfragen. Keine externen Bibliotheken. Einfach, einfaches JavaScript:

var adBlockEnabled = false;
var testAd = document.createElement('div');
testAd.innerHTML = '&nbsp;';
testAd.className = 'adsbox';
document.body.appendChild(testAd);
window.setTimeout(function() {
  if (testAd.offsetHeight === 0) {
    adBlockEnabled = true;
  }
  testAd.remove();
  console.log('AdBlock Enabled? ', adBlockEnabled)
}, 100);

  • Sie erstellen ein Element mit der Klasse adsbox (wie in der Definitionsdatei von AdBlock Plus als entfernbares Element definiert).
  • Sie fügen es dem Dokument hinzu und lesen nach kurzer Zeit dessen offsetHeight
  • Wenn AdBlock installiert ist, hat das Element keine Höhe.

Dank Christian Heilmanns Beitrag denke ich, dass dies bei weitem die beste Lösung ist, um AdBlock zu erkennen.

Cumulo Nimbus
quelle
5
Um Störungen zu vermeiden, können Sie es hinzufügen testAd.style.display = 'absolute'und vom Bildschirm entfernen
Gerald
4
Gute Lösung, aber für diejenigen, die unter der Verzögerung von 100 ms leiden, schlage ich vor, so etwas wie Doc Body hinzuzufügen: <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>(Natürlich sollte <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>
CSS
2
@ Gerald Guter Punkt. aber AFAIK absoluteist ein positionWert.
Em Seven
Kann ich nur hinzufügen, ich habe diese Lösung nur zum Laufen gebracht, als ich sie innerhalb einer window.onloadFunktion hinzugefügt habe
Peter Cullen
Beachten Sie, dass dies nicht für AdBlock für Firefox
Eda190
42

Die meisten Anzeigen werden dynamisch in Javascript geladen. Ich habe nur das Ereignis onerror verwendet, um festzustellen, ob das Anzeigenskript geladen werden konnte oder nicht. Scheint zu funktionieren.

Beispiel mit GoogleAds:

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

Dies kann auch für andere Elemente verwendet werden, um festzustellen, ob ein Werbeblocker den Inhalt blockiert. Diese Methode kann zu Fehlalarmen führen, wenn die Remote-Elemente nicht vorhanden oder nicht erreichbar sind.

JonMayer
quelle
1
Dies ist eine der besten Möglichkeiten , um zu überprüfen , ob die Anzeige geladen wird oder not..because manuell ein eigenes Skript auf dem Blocker Block verläßt Laden , dass man manchmal scheitern wird ..
MaZZly
Dies scheint die beste Lösung für dynamisch geladene Skripte zu sein.
Carca
Ich weiß nicht, ob sich etwas geändert hat, seit dies geschrieben wurde, aber ich kann mit Fair Adblock by STANDS Chrome Plug-In keinen Fehler machen.
Melchester
Stand März 2018 immer noch die beste, einfachste und definitivste Lösung
Daniel Vukasovich
Wie oben gesagt, es funktioniert nicht mit fairen Adblockern, es ist besser zu überprüfenoffsetHeight
cieunteung
17

Um festzustellen, ob der Nutzer Anzeigen blockiert, müssen Sie lediglich eine Funktion im Anzeigen-Javascript suchen und versuchen, sie zu testen. Es spielt keine Rolle, mit welcher Methode sie die Anzeige blockieren. So sieht es für Google Adsense-Anzeigen aus:

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

Diese Methode wird hier beschrieben: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam

Beau
quelle
8
google_render_ad ist jetzt jederzeit undefiniert, typeof (window.google_jobrunner)! = 'object' funktioniert für mich.
Dmitrii Korotovskii
4
Da es sich nicht um Code handelt, den Sie steuern, halte ich es für eine schlechte Idee, sich darauf zu verlassen, da ein Refactor der Bibliothek dazu führt, dass Ihr Skript Anzeigenblöcke für alle Benutzer erkennt.
Patrick Forget
1
typeofist ein Overhead, wenn Sie die Eigenschaft des Objekts überprüfen. Verwenden Sie einfach === undefined.
Robo Robok
12

Meine einfachste Lösung mit jquery ist:

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

adsement.js enthält nur nichts. Wenn jemand Adblock verwendet, schlägt dies fehl und die Funktion wird aufgerufen.

Luca Steeb
quelle
10

Ich weiß, dass es bereits genügend Antworten gibt, aber da diese Frage bei Google nach "Adblock Adblock" im Thema gesucht wird, wollte ich einen Einblick geben, falls Sie Adsense nicht verwenden .

In diesem Beispiel können Sie insbesondere feststellen, ob die von Firefox Adblock bereitgestellte Standard-Adblock-Liste verwendet wird. Es ist vorteilhaft, dass in dieser Sperrliste ein Element mit der CSS-ID blockiert ist #bottomAd. Wenn ich ein solches Element in die Seite einbinde und auf seine Höhe teste, weiß ich, ob Adblocking aktiv ist oder nicht:

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

Der Rest wird über den üblichen jQuery-Verdächtigen erledigt:

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

Wie zu sehen ist, verwende ich setTimeoutmit einer Zeitüberschreitung von mindestens 1 ms. Ich habe dies in verschiedenen Browsern getestet und die meiste Zeit direkt nach dem Element gesucht, das readyimmer 0 zurückgegeben hat. egal ob der Adblocker aktiv war oder nicht. Ich hatte zwei Ideen dazu: Entweder war das Rendern noch nicht fertig oder Adblock hat noch nicht angefangen. Ich habe mich nicht weiter darum gekümmert.

Kennzeichen
quelle
Diese Antwort gefällt mir sehr gut, da keine zusätzlichen Anfragen gestellt werden. Gibt es Nachteile für diesen Ansatz anstelle von gefälschten ads.js-Anfragen?
JeroenVdb
Können Sie nicht einfach if ($ ("# bottomAd"). Is (': hidden')) ... verwenden, anstatt Länge und Höhe zu testen?
Evan Langlois
@EvanLanglois, ich weiß, dass du vor zwei Jahren gefragt hast, aber deine Frage hat mich wirklich interessiert, also bin ich getaucht, um Informationen darüber zu erhalten. Anscheinend .is(":hidden")hängt die Prüfung davon ab, ob sowohl Höhe als auch Breite Null sind. Wenn Sie nur die Höhe auf 0 setzen, das div aber immer noch eine Breite einnimmt, wird es von jQuery nicht als "versteckt" betrachtet. Ob Sie das sagen können, .is(":hidden")hängt also davon ab, wie der Adblocker die Größe von Inhalten ändert / ausblendet.
Spencer D
10

Mein Rat ist: Tu es nicht!

Jedes Szenario, in dem Sie Menschen als "Übeltäter" behandeln, führt dazu, dass sie sich wehren.

Hier ist mein Vorschlag.

Fügen Sie oben auf der Seite eine kleine unauffällige Nachricht (unabhängig davon, ob Anzeigen blockiert werden) mit dem Text I *totally* respect your right to block adsund einem Link zu einer anderen Seite / einem anderen Popup mit dem Titel ein Read more ....

Stellen Sie auf der anderen Seite klar, dass Sie verstehen, dass es sich um ihren Computer handelt und dass sie die Werbeblockierung verwenden können.

Machen Sie auch auf nicht anklagende Weise klar , dass die Verwendung dieser Blocker es für Sie schwieriger macht, großartige Inhalte zu liefern (und erklären Sie im Detail, warum dies so ist). Es ist total ihre Entscheidung. Konzentrieren Sie sich auf die positiven Aspekte des Ausschaltens der Blockierung.

Diejenigen, die vehement gegen Anzeigen sind, werden dies ignorieren, aber Sie hatten sowieso nie die Chance, sie zu überzeugen. Diejenigen, die gleichgültig sind, werden möglicherweise von Ihrer Berufung beeinflusst, da Sie nicht die ganze Sache "Lass mich meinen Weg gehen oder ich nehme meinen Ball und gehe nach Hause" tun, die ehrlich gesagt die ausschließliche Domäne von fünfjährigen Kindern sein sollte.

Denken Sie daran, niemand hielt eine Waffe an Ihren Kopf und zwang Sie, Ihre Sachen ins Netz zu stellen. Behandeln Sie Ihre Leserschaft / Benutzer mit Respekt und Sie werden wahrscheinlich feststellen, dass sich eine gute Anzahl von ihnen revanchiert.

paxdiablo
quelle
1
Wie wäre es mit "Es sieht so aus, als ob Sie einen Werbeblocker verwenden. Das ist cool! Wir auch :) Bitte unterstützen Sie X, indem Sie Ihren Freunden von uns erzählen!"
ADTC
3
heh versuchen, etwas auf diese Weise zu monetarisieren ... Anzeigen sind reguläre Zahlungsmethoden, daher sollte der Benutzer zahlen
dev1223
Was ist mit meinem Layout, wenn der Adblock aktiviert ist?
Godblessstrawberry
5
Wenn eine Website mich zwingt, meinen Werbeblocker zu deaktivieren, gehe ich weiter. Sie verlieren und es ist mir egal. Ich rufe gerade eine zwischengespeicherte Kopie von Google auf.
RayfenWindspear
1
@Tallboy, meine Antwort enthält keine Ethik. Es gibt nur die Realität der Zielgruppen, die Sie ansprechen möchten. Und obwohl Ihre Absichten wie beschrieben sein mögen, zeigt Ihnen ein erneutes Lesen der Frage, dass sie speziell dazu diente, den Nutzer zu bitten, Anzeigen zuzulassen, nicht das Layout oder ähnliches zu bereinigen. Das war die Frage, die ich beantwortete, keine andere Frage, die ein halbes Jahrzehnt später vorgesehen war :-)
paxdiablo
9

Sie nutzen die Tatsache, dass der Anzeigencode von Google einen Iframe mit der ID "Iframe" erstellt. Solange Sie noch nichts mit dieser ID auf Ihrer Seite haben, funktioniert dies auch für Sie.

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

Fügen Sie einfach ein kleines Skript auf Ihrer Website hinzu:

var isAdsDisplayed = true;

Mit dem Namen adsbygoogle.js

Dann gehen Sie wie folgt vor:

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

Diese Lösung haben Sie hier gefunden

druss
quelle
Das ist ein großartiger Mann, vielen Dank 💓
Jodyshop
8

Ich habe festgestellt, dass in früheren Kommentaren Google Adsense als Testobjekt verwendet wurde. Einige Seiten verwenden kein Adsense, und die Verwendung des Adsense-Blocks als Test ist keine gute Idee. Weil Adsense Block Ihre SEO schädigen kann. Hier ist ein Beispiel, wie ich durch Adblocker eine einfache blockierte Klasse erkenne:

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" ist eine ID, die der Adblocker blockiert. Wenn Sie also überprüfen, ob es sichtbar ist, können Sie feststellen, ob der Adblocker aktiviert ist.

Roman Losev
quelle
7

AdBlock scheint das Laden von AdSense (usw.) JavaScript-Dateien zu blockieren. Wenn Sie also eine asynchrone Version von AdSense-Anzeigen verwenden, können Sie überprüfen, ob dies adsbygoogleeine ist Array. Dies muss nach einigen Sekunden überprüft werden, da das asynchrone Skript ... asynchron ist. Hier ist eine grobe Übersicht :

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

Im Folgenden finden Sie ein Beispiel dafür, wie der asynchrone Anzeigencode von AdSense aussieht:

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

Beachten Sie, dass dies adsbygoogleals Array initialisiert wird. Die adsbygoogle.jsBibliothek ändert dieses Array Object {push: ...}bei der Ausführung in. Wenn Sie den Variablentyp nach einer bestimmten Zeit überprüfen, können Sie feststellen, ob das Skript geladen wurde.

Salman A.
quelle
Dies funktioniert meistens, aber was ist, wenn ein Benutzer eine langsame Verbindung hat (denken Sie an mobile Geräte)?
Luca Steeb
6

Diesen Ansatz verwende ich auf meiner Website. Vielleicht finden Sie ihn hilfreich. Meiner Meinung nach ist es die einfachste Lösung.

AdBlocker blockiert bestimmte Klassen und HTML-Elemente. Wenn Sie diese Selektoren auf blockierte Anzeigen in der Entwicklerkonsole überprüfen (alle sind aufgelistet), können Sie feststellen, welche Elemente immer blockiert werden.

Überprüfen Sie beispielsweise einfach diese Fragenseite auf stackoverflow und Sie werden eine Reihe blockierter Anzeigen sehen.

Beispielsweise wird jedes Element mit bottom-adKlasse automatisch blockiert.

  1. Ich habe ein nicht leeres div-Element mit der bottom-adKlasse erstellt: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. Überprüfen Sie nach dem Laden der Seite, ob dieses Element ausgeblendet ist. Ich habe jQuery verwendet, kann aber auch Javascript verwenden: $('.bottom-ad').css('display') == "none"oder noch besser mit$('.bottom-ad').is(':visible')

Wenn der Wert "ist" true, ist AdBlocker aktiv.

NGix
quelle
6

Sie benötigen keine zusätzliche HTTP-Anforderung. Sie können einfach die Höhe eines gefälschten Adds berechnen.

Übrigens finden Sie hier eine vollständige Liste mit den Elementen, die Adblocker nicht rendern.

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

Der sichere Weg ist, Ihre Anzeigen darin zu verpacken <div>und die Höhe zu überprüfen

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

Es funktioniert mit Adblock Plus und Bluehell Firewall.

uingtea
quelle
6

Eine effiziente Methode, um zu überprüfen, ob ein Adblock vorhanden ist: Überprüfen Sie einfach, ob ein Adblock aktiviert ist, indem Sie versuchen, die URL von Google-Anzeigen auszulösen. Wenn ja, führen Sie den callback_has_adblock aus. Wenn nicht, führen Sie den callback_no_adblock aus. Diese Lösung kostet eine Anfrage mehr, funktioniert aber zumindest:

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

Diese Lösung funktioniert für alle Arten von Anzeigen, nicht nur für Google AdSense.

John Skoumbourdis
quelle
Einige Adblocker blockieren jQuery, dann wird das Skript nicht ausgeführt, weil "$ nicht definiert ist". Verwenden Sie besser reine js.
Nyx
3

Trotz des Alters dieser Frage fand ich sie kürzlich sehr nützlich und kann daher nur davon ausgehen, dass andere sie noch sehen. Nachdem ich hier und anderswo nachgesehen hatte, vermutete ich, dass die drei wichtigsten clientseitigen Überprüfungen zur indirekten Erkennung eines Werbeblockers auf blockiert div/ imgblockiert wareniframe s und blockierten Ressourcen (Javascript-Dateien) zu .

Vielleicht ist es übertrieben oder paranoid, aber es deckt Anzeigenblockierungssysteme ab, die nur ein oder zwei aus der Auswahl blockieren und daher möglicherweise nicht abgedeckt wurden, wenn Sie nur die eine Prüfung durchgeführt haben.

Auf der Seite, auf der Sie die Prüfungen ausführen, fügen Sie Folgendes hinzu: (Ich verwende 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>

und fügen Sie an einer anderen Stelle auf der Seite Folgendes hinzu:

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

Ich habe ein Div mit einem Ködernamen sowie ein extern gehostetes Bild mit dem Text "Advert" und in den von AdSense verwendeten Dimensionen verwendet (dank placehold.it!).

In advertisement.jssollten Sie etwas an das Dokument anhängen, das wir später überprüfen können. Obwohl es so aussieht, als würden Sie das Gleiche tun wie zuvor, prüfen Sie tatsächlich, ob die Datei ( advertisement.js) selbst geladen wird, nicht die Ausgabe.

$(document).ready(
{

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

});

Und dann das Werbeblocker-Erkennungsskript, das alles kombiniert

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

});

Wenn das Dokument fertig ist , dh das Markup geladen ist, fügen wir dem Dokument auch den Iframe hinzu. Wenn dann das Fenster geladen wird , dh der Inhalt inkl. Bilder etc. geladen werden, prüfen wir:

  • Die Abmessungen und Sichtbarkeit des ersten Testdiv.
  • Dass der Inhalt des zweiten Test div ist „Kontrolle“, wie es , wenn das gewesen wäre , advertimsent.jswurde nicht gesperrt.
  • Die Abmessungen (und ich denke die Sichtbarkeit, da ein verstecktes Objekt keine Höhe oder Breite hat?) Des Iframes

Und die Stile:

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

div#myTestAd2
{
    display: none;
}

Hoffe das hilft

Luke S.
quelle
3

Wenn Sie den neuen AdSense-Code verwenden, können Sie eine einfache Überprüfung durchführen, ohne auf Inhalts- oder CSS-Überprüfungen zurückgreifen zu müssen.

Platzieren Sie Ihre Anzeigen wie gewohnt in Ihrem 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>

Dann rufen Sie den Adsense-Code am Ende Ihrer Seite auf (beachten Sie, dass Sie "async"beim Aufrufen des adsbygoogle.jsSkripts nicht das Flag verwenden ):

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

Fügen Sie dann diesen kleinen Codeausschnitt darunter hinzu:

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

AdSense erstellt / setzt das Flag immer adsbygoogle.loadedauf, truewenn die Anzeigen geladen werden. Sie können die Prüfung in eine setTimeout-Funktion einfügen, um die Prüfung um einige Sekunden zu verzögern.

Troy Morehouse
quelle
2
Dies hängt natürlich davon ab, wie die Anzeigen blockiert wurden. Wenn Ihre Adblocking-Software verhindert, dass AdSense vollständig geladen wird, funktioniert dies. Wenn Ihre Adblocking-Software jedoch die CSS-Anzeigeeigenschaft auf "none" oder die Höhe des jeweiligen Divs auf 0 setzt, funktioniert dies möglicherweise nicht.
Bangkokian
Wahr. Ich glaube nicht, dass es einen einfachen Weg gibt, 100% aller Adblocks zu fangen, aber zumindest können Sie einige davon fangen.
Troy Morehouse
3

Die meisten Adblocker brechen die HTTP-Anforderung an das Element ab ads.jsund machen es 0pxfür das Element, aber manchmal entfernte der Adblocker das DOM , und einige der obigen Antworten schlagen fehl, weil die Existenz des Elements nicht überprüft wird.

Verwenden von setTimeout() ist eine gute Praxis, da ohne sie das Skript mit Adblocker rast.

Das folgende Skript prüft, ob dom vorhanden / entfernt ist, und prüft offsetHeight, ob ein Element vorhanden ist.

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

Alle oben genannten Antworten sind gültig, die meisten funktionieren jedoch nicht für die Blockierung von Anzeigen auf DNS-Ebene.

Werbeblocker auf DNS-Ebene (wie Pi-Hole ) geben grundsätzlich NXDOMAIN (Domain existiert nicht) für eine Liste von Werbeblocker-Domains zurück (z. B. wird telemetry.microsoft.com "nicht existieren", wenn dies der Fall ist).

Es gibt einige Möglichkeiten, dies zu umgehen:

Methode A : Anforderung von Anzeigen nach IP-Adresse, nicht nach Domain.

Diese Methode ist etwas ärgerlich, da Sie die IP-Adressen im Auge behalten müssten. Dies ist problematisch, wenn Ihr Code nicht regelmäßig gepflegt oder aktualisiert wird.

Methode B : Blockieren Sie alle fehlgeschlagenen Anforderungen, auch wenn der Client NXDOMAIN meldet.

Dies ist für Benutzer sehr ärgerlich, wenn es sich um eine "legitime" NXDOMAIN handelt.

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

und in der Datei getbanner.cfm:

adb = false;

Ich denke, es ist der einfachste Weg, Adblock zu erkennen.

mikas
quelle
andere blockierte Dateien: easylist-downloads.adblockplus.org/easylist.txt Es ist der Standard-AdBlock-Filter
Mikas
adb scheint trueimmer zu sein
Deb
1

Das hat bei mir funktioniert:

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

$(document).ready(function(){
    if(isAdBlocked()) {
       alert('Y U NO LIKE ADS?');
    }
});
Jesus
quelle
Hab es gerade versucht; funktioniert nicht. Gibt immer true zurück, auch wenn keine Werbeblocker-Software installiert ist.
Ecnepsnai
Beachten Sie, dass dies nur auf einer Seite funktioniert, auf der Sie AdSense verwenden. Andernfalls wird immer true zurückgegeben, da dies die richtige Antwort ist. Window.google_jobrunner wird auf keiner Seite erkannt. Nur diejenigen, die Google AdSense verwenden. Sie können diesen Code tatsächlich auf meiner Website sehen: ruddl.com
jesal
Interessant, dass Ihre Methode zufällig dieselbe Nachricht verwendet wie die von HowToGeek . Für die Aufzeichnung bedeutet das Anzeigen eines Meldungsfelds nichts anderes als nervige und saure Benutzer gegen Ihre Site. Die meisten Websites entscheiden sich dafür, eine Nachricht auf einer Seite anzuzeigen (HTG versucht beides, aber nur das nervige Popup funktioniert).
Synetech
1

Ich weiß, dass dies bereits beantwortet wurde, aber ich habe mir die vorgeschlagene Beispielseite angesehen und sehe, dass sie es so machen:

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

Keine Zeitüberschreitungen und DOM-Schnüffeln erforderlich. Versuchen Sie einfach, ein Skript aus gängigen Werbenetzwerken zu laden, und prüfen Sie, ob der Werbeblocker die HTTP-Anforderung abgefangen hat.

/**
 * 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
quelle
1

Ich habe gerade mein eigenes "Plugin" erstellt, um dieses Problem zu lösen, und es funktioniert wirklich gut:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

Ich habe unter anderem die Kompatibilität mit Mobilgeräten und die Erkennung von jsBlocking hinzugefügt ... (Wie ein Overlay, das den Benutzern angezeigt wird, die sie auffordern, die Software adBlocking / jsBlocking zu deaktivieren ); Auch machte es reaktionsschnell freundlich.

Es wird unter der Coffeeware-Lizenz eröffnet .

Jmlevick
quelle
Schätzen Sie den Aufwand, aber es scheint nicht mit Adblock zu funktionieren ... zumindest zum Zeitpunkt des Schreibens dieses Kommentars.
Arunskrish
Es funktioniert mit adBlock. Eine Site, auf der ich dieses Plugin implementiert habe, ist calyphrox.net, auf der jeder überprüfen kann, ob das Plugin funktioniert.
Jmlevick
3
Link ist tot ... können wir das entfernen?
Evan Langlois
2
Bitte aktualisieren Sie die Links, dies macht dies zu einer schlechten Antwort.
Yazan Rawashdeh
0

Ich verstehe Ihre Spannung und Sie können überprüfen, ob ein Element per Skript erstellt wurde oder ob das Element ausgeblendet ist. Und wenn wir über das Blockieren von Werbung sprechen, können Sie nur auf die Sichtbarkeit der Elemente zählen, nicht auf die Präsenz der Elemente.

Elemente, die mit Skripten von Drittanbietern erstellt wurden, sind niemals vorhanden. Wenn das Skript derzeit nicht erreichbar ist (DNS-Fehler, Remote-Webserver-Fehler, Offline-Vorladen von Webseiten usw.), werden Sie immer falsch positiv.

Alle anderen Antworten mit Überprüfungen sind korrekt, aber denken Sie daran.

Eir Nym
quelle
0

timing's Die Antwort ist gut durchdacht, funktioniert aber nicht mehr. Deshalb habe ich den Namen der js-Datei von "ads" auf "adsense" aktualisiert und sie funktioniert wie ein Zauber!

Hier ist der Code, vielleicht hilft das jemandem:

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

Geben Sie in die Js-Datei genau diese Zeile ein: var adblockDetecter = true;

eclipseR
quelle
0

Jetzt gibt es eine bessere Möglichkeit, dies mit einem einfachen JS-Skript namens AdBlock Detector zu tun.
So verwenden Sie es:
Fügen Sie dies Ihrem <head>Abschnitt hinzu:

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

Jetzt können Sie die ab-messageID überall dort verwenden, wo Sie AdBlock-Nutzern eine Nachricht anzeigen möchten:

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

Beachten Sie den Inline-Stil, der hinzugefügt wurde, um ihn ursprünglich auszublenden (Sie können dies natürlich auch aus Ihrer eigenen CSS-Datei heraus tun).
Beachten Sie auch, dass es 500 ms dauert, weil es warten muss, bis der Adblocker seine Sache erledigt, sonst funktioniert es nicht.

Eine kleine Erklärung, wie dieses Skript funktioniert

Zunächst wird ein Iframe mit einer Quelle eines zufällig generierten Links angehängt. (Es wird zufällig generiert, da einige Adblocks intelligent sind und irgendwann erkennen, dass ein Link gefälscht ist.)
Anschließend werden mehrere Überprüfungen dieses Iframes ausgeführt (wenn er erfolgreich geladen wurde oder wenn sein Stil geändert wurde). Wenn einer dieser Tests wahr ist, wird das ab-messageElement angezeigt , um Benutzer zu blockieren.

Dieses Skript funktioniert für die meisten (wenn nicht alle) Werbeblocker.

EXTRA

Eigentlich hätte kein Punkt nur einen Kern erstellen können, aber stattdessen habe ich ein Github-Projekt erstellt, aber probieren Sie es trotzdem aus und markieren Sie es, wenn es Ihnen geholfen hat.
abDetector: Einfacher Vanilla JavaScript AdBlock Detector.
Genießen.

Nick Rameau
quelle
Schlechte Lösung. Eine externe .js-Datei kann leicht blockiert werden.
Bangkokian
@ Bangkokian Kopieren Sie es einfach und verweisen Sie darauf (und auf seine Lizenz) in Ihrer Nachricht, in der die Javascript-Datei oder index.js (oder was auch immer) angezeigt wird.
BlueEyesWhiteDragon
1
@BlueEyesWhiteDragon Sie sind richtig. Aber das war überhaupt nicht Trojas ursprüngliche Antwort. Es wurde jetzt zu 100% bearbeitet, um ein Inline-Skript anzuzeigen. Mein Kommentar steht. Seine ursprüngliche Antwort war speziell die Verwendung eines externen Skripts. stackoverflow.com/posts/34738388/revisions
Bangkokian
@Bangkokian genau, ich habe vergessen zu erwähnen, dass ich dank Ihres Kommentars meine Antwort bearbeitet habe, um den SO-Richtlinien zu folgen, und sie zu einem Inline-Skript gemacht habe. Vielen Dank.
Nick Rameau
0

Sie können dies überprüfen, es könnte helfen , Adblocker zu erkennen

Es ist eine Implementierung der Timing-Antwort

Fügen Sie dies vor jedem Skript im Head-Tag hinzu:

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

Dann später benutzen:

if (adblocker) {
    // the add blocker is enabled
}else{
    // ad blocker is not enabled
}
Mustafa Dwekat
quelle
Es funktioniert nicht. Es wird immer angezeigt, dass die Anzeige blockiert ist.
Himanshu Aggarwal
Überprüfen Sie den Wert window.adblockerin Ihrer Browserkonsole, wenn er zurückgegeben wird. trueDann wird der Adblocker aktiviert. Andernfalls wird der Wert zurückgegeben. falseSie können die vollständige Dokumentation von
Detect