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ć?
Odpowiedzi:
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
Gdzieś na mojej stronie:
Pliki takie jak ads.js są blokowane przez przynajmniej tych adblockerów w Chrome:
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
źródło
js/ads.js
? ponieważ jestem blogerem, musiałem.js
gdzieś przesłać (np. Dysk Google), a link w tym przypadku nie zawieraads
. Byłoby naprawdę pomocne, jeśli podasz link do pliku.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.
źródło
http://thepcspy.com/read/how_to_block_adblock/
Z jQuery:
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), abydisplay: none
to sprawdzić:Oczywiście oba z nich można w
if
razie potrzeby połączyć w jeden blok.Pamiętaj, że
visibility: hidden
również nie zostanie przechwycony (gdzie pozostaje miejsce na układ, ale reklama nie jest widoczna). Aby to sprawdzić, można użyć innego filtra:Który da ci tablicę elementów reklamy, które są „niewidoczne” (
0
teoretycznie każda z nich jest większa niż problem).źródło
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.Bez dodatkowych próśb. Brak bibliotek zewnętrznych. Prosty, prosty JavaScript:
Kredyt na stanowisku Christian Heilmann jest , myślę, że jest to zdecydowanie najlepsze rozwiązanie do wykrywania AdBlock.
źródło
testAd.style.display = 'absolute'
i przenieść poza ekran<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;"> </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;"> </div>
)absolute
jestposition
wartością.window.onload
funkcjiWię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:
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ć.
źródło
offsetHeight
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:
Ta metoda jest opisana tutaj: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam
źródło
typeof
jest narzutem, jeśli zaznaczysz właściwość obiektu. Użyj prostego=== undefined
.Moje najprostsze rozwiązanie z jquery to:
advertisement.js po prostu nic nie zawiera. Gdy ktoś używa adblocka, nie działa i funkcja zostaje wywołana.
źródło
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:Reszta odbywa się za pośrednictwem zwykłego podejrzanego jQuery:
Jak widać, używam
setTimeout
co najmniej 1ms. Testowałem to w różnych przeglądarkach i przez większość czasu, bezpośrednio sprawdzając, czy element wready
zawsze 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.źródło
.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ść.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 ads
i linkiem do innej strony / wyskakującego okienka zatytułowanymRead 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ę.
źródło
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.
źródło
Po prostu dodaj mały skrypt na swojej stronie:
Z nazwą adsbygoogle.js
Następnie wykonaj następujące czynności:
Znaleziono to rozwiązanie tutaj
źródło
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:
Jquery:
„ablockercheck” to identyfikator, który blokuje adblocker. Więc sprawdzając, czy jest widoczny, możesz wykryć, czy adblocker jest włączony.
źródło
AdBlock wydaje się blokować ładowanie plików JavaScript AdSense (itp.). Jeśli więc używasz asynchronicznej wersji reklam AdSense, możesz sprawdzić, czy
adsbygoogle
jestArray
. Należy to sprawdzić po kilku sekundach, ponieważ skrypt asynchroniczny jest ... asynchroniczny. Oto ogólny zarys :Aby to wyjaśnić, oto przykład tego, jak wygląda asynchroniczny kod reklam AdSense:
Zauważ, że
adsbygoogle
jest inicjowany jako tablica.adsbygoogle.js
Biblioteka zmienia tę tablicę doObject {push: ...}
kiedy to wykonuje. Sprawdzanie typu zmiennej po pewnym czasie może powiedzieć, czy skrypt został załadowany.źródło
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-ad
klasą jest automatycznie blokowany.bottom-ad
klasą:<div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
$('.bottom-ad').css('display') == "none"
a nawet lepiej, używając$('.bottom-ad').is(':visible')
Jeśli wartość wynosi
true
, to AdBlocker jest aktywny.źródło
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.
źródło
bezpieczny sposób to owinąć reklamy
<div>
i sprawdzić wysokośćDziała z Adblock Plus i zaporą Bluehell.
źródło
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:
To rozwiązanie działa dla wszystkich rodzajów reklam, nie tylko Google AdSense.
źródło
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
/img
zablokowaniaiframe
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)
i dodaj następujące miejsce w dowolnym miejscu na stronie:
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.js
was 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, czyadvertisement.js
ładowany jest sam plik ( ), a nie dane wyjściowe.A następnie skrypt wykrywający blokowanie reklam, który łączy wszystko
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:
advertimsent.js
zostało zablokowane.I style:
Mam nadzieję że to pomoże
źródło
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:
Następnie wywołujesz kod AdSense na dole strony (pamiętaj, aby nie używać
"async"
flagi podczas wywoływaniaadsbygoogle.js
skryptu):Następnie dodaj ten mały fragment kodu poniżej:
AdSense zawsze tworzy / ustawia flagę
adsbygoogle.loaded
dotrue
kiedy reklamy są ładowane, można umieścić czek w funkcji setTimeout opóźnić sprawdzenie przez kilka sekund.źródło
Większość adblockerów anuluje żądanie HTTP
ads.js
i tworzy0px
element, 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
offsetHeight
element, jeśli istnieje.źródło
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.
źródło
oraz w pliku getbanner.cfm:
Myślę, że to najłatwiejszy sposób na wykrycie adblocka.
źródło
true
zawszeOto, co zadziałało dla mnie:
źródło
Wiem, że już na to odpowiedziano, ale spojrzałem na sugerowaną przykładową stronę i widzę, że robią to w ten sposób:
źródło
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.
źródło
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 .
źródło
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.
źródło
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:
W pliku Js umieść tylko ten wiersz:
var adblockDetecter = true;
źródło
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:Teraz możesz używać
ab-message
identyfikatora w dowolnym miejscu, w którym chcesz wyświetlać wiadomość użytkownikom AdBlock: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-message
element 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ę.
źródło
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:
Następnie użyj go:
źródło
window.adblocker
w konsoli przeglądarki, jeśli zwróci,true
a następnie zostanie włączony adblocker, w przeciwnym razie wrócifalse
, możesz sprawdzić pełną dokumentację wykrywanie-adblocker