Jak wykryć Adblock na mojej stronie?

370

Chciałbym móc wykryć, czy użytkownik korzysta z oprogramowania do blokowania reklam podczas odwiedzania mojej witryny. Jeśli go używają, chcę wyświetlić komunikat z prośbą o wyłączenie go w celu wsparcia projektu, tak jak robi to ta strona internetowa .

Jeśli przejdziesz do tej witryny, a Twoja przeglądarka ma włączone oprogramowanie Adblock, witryna zamiast wyświetlać rzeczywiste reklamy wyświetla mały baner informujący użytkowników, że przychody z reklam są wykorzystywane do hostingu projektu i powinni rozważyć wyłączenie Adblocka .

Chcę to zrobić na swojej stronie, korzystam z reklam AdSense, jak to zrobić?

Jmlevick
źródło
2
możliwy duplikat oprogramowania
416E64726577,
5
Użytkownicy szukający najnowszego rozwiązania powinni wiedzieć, że na stronie github.com/sitexw/BlockAdBlock
yeaske
5
Niektóre osoby po prostu nie lubią być analizowane i reklamowane w Internecie. Niektóre witryny, które odwiedziłem, mówiąc nam, że przychody wspierają ich projekt, są tak pogrążone w reklamach, że staje się śmieszne.
Paul
7
Teraz, gdy strony robią to coraz więcej (i nadużywają tego, kłamią nam, że ich reklamy nie są uciążliwe, i zmuszają nas do dodania do białej listy całej witryny tylko po to, aby wejść ...) - Czy są jakieś rozszerzenia lub sztuczki, których możemy użyć aby zapobiec ich wykryciu, używamy AdBlock +? - Nie mam nic przeciwko zobaczeniu kilku ukierunkowanych reklam banerowych tu czy tam, ale klikanie i ciągłe wyskakujące okienka wideo na pełnym ekranie nie są moją rzeczą.
BrainSlugs83
1
Proszę zobaczyć moje rozwiązanie, jest proste i czyste. Czysta JS, bez dodatkowych żądań, bez zewnętrznych bibliotek lub wtyczek lub innych BS.
Cumulo Nimbus

Odpowiedzi:

410

Moje rozwiązanie nie jest specyficzne dla określonej sieci reklamowej i jest bardzo lekkie. Produkuję go od kilku lat. AdBlock blokuje wszystkie adresy URL zawierające słowo „reklamy”. Oto co zrobiłem:

Dodałem mały plik js do mojego katalogu głównego z nazwą ads.js

To jedyny wiersz kodu w tym pliku

var canRunAds = true;

Gdzieś na mojej stronie:

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

Pliki takie jak ads.js są blokowane przez przynajmniej tych adblockerów w Chrome:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • Ghostery

Aktualizacja 15.02.2019:

Dodano Ghostery na powyższej liście, ponieważ rozszerzenie blokuje teraz również żądania do ads.js. Bardzo przydatny. Czy to oznacza, że ​​Ghostery pomaga nam twórcom w wykrywaniu blokowania reklam za pomocą ich rozszerzeń?

Nie działa z:

Borsuk prywatności

wyczucie czasu
źródło
1
czy możesz podać pełny link js/ads.js? ponieważ jestem blogerem, musiałem .jsgdzieś przesłać (np. Dysk Google), a link w tym przypadku nie zawiera ads. Byłoby naprawdę pomocne, jeśli podasz link do pliku.
Deb
91
Plik zawiera tylko słowa „var canRunAds = true;” więc po prostu stwórz to sam.
czas
5
Niektóre programy blokujące reklamy wydają się nie blokować pliku ads.js, jak dla mnie, prosty adblock dla chrome.
Mgamerz
2
ABP dla chromu dobrze reaguje, więc wszystko działa poprawnie!
Maxime Lafarie,
9
Możesz także spróbować uruchomić polecenie ajax na adres URL zablokowany przez adblockera. Jeśli się powiedzie, nie ma adblockera, jeśli się nie powiedzie, jest adblocker.
SethWhite
138

Nie jest to bezpośrednia odpowiedź, ale odłożyłbym wiadomość za reklamę do załadowania ... zamiast próbować ją wykryć, pojawiłaby się, gdy reklama nie.

mavrck
źródło
5
Użytkownicy mogą nadal blokować te zablokowane ogłoszenia reklamowe za pomocą Adblocka: to jedyna wada, jaką znam.
Anderson Green,
25
Może to być łatwe, ale nie jest to właściwy sposób, jeśli układ zostanie zniekształcony lub reklama ładuje się powoli, użytkownik może dostrzec błąd, który go nie dotyczy. Pamiętaj też, że Adblock podejmuje kroki w celu zablokowania natrętnych wiadomości skierowanych do użytkowników ABP. Jeśli chcesz poprosić użytkownika o odblokowanie, zrób to poprzez prostą, ukrytą wiadomość, która znajduje się poza układem (nie odpycha innych elementów). Spójrz na duckduckgo.com/?q=foo+bar z włączonym adblockiem.
Xeevis,
1
@Xeevis - czego szukam? - Myślę, że AdBlock + już blokuje to, co robi duckduckgo.
BrainSlugs83
101

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

Z jQuery:

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

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

Oczywiście potrzebujesz strony docelowej dla AdblockNotice.html, a klasa .myTestAd musi odzwierciedlać Twoje rzeczywiste pojemniki z reklamami. Ale to powinno zadziałać.

EDYTOWAĆ

Jak zaleca TD_Nijboer, lepszym sposobem jest użycie selektora :hidden(lub :visible, jak używam poniżej), aby display: noneto sprawdzić:

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

Oczywiście oba z nich można w ifrazie potrzeby połączyć w jeden blok.

Pamiętaj, że visibility: hiddenrównież nie zostanie przechwycony (gdzie pozostaje miejsce na układ, ale reklama nie jest widoczna). Aby to sprawdzić, można użyć innego filtra:

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

Który da ci tablicę elementów reklamy, które są „niewidoczne” ( 0teoretycznie każda z nich jest większa niż problem).

Jared Farrish
źródło
16
Przekierowanie w tym przypadku jest złym pomysłem. Jeśli Twoja usługa reklamowa ulegnie awarii, wszyscy użytkownicy mogą zostać przekierowani na tę stronę. Polecam również użycie zdarzenia onload okna zamiast przygotowywania dokumentu.
Andy E
1
lepszym sposobem wykrywania byłoby $ („. myTestAd”). is („: hidden”); zgodnie z instrukcją wykrywa również, czy szerokość / wysokość wynosi 0 i czy 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.W rzeczy samej. Nie wspominając już o tym, że po prostu zrzuciliby ze sobą prosty skrypt, aby pokonać środek zaradczy. Poza tym, czy naprawdę uważasz, że będąc agresywnym i silnym, użytkownicy będą zmotywowani do wyłączenia swoich programów blokujących reklamy? Nie, wystarczyłoby ich wkurzyć i zakwasić na swojej stronie. Większość witryn wybiera wyświetlanie wiadomości zamiast wrogości.
Synetech
To nie działa dla mnie w Chrome. W zdarzeniu DOMReady reklama nadal wydaje się widoczna.
nwellnhof
3
Nie należy uniemożliwiać użytkownikom wejścia na Twoją stronę, ponieważ mają wyłączone reklamy - to tylko przyspiesza wyścig zbrojeń. - Jeśli poprosisz nas uprzejmie o ich włączenie, możemy to zrobić - jeśli spróbujesz nas zmusić, albo po prostu przestaniemy wchodzić na twoją stronę, albo zgłosimy błąd w naszym adblockerze i otrzymamy naprawiono dla twojej strony. - To jest dokładnie taki rodzaj zachowania, jakie istnieją adblockery, aby chronić użytkowników.
BrainSlugs83
92

Bez dodatkowych próśb. Brak bibliotek zewnętrznych. Prosty, prosty 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);

  • Tworzysz element za pomocą klasy adsbox (zdefiniowanej jako element wymienny w pliku definicji AdBlock Plus)
  • Dodajesz go do dokumentu i po chwili odczytujesz jego offsetHeight
  • Jeśli zainstalowany jest AdBlock, element nie będzie miał żadnej wysokości.

Kredyt na stanowisku Christian Heilmann jest , myślę, że jest to zdecydowanie najlepsze rozwiązanie do wykrywania AdBlock.

Cumulo Nimbus
źródło
5
Aby zapobiec usterkom, możesz je dodać testAd.style.display = 'absolute'i przenieść poza ekran
Gerald
4
dobre rozwiązanie, ale dla tych, którzy cierpią na opóźnienie 100 ms, sugeruję dodanie czegoś takiego do treści dokumentu: <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>(oczywiście po przetestowaniu css należy zmienić na <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 Dobry punkt. ale AFAIK absolutejest positionwartością.
Em Seven
czy mogę tylko dodać, dostałem to rozwiązanie działające tylko wtedy, gdy dodałem je w ramach window.onloadfunkcji
Peter Cullen
Pamiętaj, że to nie działa w AdBlock dla Firefoksa
Eda190 30.09.17
42

Większość reklam jest dynamicznie ładowana w javascript. Właśnie wykorzystałem zdarzenie onerror do wykrycia, czy skrypt reklamy może zostać załadowany, czy nie. Wydaje się, że działa.

Przykład z GoogleAds:

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

Można tego również użyć w innych elementach, aby sprawdzić, czy bloker reklam blokuje treść. Ta metoda może dawać fałszywe alarmy, jeśli zdalne elementy nie istnieją lub nie można do nich dotrzeć.

JonMayer
źródło
1
Jest to jeden z najlepszych sposobów sprawdzenia, czy reklama jest załadowana, czy nie. Ponieważ ręczne ładowanie własnego skryptu polega na blokowaniu w celu zablokowania, że ​​czasem się nie powiedzie.
MaZZly
To wydaje się być najlepszym rozwiązaniem dla dynamicznie ładowanych skryptów.
Carca
Nie wiem, czy coś się zmieniło, odkąd to napisano, ale nie mogę zmusić się do odpalenia za pomocą chromowanej wtyczki Fair Adblock firmy STANDS.
Melchester
według stanu na marzec 2018 r., wciąż najlepsze, proste i zdecydowane rozwiązanie
Daniel Vukasovich,
jak powiedziano powyżej, nie działa z uczciwym adblockerem, lepiej to sprawdzićoffsetHeight
cieunteung
17

Aby wykryć, czy użytkownik blokuje reklamy, wystarczy znaleźć funkcję w javascript reklamy i spróbować ją przetestować. Nie ma znaczenia, jakiej metody używają do blokowania reklamy. Oto jak to wygląda w przypadku reklam Google Adsense:

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

Ta metoda jest opisana tutaj: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam

Amant
źródło
8
google_render_ad jest teraz niezdefiniowany w dowolnym momencie, typeof (window.google_jobrunner)! = „obiekt” działa dla mnie.
Dmitrii Korotovskii,
4
Ponieważ nie kontrolujesz kodu, myślę, że poleganie na tym jest złe, ponieważ refaktor biblioteki sprawi, że skrypt wykryje blok reklamowy dla wszystkich użytkowników.
Patrick Forget
1
typeofjest narzutem, jeśli zaznaczysz właściwość obiektu. Użyj prostego === undefined.
Robo Robok,
12

Moje najprostsze rozwiązanie z jquery to:

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

advertisement.js po prostu nic nie zawiera. Gdy ktoś używa adblocka, nie działa i funkcja zostaje wywołana.

Luca Steeb
źródło
10

Wiem, że jest już wystarczająco dużo odpowiedzi, ale ponieważ to pytanie pojawia się w wyszukiwanym przez Google temacie „wykrywaj blokadę” w tym temacie, chciałem dać pewien wgląd na wypadek, gdybyś nie korzystał z programu AdSense .

W szczególności w tym przykładzie można sprawdzić, czy używana jest domyślna lista Adblock dostarczona przez Firefox Adblock. Zaletą jest to, że na tej liście bloków znajduje się element zablokowany za pomocą identyfikatora CSS #bottomAd. Jeśli dołączę taki element na stronie i sprawdzę jego wysokość, wiem, czy blokowanie jest aktywne, czy nie:

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

Reszta odbywa się za pośrednictwem zwykłego podejrzanego jQuery:

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

Jak widać, używam setTimeoutco najmniej 1ms. Testowałem to w różnych przeglądarkach i przez większość czasu, bezpośrednio sprawdzając, czy element w readyzawsze zwraca 0; bez względu na to, czy adblocker był aktywny, czy nie. Miałem dwa pomysły na ten temat: albo renderowanie jeszcze się nie skończyło, albo Adblock jeszcze nie zaczął. Nie zawracałem sobie głowy dalszym dochodzeniem.

znak
źródło
Naprawdę podoba mi się ta odpowiedź, ponieważ nie wiąże się to z dodatkowymi żądaniami, czy istnieją wady takiego podejścia zamiast fałszywych żądań ads.js?
JeroenVdb,
Zamiast testować długość i wysokość, nie możesz po prostu użyć if ($ („# bottomAd”). Is (': hidden')) ...?
Evan Langlois,
@EvanLanglois, wiem, że pytałeś dwa lata temu, ale twoje pytanie naprawdę mnie zainteresowało, więc poszłam nurkować po informacje na ten temat. Najwyraźniej .is(":hidden")sprawdzenie zależy od tego, czy wysokość i szerokość są równe zero. Jeśli ustawisz wysokość na 0, ale div nadal zajmuje szerokość, to jQuery nie uważa jej za „ukrytą”. Tak więc, czy można powiedzieć, .is(":hidden")jest nieco zależne od tego, jak adblocker zdecyduje się zmienić rozmiar / ukryć zawartość.
Spencer D
10

Moja rada: nie rób tego!

Każdy scenariusz, w którym traktujesz ludzi jako „złoczyńców”, spowoduje, że będą walczyć.

Oto moja propozycja.

Umieść mały dyskretny komunikat na górze strony (niezależnie od tego, czy reklamy są blokowane) z tekstem I *totally* respect your right to block adsi linkiem do innej strony / wyskakującego okienka zatytułowanym Read more ....

Na drugiej stronie wyjaśnij, że rozumiesz, że to ich komputer i że mogą swobodnie korzystać z blokowania reklam.

Wyjaśnij to również bez oskarżenia że korzystanie z tych blokerów utrudnia dostarczanie świetnych treści (wyjaśniając szczegółowo, dlaczego) i że wolisz, aby blokowanie reklam nie miało miejsca w Twojej witrynie, to całkowicie ich decyzja. Skoncentruj się na zaletach wyłączania blokowania.

Ci, którzy są zdecydowanie przeciwni reklamom, zignorują to, ale i tak nigdy nie mieliście okazji ich przekonać. Ci, którzy są obojętni, mogą być zachwyceni twoim apelem, ponieważ nie robisz całego „pozwól mi dostać się, bo wezmę piłkę i idę do domu”, co szczerze powinno być wyłączną domeną pięcioletnich dzieci.

Pamiętaj, że nikt nie przyłożył pistoletu do twojej głowy i nie zmusił cię do włożenia swoich rzeczy do sieci. Traktuj swoich czytelników / użytkowników z szacunkiem, a prawdopodobnie wielu z nich odwzajemni się.

paxdiablo
źródło
1
Co powiesz na „Wygląda na to, że używasz blokera reklam. To fajnie! My też :) Wspieraj X, mówiąc swoim znajomym o nas!”
ADTC
3
heh spróbuj zarabiać na czymś w ten sposób ... reklamy są zwykłym sposobem płatności, więc użytkownik powinien zapłacić
dev1223,
co z moim układem jest zepsuty po włączeniu Adblock?
godblessstrawberry
5
Jeśli witryna zmusza mnie do wyłączenia funkcji blokowania reklam, przechodzę dalej. Przegrywają, a mnie to nie obchodzi. Po prostu wyciągam z pamięci podręcznej kopię z Google.
RayfenWindspear,
1
@Tallboy, w mojej odpowiedzi nie ma etyki. Istnieje tylko rzeczywistość odbiorców, do których próbujesz dotrzeć. I chociaż twoje intencje mogą być zgodne z opisem, ponowne przeczytanie pytania pokaże, że było to specjalnie po to, aby poprosić użytkownika o zezwolenie na reklamy, a nie o uporządkowanie układu lub coś takiego. To było pytanie, na które odpowiadałem, a nie jakieś inne pytanie przewidywane pół dekady później :-)
paxdiablo
9

Wykorzystują fakt, że kod reklamowy Google tworzy iframe o identyfikatorze „iframe”. Tak długo, jak nie masz jeszcze czegoś na swojej stronie z tym identyfikatorem, to też by ci działało.

<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
źródło
9

Po prostu dodaj mały skrypt na swojej stronie:

var isAdsDisplayed = true;

Z nazwą adsbygoogle.js

Następnie wykonaj następujące czynności:

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

Znaleziono to rozwiązanie tutaj

druss
źródło
To niesamowity człowiek, dziękuję bardzo 💓
Jodyshop
8

Zauważyłem, że poprzednie komentarze wykorzystują Google AdSense jako obiekt do testowania. Niektóre strony nie używają AdSense, a używanie bloku AdSense jako testu nie jest tak naprawdę dobrym pomysłem. Ponieważ blok AdSense może zaszkodzić Twojemu SEO. Oto przykład, w jaki sposób wykrywam przez prostą blokowaną klasę adblockera:

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” to identyfikator, który blokuje adblocker. Więc sprawdzając, czy jest widoczny, możesz wykryć, czy adblocker jest włączony.

Roman Losev
źródło
7

AdBlock wydaje się blokować ładowanie plików JavaScript AdSense (itp.). Jeśli więc używasz asynchronicznej wersji reklam AdSense, możesz sprawdzić, czy adsbygooglejest Array. Należy to sprawdzić po kilku sekundach, ponieważ skrypt asynchroniczny jest ... asynchroniczny. Oto ogólny zarys :

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

Aby to wyjaśnić, oto przykład tego, jak wygląda asynchroniczny kod reklam 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>

Zauważ, że adsbygooglejest inicjowany jako tablica. adsbygoogle.jsBiblioteka zmienia tę tablicę do Object {push: ...}kiedy to wykonuje. Sprawdzanie typu zmiennej po pewnym czasie może powiedzieć, czy skrypt został załadowany.

Salman A.
źródło
Będzie to działać przez większość czasu, ale co, jeśli użytkownik ma wolne połączenie (pomyśl o urządzeniach mobilnych)?
Luca Steeb,
6

Takie podejście stosuję na mojej stronie, być może okaże się pomocne. Moim zdaniem jest to najprostsze rozwiązanie.

AdBlocker blokuje określone klasy i elementy HTML, sprawdzając te selektory wszelkich zablokowanych reklam w konsoli programisty (wszystkie są na liście), możesz zobaczyć, które elementy będą zawsze blokowane.

Np. Po prostu przejrzyj tę stronę pytań w przepełnieniu stosu, a zobaczysz kilka zablokowanych reklam.

Na przykład każdy element z bottom-adklasą jest automatycznie blokowany.

  1. Utworzyłem niepusty element div z bottom-adklasą: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. Po załadowaniu strony sprawdź, czy ten element jest ukryty. Użyłem jQuery, ale nie krępuj się używać javascript: $('.bottom-ad').css('display') == "none"a nawet lepiej, używając$('.bottom-ad').is(':visible')

Jeśli wartość wynosi true, to AdBlocker jest aktywny.

NGix
źródło
6

Nie potrzebujesz dodatkowego żądania HTTP, możesz po prostu obliczyć wysokość fałszywego dodatku.

Nawiasem mówiąc, tutaj jest pełna lista pasująca do elementów, których adblockery unikają renderowania.

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
źródło
6

bezpieczny sposób to owinąć reklamy <div>i sprawdzić wysokość

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

Działa z Adblock Plus i zaporą Bluehell.

uingtea
źródło
6

Skuteczny sposób sprawdzenia, czy istnieje adblock: wystarczy sprawdzić, czy jest włączony adblock, próbując wywołać adres URL reklam Google. Jeśli tak, uruchom callback_has_adblock, jeśli nie, uruchom callback_no_adblock. To rozwiązanie kosztuje jedno żądanie więcej, ale przynajmniej działa:

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

To rozwiązanie działa dla wszystkich rodzajów reklam, nie tylko Google AdSense.

John Skoumbourdis
źródło
niektórzy adblockerzy blokują jQuery, wtedy skrypt nie działa, ponieważ „$ nie jest zdefiniowane”. Lepiej używaj czystego js.
nyx
3

Mimo wieku tego pytania ostatnio uznałem je za bardzo przydatne i dlatego mogę założyć, że są jeszcze inni. Po sprawdzeniu tutaj i gdzie indziej domyśliłem się, że trzy główne kontrole po stronie klienta w celu pośredniego wykrycia blokera reklam polegały na sprawdzeniu zablokowania div/ imgzablokowaniaiframe si zablokowanych zasobów (plików javascript).

Może jest to przesadne lub paranoiczne, ale obejmuje systemy blokujące reklamy, które blokują tylko jeden lub dwa spośród wybranych, a zatem może nie zostać uwzględnione, gdybyś tylko zrobił jedną kontrolę.

Na stronie, na której przeprowadzasz kontrole, dodaj: (Używam 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>

i dodaj następujące miejsce w dowolnym miejscu na stronie:

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

Użyłem div z nazwą przynęty, a także zewnętrznie hostowanego obrazu z tekstem „Advert” oraz w wymiarach używanych przez AdSense (dzięki placehold.it!).

W advertisement.jswas powinien dołączyć coś do dokumentu, który można sprawdzić na później. Chociaż wydaje się, że robisz to samo co poprzednio, w rzeczywistości sprawdzasz, czy advertisement.jsładowany jest sam plik ( ), a nie dane wyjściowe.

$(document).ready(
{

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

});

A następnie skrypt wykrywający blokowanie reklam, który łączy wszystko

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

});

Gdy dokument jest gotowy , tzn. Ładuje się znaczniki, dodajemy do niego również ramkę iframe. Następnie, gdy okno jest załadowane , tzn. Zawartość zawiera. obrazy itp. są ładowane, sprawdzamy:

  • Wymiary i widoczność pierwszego działu testowego.
  • Że zawartość drugiego div testowego to „check”, tak jak by to było, gdyby nieadvertimsent.js zostało zablokowane.
  • Wymiary (i chyba widoczność, ponieważ ukryty obiekt nie ma wysokości ani szerokości?) Ramki iframe

I style:

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

div#myTestAd2
{
    display: none;
}

Mam nadzieję że to pomoże

Luke S.
źródło
3

Jeśli korzystasz z nowego kodu AdSense, możesz zrobić łatwą kontrolę, bez uciekania się do kontroli treści lub css.

Umieść swoje reklamy jak zwykle na swoim znaczniku:

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

Następnie wywołujesz kod AdSense na dole strony (pamiętaj, aby nie używać "async"flagi podczas wywoływania adsbygoogle.jsskryptu):

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

Następnie dodaj ten mały fragment kodu poniżej:

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

AdSense zawsze tworzy / ustawia flagę adsbygoogle.loadeddo truekiedy reklamy są ładowane, można umieścić czek w funkcji setTimeout opóźnić sprawdzenie przez kilka sekund.

Troy Morehouse
źródło
2
To oczywiście zależy od sposobu blokowania reklam. Jeśli oprogramowanie blokujące całkowicie uniemożliwia ładowanie AdSense, zadziała. Ale jeśli twoje oprogramowanie blokujące robi coś takiego jak ustawienie właściwości wyświetlania CSS na „none” lub wysokości odpowiedniego div na 0, to może nie działać.
Bangkokian
Prawdziwe. Nie sądzę, że istnieje prosty sposób na złapanie 100% wszystkich bloków reklam, ale przynajmniej możesz złapać niektóre z nich.
Troy Morehouse
3

Większość adblockerów anuluje żądanie HTTP ads.jsi tworzy 0pxelement, ale kiedyś adblocker usunął DOM , a niektóre powyższe odpowiedzi zakończą się niepowodzeniem, ponieważ nie istnienia elementu.

Używanie setTimeout()jest dobrą praktyką, ponieważ bez niej skrypt sprawi, że będzie się ścigał z adblockerem.

Poniższy skrypt sprawdzi, czy dom istnieje / usunął i sprawdzi offsetHeightelement, jeśli istnieje.

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
źródło
2

Wszystkie powyższe odpowiedzi są prawidłowe, jednak większość nie będzie działać w przypadku blokowania reklam na poziomie DNS.

Blokery reklam na poziomie DNS (takie jak pi-hole ) w zasadzie zwracają NXDOMAIN (domena nie istnieje) dla listy domen blokujących reklamy (np. Telemetry.microsoft.com „nie będzie”, gdy to zrobi).

Istnieje kilka sposobów obejścia tego:

Metoda A : Żądanie reklam według adresu IP, a nie domeny.

Ta metoda jest nieco denerwująca, ponieważ musisz śledzić adresy IP. Będzie to problematyczne, jeśli Twój kod nie będzie dobrze utrzymywany lub regularnie aktualizowany.

Metoda B : Blokuj wszystkie żądania, które nie powiodły się, nawet jeśli klient zgłasza NXDOMAIN.

Będzie to bardzo denerwujące dla użytkowników, jeśli będzie to „legalny” NXDOMAIN.

Kot
źródło
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>

oraz w pliku getbanner.cfm:

adb = false;

Myślę, że to najłatwiejszy sposób na wykrycie adblocka.

mikas
źródło
inne zablokowane pliki: easylist-downloads.adblockplus.org/easylist.txt to domyślny filtr AdBlock
mikas
adb wydaje się być truezawsze
Deb
1

Oto, co zadziałało dla mnie:

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

$(document).ready(function(){
    if(isAdBlocked()) {
       alert('Y U NO LIKE ADS?');
    }
});
jesal
źródło
Właśnie tego spróbowałem; nie działa. Zawsze zwraca wartość true, nawet jeśli nie jest zainstalowane oprogramowanie blokujące reklamy.
ecnepsnai
Pamiętaj, że będzie to działać tylko na stronie, na której korzystasz z AdSense. W przeciwnym razie zawsze zwróci wartość true, ponieważ jest to poprawna odpowiedź - window.google_jobrunner nie zostanie wykryty na żadnej i wszystkich stronach. Tylko te, które używają Google AdSense. Rzeczywiście możesz zobaczyć ten kod działający na mojej stronie: ruddl.com
jesal
Ciekawe, że twoja metoda używa tej samej wiadomości, co ta używana przez HowToGeek . Dla przypomnienia, wyświetlenie okna komunikatu nic nie drażni, tylko irytuje użytkowników na twoją stronę; większość stron decyduje się na wyświetlanie wiadomości na stronie (HTG próbuje zrobić obie rzeczy, ale działa tylko irytujące wyskakujące okienko).
Synetech
1

Wiem, że już na to odpowiedziano, ale spojrzałem na sugerowaną przykładową stronę i widzę, że robią to w ten sposób:

<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>
Jan
źródło
1

Nie ma potrzeby limitów czasu i wąchania DOM. Po prostu spróbuj załadować skrypt z popularnych sieci reklamowych i sprawdź, czy bloker reklam przechwycił żądanie HTTP.

/**
 * Attempt to load a script from a popular ad network. Ad blockers will intercept the HTTP request.
 *
 * @param {string} url
 * @param {Function} cb
 */
function detectAdBlockerAsync(url, cb){
    var script = document.createElement('script');

    script.onerror = function(){
        script.onerror = null;
        document.body.removeChild(script);
        cb();
    }

    script.src = url;
    document.body.appendChild(script);
}

detectAdBlockerAsync('http://ads.pubmatic.com/AdServer/js/gshowad.js', function(){
    document.body.style.background = '#c00';
});
rodrigo-silveira
źródło
1

Właśnie stworzyłem własną „wtyczkę” do rozwiązania tego problemu i działa ona naprawdę dobrze:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

Dodałem między innymi kompatybilność mobilną i wykrywanie jsBlocking ... (Jak nakładka wyświetlana użytkownikom proszącym ich o wyłączenie adBlocking / jsBlocking oprogramowania ); Sprawił też, że był responsywny.

Jest otwarty na podstawie licencji na ekspres do kawy .

Jmlevick
źródło
Doceń wysiłek, ale wydaje się, że nie działa z Adblock ... przynajmniej w momencie pisania tego komentarza.
arunskrish
działa z adBlock, stroną, na której zaimplementowałem tę wtyczkę jest calyphrox.net, gdzie każdy może faktycznie zweryfikować, czy wtyczka działa.
Jmlevick
3
Link is Dead ... czy możemy to usunąć?
Evan Langlois,
2
Zaktualizuj linki, co czyni złą odpowiedź.
Yazan Rawashdeh,
0

Rozumiem twoje napięcie i możesz sprawdzić, czy element został utworzony przez skrypt, czy element jest ukryty. A jeśli mówimy o blokowaniu reklam, możesz liczyć tylko na widoczność elementu, a nie na jego obecność.

Element utworzony za pomocą skryptu innej firmy nigdy nie będzie obecny, że jeśli skrypt nie jest w tej chwili osiągalny (błąd DNS, błąd zdalnego serwera WWW, wstępne ładowanie strony w trybie offline itp.), A zawsze otrzymasz fałszywy wynik pozytywny.

Wszystkie pozostałe odpowiedzi z czekami są poprawne, ale pamiętaj o tym.

Eir Nym
źródło
0

timing's odpowiedź jest przemyślana, ale już nie działa, więc zaktualizowałem nazwę pliku js do „adsense” z „reklam” i działa jak urok!

Oto kod, może to komuś pomoże:

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

W pliku Js umieść tylko ten wiersz: var adblockDetecter = true;

eclipseR
źródło
0

Teraz jest lepszy sposób, aby to zrobić za pomocą prostego skryptu JS o nazwie AdBlock Detector
Oto jak go użyć:
Dodaj to do swojej <head>sekcji:

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

Teraz możesz używać ab-messageidentyfikatora w dowolnym miejscu, w którym chcesz wyświetlać wiadomość użytkownikom AdBlock:

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

Zwróć uwagę na dodany styl wbudowany, aby go pierwotnie ukryć (oczywiście możesz to również zrobić z własnego pliku CSS).
Zauważ też, że zajmuje to 500 ms, ponieważ musi on poczekać, aż adblocker zrobi swoje, inaczej nie zadziała.

Małe wyjaśnienie, jak działa ten skrypt

Najpierw dołącza element iframe ze źródłem losowo generowanego łącza. (Jest generowany losowo, ponieważ niektóre adbloki są inteligentne, w pewnym momencie zdają sobie sprawę, że link jest fałszywy).
Następnie uruchamia wiele kontroli tego elementu iframe (jeśli został pomyślnie załadowany lub jeśli jego styl został zmodyfikowany). Jeśli jeden z tych testów jest prawdziwy, wyświetla ab-messageelement do zablokowania użytkowników.

Ten skrypt działa w przypadku większości (jeśli nie wszystkich) programów blokujących reklamy.

DODATKOWY

Naprawdę nie ma sensu, żeby po prostu stworzyć sens, ale zamiast tego stworzyłem projekt Github, ale mimo to sprawdź go i oznacz gwiazdką, jeśli ci pomógł.
abDetector: Prosty waniliowy JavaScript AdBlock Detector.
Cieszyć się.

Nick Rameau
źródło
Słabe rozwiązanie. Zewnętrzny plik .js można łatwo zablokować.
Bangkokian
@ Bangkokian Wystarczy skopiować i odwołać się do niego (i jego licencji) w wiadomości pokazującej plik javascript lub index.js (lub cokolwiek innego).
BlueEyesWhiteDragon
1
@BlueEyesWhiteDragon Masz rację. Ale nie taka była pierwotna odpowiedź Troya. Został teraz w 100% zmodyfikowany, aby pokazać skrypt wbudowany. Mój komentarz jest ważny. Jego pierwotna odpowiedź polegała w szczególności na użyciu zewnętrznego skryptu. stackoverflow.com/posts/34738388/revisions
Bangkokian
@ Dokładnie w Bangkoku zapomniałem wspomnieć, że dzięki Twojemu komentarzowi zredagowałem swoją odpowiedź, aby postępować zgodnie z wytycznymi SO i uczyniłem ją skryptem wbudowanym. Dziękuję Ci.
Nick Rameau,
0

Możesz to sprawdzić, może to pomóc w wykrywaniu adblockera

To wdrożenie odpowiedzi czasowej

Dodaj to przed dowolnym skryptem w tagu 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>

Następnie użyj go:

if (adblocker) {
    // the add blocker is enabled
}else{
    // ad blocker is not enabled
}
Mustafa Dwekat
źródło
To nie działa Zawsze pokazuje, że reklama jest zablokowana.
Himanshu Aggarwal
sprawdź wartość window.adblockerw konsoli przeglądarki, jeśli zwróci, truea następnie zostanie włączony adblocker, w przeciwnym razie wróci false, możesz sprawdzić pełną dokumentację wykrywanie-adblocker
Mustafa Dwekat