Web sitemde Adblock'u nasıl tespit edebilirim?


370

Kullanıcının web sitemi ziyaret ettiğinde reklam engelleme yazılımı kullanıp kullanmadığını tespit etmek istiyorum. Eğer kullanıyorlarsa, bu web sitesinde olduğu gibi, projeyi desteklemek için onları kapatmalarını isteyen bir mesaj görüntülemek istiyorum .

Bu siteye girerseniz ve tarayıcınızda bir tür reklam engelleme yazılımı etkinleştirilmişse, gerçek reklamları göstermek yerine site, kullanıcılara reklam gelirinin projeyi barındırmak için kullanıldığını ve Reklam Engellemeyi kapatmayı düşünmeleri gerektiğini gösteren küçük bir banner gösterir. .

Bunu web sitemde yapmak istiyorum, üzerinde adsense reklamları kullanıyorum, bunu nasıl yapabilirim?



5
En son çözümü arayan kullanıcılar için, github.com/sitexw/BlockAdBlock
yeaske

5
Bazı insanlar analiz edilmesini ve web'de reklamının yapılmasını sevmezler. Ziyaret ettiğim bazı siteler, gelirin projelerini desteklediğini söyleyen reklamlarda öylesine şaşırmışlar ki saçma hale geliyor.
Paul

7
Artık siteler bunu giderek daha fazla yapıyor (ve kötüye kullanıyor ve reklamlarının güvenilmez olması konusunda bize yalan söylüyor ve bizi sitenin tamamını girmek için beyaz listeye eklemeye zorluyor ...) - Kullanabileceğimiz herhangi bir uzantı veya hile var mı? algılamasını önlemek için AdBlock + kullanıyoruz? - Burada veya orada birkaç hedefli banner reklamı görmeyi umursamıyorum, ancak tıklama krikosu ve sabit tam ekran video pop-up'ları benim işim değil.
BrainSlugs83

1
Lütfen benim çözümüme bakın, basit ve temiz. Pure JS, ekstra istek yok, harici kitaplık veya eklenti veya başka herhangi bir BS yok.
Cumulo Nimbus

Yanıtlar:


410

Çözümüm belirli bir reklam ağına özgü değil ve çok hafif. Birkaç yıldır üretimde çalıştırıyorum. AdBlock, "reklamlar" kelimesini içeren tüm URL'leri engeller. Ben de öyle yaptım:

Webroot'uma küçük bir js dosyası ekledim ads.js

Bu dosyadaki tek kod satırı

var canRunAds = true;

Sonra sayfamda bir yerde:

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

Ads.js gibi dosyalar, en azından Chrome'daki şu reklam engelleyiciler tarafından engellenir:

  • AdBlock
  • reklam engelleyici artı
  • Adblock Pro
  • Ghostery

2019-02-15 Güncellemesi:

Eklenti artık ads.js adresine yapılan istekleri de engellediği için yukarıdaki listeye Ghostery eklendi. Çok kullanışlı. Bu, Ghostery'nin aslında reklamlarının uzantılarıyla engellenmesini tespit etmemize yardımcı olduğu anlamına mı geliyor?

İle çalışmaz:

Gizlilik Rozeti


1
js/ads.jslütfen tam link verebilir misiniz ? ben blogger olduğum .jsgibi bir yere (Google Drive gibi) yüklemek zorunda kaldı ve bu durumda bağlantı içermiyor ads. Dosyanızın bağlantısını verirseniz gerçekten yardımcı olur.
Deb

91
Dosya yalnızca "var canRunAds = true;" sözcüklerini içerir. sadece kendiniz oluşturun.
zamanlama

5
Bazı reklam engelleyiciler, benim için olduğu gibi, krom için basit bir reklam engelleme olan ads.js dosyasını engellemiyor gibi görünüyor.
Mgamerz

2
Krom için ABP iyi tepki veriyor, bu yüzden her şey düzgün çalışıyor!
Maxime Lafarie

9
Ayrıca, bir reklam engelleyici tarafından engellenen bir URL'de bir ajax isteği çalıştırmayı deneyebilirsiniz. Başarılı olursa, bir reklam engelleyici yoktur, başarısız olursa, bir reklam engelleyici vardır.
SethWhite

138

Doğrudan bir yanıt değil, ancak yüklenecek reklamın arkasındaki mesajı koyardım ... bunun yerine bunu saptamaya çalışmak, reklamın görünmediği zaman görünür.


5
Kullanıcılar yine de Adblock kullanarak bu engellenmiş reklam bildirimlerini engelleyebilir: bildiğim tek kusur bu.
Anderson Green

25
Kolay olabilir, ancak bunu yapmak için uygun bir yol değildir, düzeniniz bozulursa veya reklam yavaşça yüklenirse, kullanıcı onunla ilgili olmayan bir hatayı görebilir. Ayrıca Adblock'un ABP kullanıcılarını hedef alan rahatsız edici iletileri engellemek için önlemler aldığını unutmayın. Kullanıcıdan engellemeyi kaldırma isteğinde bulunmak istiyorsanız, bunu düzen dışında duran basit gizlenebilir bir mesajla yapın (diğer öğeleri dışarı itmez). Bak duckduckgo.com/?q=foo+bar blokunda ile sağladı.
Xeevis

1
@Xeevis - ne arıyorum? - Sanırım AdBlock + zaten duckduckgo'nun ne yaptığını engelliyor.
BrainSlugs83

101

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

JQuery ile:

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

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

Elbette, AdblockNotice.html için bir açılış sayfanız olması gerekir ve .myTestAd sınıfının gerçek reklam kaplarınızı yansıtması gerekir. Ama bu işe yaramalı.

DÜZENLE

TD_Nijboer'ın önerdiği gibi, daha iyi bir yol da :hidden(veya :visibleaşağıda kullandığım gibi) seçiciyi kullanmaktır, böylece display: nonekontrol edilir:

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

Tabii ki, her ikisi de ifistenirse bir blok halinde birleştirilebilir .

visibility: hiddenBunun da (yerleşim alanının kaldığı, ancak reklamın görünmediği) yakalanmayacağını unutmayın . Bunu kontrol etmek için başka bir filtre kullanılabilir:

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

Hangi "görünmez" ( 0teoride herhangi bir sorun olmaktan daha büyük olan) reklam öğeleri bir dizi verecektir .


16
Bu durumda yönlendirme kötü bir fikirdir. Reklamcılık hizmetiniz azalırsa, tüm ziyaretçiler bu sayfaya yönlendirilebilir. Ayrıca belgeye hazır olmak yerine window onload olayını kullanmanızı tavsiye ederim.
Andy E

1
tespit etmenin daha iyi bir yolu $ ('. myTestAd'). is (": hidden"); kılavuzda belirtildiği gibi, genişliğin / yüksekliğin 0 olup olmadığını ve display = none olup olmadığını da algılar.
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.Aslında. Karşı önlemi yenmek için basit bir senaryoyu bir araya getireceklerinden bahsetmiyorum bile. Ayrıca, saldırgan ve güçlü olarak kullanıcıların reklam engelleyicilerini devre dışı bırakmaya motive olacağına gerçekten inanıyor musunuz? Hayır, tüm yapabilecekleri onları kızdırmak ve sitenize karşı ekşi yapmak olacaktır. Çoğu site, düşmanca davranmak yerine bir iletiyi görüntülemeyi tercih eder.
Mart'ta Synetech

Chrome'da bu benim için geçerli değil. DOMReady etkinliğinde, reklam hala görünür görünüyor.
nwellnhof

3
Reklamların devre dışı bırakıldığından, kullanıcıların sadece silahlanma yarışını yükselten sitenize girmelerini engellemeyin. - Onları açmamızı rica ederseniz, bunu yapabiliriz - bizi zorlamaya çalışırsanız, ya sitenize gitmeyi durduracağız ya da reklam engelleyicimizde bir hata bildireceğiz ve siteniz için düzeltildi. - Bu, reklam engelleyicilerin kullanıcıları korumak için var olduğu tam davranış türüdür.
BrainSlugs83

93

Ekstra istek yok. Harici kütüphane yok. Basit, basit 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);

  • Sınıf reklam kutusu ile bir öğe oluşturursunuz (AdBlock Plus'ın tanım dosyasında çıkarılabilir bir öğe olarak tanımlanır)
  • Belgeye ve ofsetini okuduktan kısa bir süre sonra eklersiniz
  • AdBlock yüklüyse, öğenin yüksekliği olmaz.

Kredi Christian Heilmann'ın yazı , bunu arayla AdBlock'u tespit etmek için en iyi çözüm olduğunu düşünüyorum.


5
Aksaklıkları önlemek için ekleyebilir testAd.style.display = 'absolute've ekran dışına taşıyabilirsiniz
Gerald

4
iyi bir çözüm, ama 100ms gecikme muzdarip olanlar için doktor vücuduna böyle bir şey eklemenizi öneririm: <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>(tabii ki css testinden sonra değiştirilmelidir <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 İyi bir nokta. ancak AFAIK, absolutebir positiondeğerdir.
Em Seven

ekleyebilir miyim, ben sadece bu window.onloadişlevi bir fonksiyon içinde eklediğimde çalışan var
Peter Cullen

Bunun Firefox için AdBlock için çalışmadığını unutmayın
Eda190

42

Çoğu reklam dinamik olarak javascript'e yüklenir. Reklam kodunun yüklenip yüklenemediğini tespit etmek için onerror olayını kullandım. Çalışıyor gibi görünüyor.

GoogleAds ile örnek:

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

Bu, bir reklam engelleyicinin içeriği engelleyip engellemediğini görmek için diğer öğelerde de kullanılabilir. Uzak elemanlar yoksa veya ulaşılamazsa bu yöntem yanlış pozitifler üretebilir.


1
Bu reklam yüklenen veya not..because elle tek zamanlarda başarısız edeceğini bloğa engelleyici güvenerek kendi el yazısı yüklenirken olup olmadığını kontrol için en iyi yollardan biridir ..
MaZZly

Bu, dinamik olarak yüklenmiş komut dosyaları için en iyi çözüm gibi görünüyor.
Carca

Yazıldığından beri bir şey değişip değişmediğini bilmiyorum, ancak STANDS krom eklentisi tarafından Fair Adblock ile ateş edemiyorum.
Melchester

Mart 2018 itibariyle, hala en iyi, basit ve kesin çözüm
Daniel Vukasovich

yukarıda belirtildiği gibi adil offsetHeight
adblocker ile çalışmadığı

17

Kullanıcının reklamları engelleyip engellemediğini tespit etmek için tek yapmanız gereken reklam javascriptinde bir işlev bulmak ve test etmeyi denemek. Reklamı engellemek için hangi yöntemi kullandıkları önemli değildir. Google Adsense reklamları için şöyle görünür:

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

Bu yöntem burada özetlenmiştir: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam


8
google_render_ad artık her zaman tanımsız, typeof (window.google_jobrunner)! = 'nesne' benim için çalışıyor.
Dmitrii Korotovskii

4
Kontrol ettiğiniz kod olmadığı için, buna güvenmenin kötü bir fikir olduğunu düşünüyorum, çünkü kütüphanenin bir refactoru komut dosyanızın tüm kullanıcılar için reklam bloğunu algılamasına neden olacaktır.
Patrick Forget

1
typeofnesnenin özelliğini kontrol ederseniz ek yüktür. Basit kullanın === undefined.
Robo Robok

12

JQuery ile en kolay çözüm:

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

advertisement.js hiçbir şey içermiyor. Birisi adblock kullandığında, başarısız olur ve işlev çağrılır.


10

Zaten yeterli cevaplar olduğunu biliyorum, ancak bu soru Google'da konuyla ilgili "reklam engelleme" araması geldiğinden, adsense kullanmamanız durumunda bir fikir vermek istedim .

Özellikle, bu örnekle Firefox Adblock tarafından sağlanan varsayılan Adblock listesinin kullanılıp kullanılmadığını tespit edebilirsiniz. Bu engelleme listesinde CSS kimliğiyle engellenen bir öğe olması avantajlıdır #bottomAd. Sayfaya böyle bir öğe eklerse ve yüksekliğini test edersem, reklam engellemenin etkin olup olmadığını biliyorum:

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

Gerisi her zamanki jQuery şüphelisi ile yapılır:

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

Görüldüğü gibi, setTimeouten az 1 ms zaman aşımı ile kullanıyorum . Bunu çeşitli tarayıcılarda ve çoğu zaman, readyher zaman 0 döndürülen öğeyi doğrudan kontrol ederek test ettim ; reklam engelleyici etkin olsun ya da olmasın. Bununla ilgili iki fikrim vardı: ya oluşturma henüz yapılmadı ya da Adblock henüz devreye girmedi. Daha fazla araştırma yapma zahmetine girmedim.


Bu yanıtı çok seviyorum çünkü ekstra istekte bulunmayı içermiyor sahte ads.js istekleri yerine bu yaklaşım için eksileri var mı?
JeroenVdb

Uzunluk ve yüksekliği test etmek yerine, sadece ($ ("# bottomAd"). (': Hidden')) ... ise kullanamaz mısın?
Evan Langlois

@EvanLanglois, iki yıl önce sorduğunu biliyorum, ama sorunuz aslında beni ilgilendirdi, bu yüzden bilgi için dalış yapmaya gittim. Görünüşe göre,.is(":hidden") kontrol hem yükseklik hem de genişliğin sıfır olup olmadığına bağlıdır. Yüksekliği 0 olarak ayarladıysanız, ancak div hala bir genişlik kaplıyorsa, jQuery tarafından "gizli" olarak kabul edilmez. Yani, söyleyebilseniz de, .is(":hidden")reklam engelleyicinin içeriği yeniden boyutlandırmaya / gizlemeye nasıl karar verdiğine bağlı.
Spencer D

10

Benim tavsiyem: yapma!

İnsanlara "haksızlıkçı" muamelesi yaptığınız herhangi bir senaryo, onların geri dönmesine neden olacaktır.

İşte teklifim.

Sayfanın üstüne (reklamların engellenip engellenmediğine bakılmaksızın) küçük bir göze çarpmayan mesaj ve I *totally* respect your right to block adsbaşlıklı başka bir sayfaya / açılır pencereye bağlantı ekleyin Read more ....

Diğer sayfada, onların bilgisayar olduğunu ve reklam engellemeyi kullanmakta özgür olduklarını anladığınızı açıkça belirtin.

Ayrıca, suçlayıcı olmayan bir şekilde , bu engelleyicilerin kullanımının harika içerik sunmanızı (neden ayrıntılı olarak açıkladığını) zorlaştırdığını ve reklam engellemesinin sitenizde olmamasını tercih ederken, tamamen onların kararı. Engellemeyi kapatmanın pozitiflerine odaklanın.

Şiddetle reklamlara karşı olanlar bunu görmezden gelecekler, ancak onları asla ikna etme şansınız olmadı. Kayıtsız olanlar, dürüstçe beş yaşındaki çocukların münhasır alanı olması gereken "yolumu açayım ya da evime gideceğim" işini yapmadığınız için itirazınız tarafından sallanabilir.

Unutmayın, hiç kimse kafanıza silah tutmadı ve eşyalarınızı ağa koymaya zorladı. Okuyucunuza / kullanıcılarınıza saygılı davranın ve muhtemelen çok sayıda kişinin karşılık vereceğini göreceksiniz.


1
"Görünüşe göre bir reklam engelleyici kullanıyorsunuz. Bu harika! Biz de :) Lütfen arkadaşlarınıza bizden bahsederek X'i destekleyin!"
ADTC

3
heh bir şey bu şekilde para kazanmaya çalışın ... reklamlar düzenli ödeme şekli, bu yüzden kullanıcı ödemek gerekir
dev1223

reklam bloğu açıldığında mizanpajım bozuk mu?
godblessstrawberry

5
Bir web sitesi beni reklam engelleyicimi devre dışı bırakmaya zorluyorsa, devam ediyorum. Kaybediyorlar ve umrumda değil. Google'dan önbelleğe alınmış bir kopyasını aldım.
RayfenWindspear

1
@Tallboy, cevabımda etik yok. Yalnızca hedeflemeye çalıştığınız kitlelerin gerçekliği var. Niyetleriniz açıklandığı gibi olsa da, sorunun yeniden okunması, kullanıcıdan özel olarak reklamları düzenlemesine izin vermesini, mizanpajı veya bazılarını temizlemesini istemenizi gösterecektir. Yani ben yanıtlayan oldu soruydu değil diğer bazı soru sonradan yarım on yıl :-) envisgaged
paxdiablo

9

Google'ın reklam kodunun "iframe" kimliğine sahip bir iframe oluşturduğu gerçeğini kullanıyorlar. Sayfanızda bu kimliğe sahip bir şey olmadığı sürece, bu sizin için de işe yarar.

<p id="ads">
<script type="text/javascript"><!--
google_ad_client = "their-ad-code-here";
/* 160x600, droite */
google_ad_slot = "their-ad-code-here";
google_ad_width = 160;
google_ad_height = 600;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

</p>

<script type="text/javascript"><!--
if(document.getElementsByTagName("iframe").item(0) == null)
{
    document.write("<div style='width:160px; height:600px; padding-top: 280px; margin-left:5px;border:1px solid #000000; text-align:center; font-family:century gothic, arial, helvetica, sans serif;padding-left:5px;padding-right:5px;'>Advertising seems to be blocked by your browser.<br /><br /><span style='font-size:10px'>Please notice that advertising helps us to host the project.<br /><br />If you find these ads intrusive or inappropriate, please contact me.</span><img src='http://www.playonlinux.com/images/abp.jpg' alt='Adblock Plus' /></div>");
}
--></script>

9

Sitenize küçük bir komut dosyası eklemeniz yeterlidir:

var isAdsDisplayed = true;

Adsbygoogle.js adıyla

Sonra aşağıdakileri yapın:

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

Bu çözümü burada buldum


Bu harika bir adam, çok teşekkür ederim 💓
Jodyshop

8

Önceki yorumların test etmek için nesne olarak google adsense kullandığını fark ettim. Bazı sayfalar adsense kullanmaz ve test olarak adsense bloğunu kullanmak gerçekten iyi bir fikir değildir. Adsense bloğu SEO'nuza zarar verebilir. İşte ben adblocker basit bloke sınıf tarafından tespit nasıl örnek:

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", reklam engelleyiciyi engelleyen bir kimliktir. Dolayısıyla, görünür olup olmadığını kontrol ederek reklam engelleyicinin Açık olup olmadığını tespit edebilirsiniz.


7

AdBlock, AdSense (vb.) JavaScript dosyalarının yüklenmesini engelliyor gibi görünüyor. Dolayısıyla, AdSense reklamlarının eşzamansız sürümünü kullanıyorsanız adsbygooglebir Array. Bu, eşzamansız komut dosyası ... eşzamansız olduğundan birkaç saniye sonra kontrol edilmelidir. İşte kaba bir taslak :

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

Açıklığa kavuşturmak için, AdSense eşzamansız reklam kodunun nasıl göründüğüne bir örnek:

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

adsbygoogleDizi olarak başlatılan dikkat edin . adsbygoogle.jsKütüphane içine bu dizi değişiklikleri Object {push: ...}bu yürütüldüğünde. Değişken türünün belirli bir süre sonra kontrol edilmesi, komut dosyasının yüklenip yüklenmediğini size söyleyebilir.


Bu çoğu zaman işe yarayacaktır, ancak bir kullanıcının bağlantısı yavaşsa (mobil cihazları düşünün)?
Luca Steeb

6

Sitemde kullandığım bu yaklaşım, belki de yararlı bulabilirsin. Benim düşünceme göre, bu en basit çözüm.

AdBlocker belirli sınıfları ve html öğelerini engeller, geliştirici konsolundaki engellenen reklamların bu seçicilerini inceleyerek (tümü listelenir) hangi öğelerin her zaman engelleneceğini görebilirsiniz.

Örneğin, stackoverflow'daki bu soru sayfasını inceleyin ve bir sürü engellenmiş reklam göreceksiniz.

Örneğin, bottom-adsınıfı olan herhangi bir öğe otomatik olarak engellenir.

  1. bottom-adSınıf ile boş olmayan bir div öğesi oluşturdum : <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. Sayfa yüklendikten sonra bu öğenin gizli olup olmadığını kontrol edin. JQuery kullandım, ancak javascript kullanmaktan çekinmeyin: $('.bottom-ad').css('display') == "none"veya daha iyi kullanarak$('.bottom-ad').is(':visible')

Değer, trueAdBlocker etkindir.


6

Ekstra bir HTTP isteğine ihtiyacınız yoktur, sadece sahte bir eklentinin yüksekliğini hesaplayabilirsiniz.

Bu arada, burada reklam engelleyicilerin oluşturmayı engellediği öğelerle eşleşen tam bir liste var .

window.adBlockRunning = function() {
    return (getComputedStyle(document.getElementById("detect"))["display"] == "none") ? true : false;
  }()

console.log(window.adBlockRunning);
#detect {
  height: 1px;
  width: 1px;
  position: absolute;
  left: -999em;
  top: -999em
}
<div id="detect" class="ads ad adsbox doubleclick ad-placement carbon-ads"></div>


6

güvenli yol reklamlarınızı içeriye sarmak <div>ve yüksekliğini kontrol etmektir

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

adblock plus ve bluehell güvenlik duvarı ile çalışır.


6

Bir reklam engelinin olup olmadığını kontrol etmenin etkili bir yolu: Google reklamlarının URL'sini tetiklemeye çalışarak reklam engellemenin etkin olup olmadığını kontrol etmeniz yeterlidir. Evetse, callback_has_adblock komutunu çalıştırın, değilse, callback_no_adblock komutunu çalıştırın. Bu çözüm bir talep daha pahalı ama en azından işe yarıyor:

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

Bu çözüm, yalnızca google adsense için değil, her türlü reklam için geçerlidir.


bazı reklam engelleyiciler jQuery'yi engeller, daha sonra komut dosyası çalışmaz, çünkü "$ tanımlanmadı". Daha iyi saf js kullanın.
nyx

3

Bu sorunun yaşına rağmen, son zamanlarda çok yararlı buldum ve bu yüzden sadece başkalarının hala görüntülediğini varsayabilirim. Buraya ve başka bir yere baktıktan sonra, bir reklam engelleyiciyi dolaylı olarak tespit etmek için ana üç istemci tarafının kontrolünün, engellenen div/ img, iframeengellenen kaynakları ve engellenen kaynakları (javascript dosyaları) kontrol etmek olduğunu düşündüm .

Belki üstte veya paranoyaktır, ancak seçimden yalnızca bir veya ikisini engelleyen reklam engelleme sistemlerini kapsar ve bu nedenle yalnızca bir kontrolü yapmış olsanız örtülmemiş olabilir.

Sayfada çek eklenti çalıştırıyorsunuz: (Ben jQuery kullanıyorum)

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="advertisement.js"></script>
<script type="text/javascript" src="abds.js"></script>

ve aşağıdakileri sayfanın başka bir yerine ekleyin:

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

Ben yem adı ile bir div yanı sıra "Advert" metni ve AdSense tarafından kullanılan boyutlarda harici olarak barındırılan bir görüntü kullandı (placehold.it sayesinde!).

In advertisement.jssize daha sonra kontrol edebilirsiniz belgeye şey eklemek gerekir. Her ne kadar eskisi gibi yapıyormuş gibi görünse de, aslında advertisement.jsçıktıyı değil, dosyanın ( ) yüklenmekte olduğunu kontrol ediyorsunuz .

$(document).ready(
{

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

});

Ardından, her şeyi birleştiren reklam engelleyici algılama komut dosyası

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

});

Belge hazır olduğunda , yani işaretleme yüklendiğinde, iframe'i belgeye de ekleriz. Sonra, pencere yüklendiğinde , yani içerik dahil. görüntüler vb yüklü, biz kontrol:

  • İlk test bölümünün boyutları ve görünürlüğü.
  • İkinci test div'in içeriğinin " engellenmiş" olması, engellenmemiş olması durumunda advertimsent.jsolduğu gibi .
  • İframe'in boyutları (ve gizli bir nesnenin yüksekliği veya genişliği olmadığı için görünürlük sanırım)

Ve stiller:

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

div#myTestAd2
{
    display: none;
}

Bu yardımcı olur umarım


3

Yeni AdSense kodunu kullanıyorsanız, içeriğe veya css kontrollerine başvurmaksızın kolay bir kontrol yapabilirsiniz.

İşaretlemenize reklamlarınızı normal şekilde yerleştirin:

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

O zaman en adsense kodunu çağrı alt sayfanız (not ait olmayan kullanmak "async"çağrılırken bayrağı adsbygoogle.jskomut dosyası):

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

Sonra bu küçük kod snippitini bunun altına ekleyin:

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

AdSense hep / oluşturur bayrağı ayarlar adsbygoogle.loadediçin truereklamlar yüklendiğinde, bir kaç saniye çeki geciktirmek için bir setTimeout işlevi işareti koyun olabilir.


2
Bu elbette reklamların nasıl engellendiğine bağlıdır . Reklam engelleme yazılımınız AdSense'in tamamen yüklenmesini engelliyorsa, bu işe yarayacaktır. Ancak reklam engelleme yazılımınız, CSS display özelliğini "none" veya ilgili div'in yüksekliğini 0 olarak ayarlamak gibi bir şey yapıyorsa, bu işe yaramayabilir.
Bangkokian

Doğru. Tüm reklam bloklarının% 100'ünü yakalamanın kolay bir yolu olduğunu düşünmüyorum, ancak en azından bazılarını yakalayabilirsiniz.
Troy Morehouse

3

Çoğu adblocker öğeye HTTP isteğini iptal eder ads.jsve 0pxöğe için yapar, ancak bazen bir adblocker DOM'u kaldırmıştır ve öğenin varlığını denetlemediği için yukarıdaki bazı yanıtlar başarısız olur.

Kullanmak setTimeout()iyi bir uygulamadır, çünkü onsuz, komut dosyası adblocker ile yarışacaktır.

Aşağıdaki komut dosyası dom'un var olup olmadığını / kaldırıldığını ve offsetHeightvarsa bir öğeyi kontrol edecektir.

setTimeout(function() {
  var a = document.querySelector('.showads'),
    b = a ? (a.offsetHeight ? false : true) : true;
  console.log('ads blocked?', b)
}, 200); // don't too fast or will make the result wrong.
<div class="ads showads">
  Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</div>


2

Yukarıdaki yanıtların tümü geçerlidir, ancak çoğu DNS düzeyinde reklam engelleme için çalışmaz.

DNS düzeyinde reklam engelleyiciler ( pi-hole gibi ) temel olarak bir reklam engelleme alanlarının listesi için NXDOMAIN (alan adı mevcut değildir) döndürür (ör. Telemetry.microsoft.com mevcut olduğunda "mevcut değildir").

Bunu atlatmanın birkaç yolu vardır:

Yöntem A : Alan adına göre değil, IP adresine göre reklam isteği.

Bu yöntem, ip adreslerini takip etmek zorunda kalacağınız için biraz can sıkıcıdır. Kodunuz iyi korunmazsa veya düzenli olarak güncellenmezse bu sorunlu olacaktır.

Yöntem B : İstemci NXDOMAIN bildiriyor olsa bile başarısız olan tüm istekleri engelleyin.

Bu "meşru" bir NXDOMAIN ise kullanıcılar için çok can sıkıcı olacaktır.


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>

ve getbanner.cfm dosyasında:

adb = false;

Bence adblock'u tespit etmenin en kolay yolu.


engellenen diğer dosyalar: easylist-downloads.adblockplus.org/easylist.txt varsayılan AdBlock filtresidir
mikas

adb trueher zaman gibi görünüyor
Deb

1

Benim için işe yarayan buydu:

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

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

Sadece denedim; çalışmıyor. Hiçbir reklam engelleme yazılımı yüklü olmasa bile her zaman true değerini döndürür.
ecnepsnai

Bunun yalnızca AdSense kullandığınız bir sayfada çalışacağını unutmayın. Aksi takdirde her zaman true değerini döndürür, çünkü bu doğru yanıttır - window.google_jobrunner hiçbir sayfada ve tüm sayfalarda algılanmayacaktır. Yalnızca Google AdSense'i kullananlar. : Aslında sitemde bu kod çalışma görebilirsiniz ruddl.com
jesal

Yöntemin HowToGeek tarafından kullanılanla aynı mesajı kullanması ilginçtir . Kayıt için, bir mesaj kutusu görüntülemek, sitenize karşı rahatsız edici ve ekşi kullanıcılar dışında hiçbir şey yapmaz; çoğu site sayfada bir ileti görüntülemeyi tercih eder (HTG her ikisini de yapmaya çalışır, ancak yalnızca can sıkıcı pop-up çalışır).
Mart'ta Synetech

1

Bunun zaten cevaplandığını biliyorum, ancak önerilen örnek siteye baktım ve bunu böyle yaptıklarını görüyorum:

<script type="text/javascript">
if(document.getElementsByTagName("iframe").item(0) == null) {
    document.write("<div style="width: 160px; height: 600px; padding-top: 280px; margin-left: 5px; border: 1px solid #666666; color: #FFF; background-color: #666; text-align:center; font-family: Maven Pro, century gothic, arial, helvetica, sans-serif; padding-left: 5px; padding-right: 5px; border-radius: 7px; font-size: 18px;">Advertising seems to be blocked by your browser.<br><br><span style="font-size: 12px;">Please notice that advertising helps us to host the project.<br><br>If you find these ads intrusive or inappropriate, please contact me.</span><br><img src="http://www.playonlinux.com/images/abp.png" alt="Adblock Plus"></div>");
};
</script>

1

Zaman aşımına ve DOM kokusuna gerek yoktur. Popüler reklam ağlarından bir komut dosyası yüklemeyi deneyin ve reklam engelleyicinin HTTP isteğini yakalayıp yakalamadığını görün.

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

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

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

detectAdBlockerAsync('http://ads.pubmatic.com/AdServer/js/gshowad.js', function(){
    document.body.style.background = '#c00';
});

1

Bunu çözmek için kendi "eklentimi" oluşturdum ve gerçekten iyi çalışıyor:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

Mobil uyumluluk ve diğer şeylerin yanı sıra jsBlocking algılama ekledim ... (Kullanıcılara adBlocking / jsBlocking'i devre dışı bırakmalarını isteyen bir bindirme gibi yazılımını ); Ayrıca duyarlı dostu yaptı.

Coffeeware Lisansı altında açılır .


Çaba için teşekkür ederiz, ancak en azından bu yorumu yazarken ... adblock ile çalışmıyor gibi görünüyor.
arunskrish

adBlock ile çalışır, bu eklentiyi uyguladığım bir site calyphrox.net'tir, burada herkes gerçekten eklentinin çalıştığını doğrulayabilir.
Jmlevick

3
Bağlantı Öldü ... Bunu kaldırabilir miyiz?
Evan Langlois

2
Lütfen bağlantıları güncelleyin, bu kötü bir cevap veriyor.
Yazan Rawashdeh

0

Gerginliğinizi anlıyorum ve öğenin komut dosyası tarafından oluşturulup oluşturulmadığını veya öğe gizli olup olmadığını kontrol edebilirsiniz. Reklam engelleme hakkında konuşursak, öğenin varlığına değil yalnızca öğenin görünürlüğüne güvenebilirsiniz.

Üçüncü taraf komut dosyasıyla oluşturulan öğe hiçbir zaman mevcut olmaz; komut dosyası şu anda erişilemezse (DNS hatası, uzak web sunucusu hatası, çevrimdışı web sayfası önyüklemesi, vb.) Ve her zaman yanlış pozitif olur.

Kontrollerle ilgili diğer tüm cevaplar doğrudur, ancak bunu aklınızda bulundurun.


0

timing's cevap güzel düşünülmüş ama artık çalışmıyor, bu yüzden js dosyasının adını 'reklamlardan' adsense 'olarak güncelledim ve bir cazibe gibi geri çalışıyor!

İşte kod, belki bu birine yardım edecek:

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

Js dosyasında sadece bu satırı koyun: var adblockDetecter = true;


0

Şimdi bunu AdBlock Detector adlı basit bir JS komut dosyası kullanarak yapmanın daha iyi bir yolu var
İşte nasıl kullanılacağı: Bunu bölümünüze
ekleyin <head>:

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

Artık ab-messagekimliği AdBlock kullanıcılarına bir mesaj görüntülemek istediğiniz her yerde kullanabilirsiniz :

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

Başlangıçta gizlemek için eklenen satır içi stile dikkat edin (Elbette bunu kendi CSS dosyanızdan da yapabilirsiniz).
Ayrıca 500 ms sürdüğünü de unutmayın, çünkü reklam engelleyicinin işini yapmasını beklemesi gerekir, aksi takdirde çalışmaz.

Bu komut dosyasının nasıl çalıştığına dair küçük bir açıklama

İlk olarak, rastgele oluşturulmuş bir bağlantının kaynağına sahip bir iframe ekler. (Bazı reklam blokları akıllı olduğu için rastgele oluşturulur, bir noktada bir bağlantının sahte olduğunu fark ederler).
Ardından, bu iframe üzerinde birden fazla kontrol gerçekleştirir (başarıyla yüklendiyse veya stili değiştirildiyse). Bu testlerden biri doğruysa,ab-message öğeyi kullanıcıların engellenmesi için .

Bu komut dosyası (tümü olmasa da) çoğu reklam engelleyici için çalışır.

EKSTRA

Hiçbir nokta, gerçekten, sadece bir özü yaratabilirdi, ama bunun yerine bir Github projesi oluşturdum, ama yine de, kontrol et ve sana yardım ederse yıldız ver.
abDetector: Basit vanilya JavaScript AdBlock Dedektörü.
Zevk almak.


Kötü çözüm. Harici bir .js dosyası kolayca engellenir.
Bangkokian

@Bangkokian Sadece kopyalayın ve javascript dosyasını veya index.js'yi (ya da her neyse) gösteren iletinize referans (ve lisansı).
BlueEyesWhiteDragon

1
@BlueEyesWhiteDragon Doğru. Ama Troy'un asıl cevabı bu değildi. Şu anda satır içi bir komut dosyası göstermek için% 100 düzenlendi. Benim yorumum duruyor. Orijinal cevabı özellikle harici bir senaryo kullanmaktı. stackoverflow.com/posts/34738388/revisions
Bangkokian

@Bangkokian tam olarak, yorumunuz sayesinde cevabımı SO yönergelerini takip etmek için düzenlediğimi ve satır içi bir senaryo haline getirdiğimi belirtmeyi unuttum. Teşekkür ederim.
Nick Rameau

0

Bunu kontrol edebilirsiniz -adblocker tespit yardımcı olabilir

Zamanlama cevabının uygulanması

Bunu kafa etiketindeki herhangi bir komut dosyasından önce ekleyin:

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

Sonra kullanın:

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

Çalışmıyor. Her zaman reklamın engellendiğini gösterir.
Himanshu Aggarwal

değerini kontrol window.adblockero dönerseniz sizin tarayıcı konsoluna truesonra AdBlocker onu dönecektir aksi etkindir falsetam dokümantasyon kontrol edebilirsiniz algılamak-AdBlocker
Mustafa Dwekat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.