Bagaimana cara mendeteksi Adblock di situs web saya?

370

Saya ingin dapat mendeteksi apakah pengguna menggunakan perangkat lunak adblocking ketika mereka mengunjungi situs web saya. Jika mereka menggunakannya, saya ingin menampilkan pesan yang meminta mereka untuk mematikannya untuk mendukung proyek, seperti yang dilakukan situs web ini.

Jika Anda masuk ke situs itu dan browser Anda mengaktifkan beberapa jenis perangkat lunak adblock, maka situs tersebut bukannya menampilkan iklan yang sebenarnya menunjukkan spanduk kecil yang memberi tahu pengguna bahwa pendapatan iklan digunakan untuk hosting proyek dan mereka harus mempertimbangkan mematikan Adblock .

Saya ingin melakukannya di situs web saya, saya menggunakan iklan adsense di atasnya, Bagaimana saya bisa melakukannya?

Jmlevick
sumber
2
kemungkinan duplikat dari perangkat lunak Mendeteksi AdBlocking?
416E64726577
5
Untuk pengguna yang mencari solusi terbaru, ketahuilah bahwa ada solusi pluggable komprehensif yang tersedia di github.com/sitexw/BlockAdBlock
yeaske
5
Beberapa orang tidak suka dianalisis dan diiklankan di web. Beberapa situs yang saya kunjungi, memberi tahu kami bahwa pendapatan mendukung proyek mereka, begitu macet dalam iklan sehingga menjadi konyol.
Paul
7
Sekarang situs semakin sering melakukan ini (dan menyalahgunakannya, dan berbohong kepada kami tentang iklan mereka yang tidak mengganggu, dan memaksa kami untuk memasukkan semua situs mereka ke dalam daftar putih hanya untuk memasukkan ...) - Apakah ada ekstensi atau trik yang dapat kita gunakan untuk mencegah mereka mendeteksi kami menggunakan AdBlock +? - Saya tidak keberatan melihat beberapa iklan spanduk bertarget di sini atau di sana, tetapi klik jacking, dan munculan video layar penuh yang konstan bukanlah hal yang saya sukai.
BrainSlugs83
1
Silakan lihat solusi saya, ini sederhana dan bersih. JS murni, tidak ada permintaan tambahan, tidak ada perpustakaan atau plugin eksternal atau BS lainnya.
Cumulo Nimbus

Jawaban:

410

Solusi saya tidak spesifik untuk jaringan iklan tertentu dan sangat ringan. Saya sudah menjalankannya dalam produksi selama beberapa tahun. AdBlock memblokir semua URL yang mengandung kata "iklan". Jadi ini yang saya lakukan:

Saya menambahkan file js kecil ke webroot saya dengan nama ads.js

Ini adalah satu-satunya baris kode dalam file itu

var canRunAds = true;

Kemudian di suatu tempat di halaman saya:

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

File seperti ads.js diblokir oleh setidaknya adblocker ini di Chrome:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • Ghostery

Pembaruan pada 2019-02-15:

Menambahkan Ghostery dalam daftar di atas karena ekstensi sekarang juga memblokir permintaan ke ads.js. Sangat berguna. Apakah ini berarti Ghostery benar-benar membantu kami para devs untuk mendeteksi pemblokiran iklan dengan ekstensi mereka?

Tidak bekerja dengan:

Badger Privasi

waktu
sumber
1
dapatkah Anda memberikan tautan lengkap js/ads.jstolong? karena saya di blogger saya harus mengunggah di .jssuatu tempat (seperti: Google Drive) dan tautan dalam hal itu tidak mengandung ads. Akan sangat membantu jika Anda memberikan tautan file Anda.
Deb
91
File hanya berisi kata-kata "var canRunAds = true;" jadi buat saja sendiri.
waktu
5
Beberapa pemblokir iklan tampaknya tidak memblokir file ads.js, seperti bagi saya, adblock sederhana untuk chrome.
Mgamerz
2
ABP untuk chrome bereaksi dengan baik, jadi semuanya bekerja dengan baik!
Maxime Lafarie
9
Anda juga dapat mencoba menjalankan permintaan ajax pada URL yang diblokir oleh adblocker. Jika berhasil, tidak ada adblocker, jika gagal, ada adblocker.
SethWhite
138

Bukan jawaban langsung, tapi saya meletakkan pesan di belakang iklan untuk dimuat ... daripada mencoba untuk mendeteksinya, itu hanya akan muncul ketika iklan tidak.

mavrck
sumber
5
Pengguna masih dapat memblokir pemberitahuan iklan yang diblokir ini menggunakan Adblock: itulah satu-satunya kelemahan yang saya ketahui.
Anderson Green
25
Ini mungkin mudah tetapi itu bukan cara yang tepat untuk melakukannya, jika tata letak Anda terdistorsi atau memuat iklan dengan lambat, pengguna dapat melihat sekilas kesalahan yang tidak berhubungan dengannya. Perlu diketahui juga bahwa Adblock mengambil langkah-langkah untuk memblokir pesan-pesan mencolok yang ditargetkan pada pengguna ABP. Jika Anda ingin meminta pengguna untuk tidak membuka blokir, lakukan itu melalui pesan sederhana yang dapat disembunyikan yang berada di luar tata letak (tidak mendorong elemen lain menjauh). Lihatlah duckduckgo.com/?q=foo+bar dengan adblock diaktifkan.
Xeevis
1
@Xeevis - apa yang saya cari? - Saya pikir AdBlock + sudah memblokir apa pun yang dilakukan duckduckgo.
BrainSlugs83
101

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

Dengan jQuery:

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

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

Tentu saja, Anda harus memiliki halaman arahan untuk AdblockNotice.html, dan kelas .myTestAd perlu mencerminkan wadah iklan Anda yang sebenarnya. Tetapi ini seharusnya berhasil.

EDIT

Seperti yang direkomendasikan TD_Nijboer, cara yang lebih baik adalah menggunakan :hidden:visible pemilih (atau , seperti yang saya gunakan di bawah) sehingga display: nonejuga diperiksa:

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

Tentu saja, kedua hal ini dapat digabungkan menjadi satu ifblok jika diinginkan.

Perhatikan bahwa visibility: hiddentidak akan ditangkap juga (tempat ruang tata letak tetap, tetapi iklan tidak terlihat). Untuk memeriksanya, filter lain dapat digunakan:

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

Yang akan memberi Anda serangkaian elemen iklan yang "tidak terlihat" (dengan 0teori yang lebih besar daripada masalah, secara teori).

Jared Farrish
sumber
16
Mengarahkan kembali dalam kasus ini adalah ide yang buruk. Jika layanan iklan Anda turun, semua pengunjung dapat diarahkan ke halaman itu. Saya juga merekomendasikan menggunakan event window onload daripada dokumen siap.
Andy E
1
cara mendeteksi yang lebih baik adalah $ ('. myTestAd'). is (": hidden"); seperti yang ditentukan manual juga mendeteksi apakah lebar / tinggi adalah 0 dan jika tampilan = tidak ada.
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.Memang. Belum lagi bahwa mereka hanya akan menyusun naskah sederhana untuk mengalahkan langkah balasan. Selain itu, apakah Anda benar-benar yakin bahwa dengan menjadi agresif dan kuat bahwa pengguna akan termotivasi untuk menonaktifkan pemblokir iklan mereka? Tidak, semua itu akan membuat mereka kesal dan membuat mereka kesal terhadap situs Anda. Sebagian besar situs memilih untuk hanya menampilkan pesan daripada bermusuhan.
Synetech
Ini tidak berfungsi untuk saya di Chrome. Dalam acara DOMReady, iklan tampaknya masih terlihat.
nwellnhof
3
Harap jangan mencegah pengguna memasuki situs Anda karena iklan mereka dinonaktifkan - yang hanya meningkatkan perlombaan senjata. - Jika Anda meminta kami untuk menyalakannya, kami mungkin akan melakukannya - jika Anda mencoba memaksa kami, kami akan berhenti mengunjungi situs Anda, atau kami akan melaporkan bug pada adblocker kami, dan dapatkan itu diperbaiki untuk situs Anda. - Ini adalah tipe perilaku yang pasti ada untuk melindungi pengguna dari adblocker.
BrainSlugs83
93

Tidak ada permintaan tambahan. Tidak ada perpustakaan eksternal. JavaScript yang sederhana dan sederhana:

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

  • Anda membuat elemen dengan kotak iklan kelas (sebagaimana didefinisikan sebagai elemen yang dapat dilepas di file definisi AdBlock Plus)
  • Anda menambahkannya ke dokumen dan setelah beberapa saat Anda membaca offsetHeight-nya
  • Jika AdBlock diinstal, elemen tidak akan memiliki ketinggian.

Kredit ke posting Christian Heilmann ini , saya pikir itu jauh solusi terbaik untuk mendeteksi AdBlock.

Cumulo Nimbus
sumber
5
Untuk mencegah gangguan, Anda dapat menambahkan testAd.style.display = 'absolute'dan memindahkannya dari layar
Gerald
4
solusi yang bagus, tetapi bagi mereka yang menderita keterlambatan 100 ms saya sarankan menambahkan sesuatu seperti ini ke dokumen doc: <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>(tentu saja setelah pengujian css harus diubah menjadi <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
@ Emerald Poin bagus. tapi AFAIK, absoluteadalah sebuah positionnilai.
Em Seven
bisakah saya menambahkan, saya hanya mendapatkan solusi ini berfungsi ketika saya menambahkannya dalam suatu window.onloadfungsi
Peter Cullen
Perhatikan bahwa ini tidak berfungsi untuk AdBlock untuk Firefox
Eda190
42

Sebagian besar iklan dimuat secara dinamis dalam javascript. Saya hanya menggunakan acara onerror untuk mendeteksi apakah skrip iklan dapat dimuat atau tidak. Tampaknya bekerja.

Contoh dengan GoogleAds:

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

Ini dapat digunakan pada elemen lain juga untuk melihat apakah pemblokir iklan memblokir konten. Metode ini dapat menghasilkan false positive jika elemen jarak jauh tidak ada atau tidak dapat dijangkau.

JonMayer
sumber
1
Ini adalah salah satu cara terbaik untuk memeriksa apakah iklan dimuat atau tidak..karena memuat skrip Anda sendiri secara manual dengan mengandalkan pemblokir untuk memblokir yang satu itu akan gagal pada suatu waktu ..
MaZZly
Ini tampaknya menjadi solusi terbaik untuk skrip yang dimuat secara dinamis.
Carca
Tidak tahu apakah ada sesuatu yang berubah sejak ini ditulis, tetapi saya tidak bisa mengaktifkan api dengan Adblock Adil oleh STANDS plug-in chrome.
Melchester
pada Maret 2018, masih solusi terbaik, sederhana dan pasti
Daniel Vukasovich
seperti dikatakan di atas itu tidak bekerja dengan adblocker yang adil, lebih baik untuk memeriksaoffsetHeight
cieunteung
17

Untuk mendeteksi apakah pengguna memblokir iklan, yang harus Anda lakukan adalah menemukan fungsi di javascript iklan dan mencoba mengujinya. Tidak masalah metode apa yang mereka gunakan untuk memblokir iklan. Begini tampilannya untuk iklan Google Adsense:

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

Metode ini diuraikan di sini: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam

Pesolek
sumber
8
google_render_ad sekarang tidak ditentukan kapan saja, typeof (window.google_jobrunner)! = 'objek' cocok untuk saya.
Dmitrii Korotovskii
4
Karena ini bukan kode yang Anda kontrol, saya pikir ini ide yang buruk untuk mengandalkan ini, karena refactor perpustakaan akan menyebabkan skrip Anda mendeteksi blok iklan untuk semua pengguna.
Patrick Lupakan
1
typeofadalah overhead jika Anda memeriksa properti objek. Gunakan yang sederhana === undefined.
Robo Robok
12

Solusi termudah saya dengan jquery adalah:

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

advertisement.js tidak mengandung apa-apa. Ketika seseorang menggunakan adblock, itu gagal dan fungsinya dipanggil.

Luca Steeb
sumber
10

Saya tahu sudah ada jawaban yang cukup, tetapi karena pertanyaan ini muncul di Google mencari "deteksi adblock" pada topik, saya ingin memberikan beberapa wawasan jika Anda tidak menggunakan adsense .

Khususnya, dengan contoh ini Anda dapat mendeteksi apakah daftar Adblock default yang disediakan oleh Firefox Adblock digunakan. Dibutuhkan keuntungan bahwa dalam daftar blokir ini ada elemen yang diblokir dengan id CSS #bottomAd. Jika saya memasukkan elemen seperti itu di halaman dan menguji tingginya, saya tahu apakah adblocking aktif atau tidak:

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

Sisanya dilakukan melalui tersangka jQuery yang biasa:

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

Seperti yang bisa dilihat, saya menggunakan setTimeoutsetidaknya 1ms. Saya telah menguji ini pada berbagai browser dan sebagian besar waktu, secara langsung memeriksa elemen di readyselalu kembali 0; tidak masalah apakah adblocker aktif atau tidak. Saya punya dua ide tentang ini: rendering belum selesai atau Adblock belum masuk. Saya tidak repot-repot menyelidiki lebih lanjut.

menandai
sumber
Saya sangat suka jawaban ini karena tidak melibatkan membuat permintaan tambahan apakah ada kontra untuk pendekatan ini bukan permintaan ads.js palsu?
JeroenVdb
Alih-alih menguji panjang dan tinggi, tidak bisakah Anda menggunakan if ($ ("# bottomAd"). Is (': hidden')) ...?
Evan Langlois
@ EvanLanglois, saya tahu Anda bertanya dua tahun lalu, tetapi pertanyaan Anda benar-benar membuat saya tertarik, jadi saya mencari informasi tentang itu. Rupanya, itu .is(":hidden")tergantung pada apakah tinggi dan lebar adalah nol. Jika Anda hanya mengatur tinggi ke 0, tetapi div masih menempati lebar, maka itu tidak dianggap "disembunyikan" oleh jQuery. Jadi, apakah Anda dapat mengatakan, .is(":hidden")agak tergantung pada bagaimana adblocker memutuskan untuk mengubah ukuran / menyembunyikan konten.
Spencer D
10

Saran saya adalah: jangan lakukan itu!

Setiap skenario di mana Anda memperlakukan orang sebagai "orang yang salah" akan mengakibatkan mereka membalas.

Ini proposal saya.

Letakkan pesan kecil yang tidak mengganggu di bagian atas halaman (terlepas dari apakah iklan diblokir) dengan teks I *totally* respect your right to block adsdan tautan ke halaman lain / sembulan yang berjudulRead more ... .

Di halaman lain, jelaskan bahwa Anda memahami itu komputer mereka dan mereka bebas menggunakan pemblokiran iklan.

Juga membuatnya jelas dengan cara yang tidak menuduh bahwa penggunaan pemblokir ini membuat Anda lebih sulit untuk mengirimkan konten yang hebat (menjelaskan mengapa secara rinci) dan itu, sementara Anda lebih suka pemblokiran iklan tidak terjadi di situs Anda, itu sepenuhnya keputusan mereka. Fokus pada hal positif dari mematikan pemblokiran.

Mereka yang menentang keras iklan akan mengabaikan ini, tetapi Anda tidak pernah memiliki kesempatan untuk meyakinkan mereka. Mereka yang acuh tak acuh mungkin akan terombang-ambing oleh banding Anda karena Anda tidak melakukan semuanya "biarkan saya mengambil jalan saya atau saya akan mengambil bola saya dan pulang" hal yang jujur ​​harus menjadi domain eksklusif anak-anak berusia lima tahun.

Ingat, tidak ada yang memegang pistol di kepala Anda dan memaksa Anda untuk meletakkan barang-barang Anda di internet. Perlakukan pembaca / pengguna Anda dengan hormat dan Anda mungkin akan menemukan banyak dari mereka akan membalas.

paxdiablo
sumber
1
Bagaimana dengan "Sepertinya Anda menggunakan pemblokir iklan. Itu keren! Kami juga :) Tolong dukung X dengan memberi tahu teman-teman Anda tentang kami!"
ADTC
3
heh mencoba memonetisasi sesuatu dengan cara ini ... iklan adalah cara pembayaran yang teratur, jadi pengguna harus membayar
dev1223
bagaimana dengan tata letak saya yang rusak ketika adblock dihidupkan?
godblessstrawberry
5
Jika situs web memaksa saya untuk menonaktifkan pemblokir iklan saya, saya melanjutkan. Mereka kalah, dan saya tidak peduli. Saya baru saja mengambil salinan cache dari Google.
RayfenWindspear
1
@ Tallboy, tidak ada etika dalam jawaban saya. Hanya ada realitas khalayak yang ingin Anda targetkan. Dan, meskipun niat Anda mungkin seperti yang dijelaskan, membaca ulang pertanyaan akan menunjukkan kepada Anda bahwa itu adalah khusus untuk meminta pengguna mengizinkan iklan, bukan membersihkan tata letak atau semacamnya. Itulah pertanyaan yang saya jawab, bukan pertanyaan lain yang diperkirakan setengah dekade kemudian :-)
paxdiablo
9

Mereka memanfaatkan fakta bahwa kode iklan Google menciptakan iframe dengan id "iframe". Jadi selama Anda belum memiliki sesuatu di halaman Anda dengan ID itu, ini akan bekerja untuk Anda juga.

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

Cukup tambahkan skrip kecil di situs Anda:

var isAdsDisplayed = true;

Dengan nama adsbygoogle.js

Kemudian lakukan hal berikut:

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

Temukan solusi ini di sini

druss
sumber
Ini pria yang luar biasa, terima kasih banyak 💓
Jodyshop
8

Saya perhatikan komentar sebelumnya menggunakan google adsense sebagai objek untuk menguji. Beberapa halaman tidak menggunakan adsense, dan menggunakan blok adsense sebagai ujian bukanlah ide yang baik. Karena blok adsense dapat membahayakan SEO Anda. Berikut adalah contoh bagaimana saya mendeteksi kelas sederhana yang diblokir oleh adblocker:

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" adalah ID yang blok adblocker. Jadi, periksa apakah terlihat Anda dapat mendeteksi apakah adblocker dihidupkan.

Roman Losev
sumber
7

AdBlock tampaknya memblokir pemuatan file JavaScript AdSense (dll). Jadi, jika Anda menggunakan versi iklan AdSense yang tidak sinkron, Anda dapat memeriksa apakah adsbygoogleada Array. Ini harus diperiksa setelah beberapa detik karena skrip asinkronnya adalah ... asinkron. Berikut ini garis besarnya :

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

Untuk memperjelas, berikut adalah contoh tampilan kode iklan asinkron 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>

Perhatikan bahwa adsbygooglediinisialisasi sebagai Array. The adsbygoogle.jslibrary perubahan array ini ke Object {push: ...}ketika dijalankan. Memeriksa jenis variabel setelah waktu tertentu dapat memberi tahu Anda jika skrip dimuat.

Salman A
sumber
Ini akan bekerja paling lama tetapi bagaimana jika pengguna memiliki koneksi yang lambat (pikirkan perangkat seluler)?
Luca Steeb
6

Pendekatan ini saya gunakan di situs saya, mungkin Anda akan merasa terbantu. Menurut pendapat saya, itu adalah simpliest solusi.

AdBlocker memblokir kelas dan elemen html tertentu, dengan memeriksa pemilih ini dari semua iklan yang diblokir di konsol pengembang (semuanya terdaftar), Anda dapat melihat elemen mana yang akan selalu diblokir.

Misalnya, cukup periksa halaman pertanyaan ini pada stackoverflow dan Anda akan melihat banyak iklan yang diblokir.

Misalnya, setiap elemen dengan bottom-adkelas diblokir secara otomatis.

  1. Saya membuat elemen div non-kosong dengan bottom-adkelas: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. Setelah pemuatan halaman, periksa apakah elemen ini disembunyikan. Saya menggunakan jQuery, tetapi merasa bebas untuk menggunakan javascript: $('.bottom-ad').css('display') == "none"atau bahkan lebih baik dengan menggunakan$('.bottom-ad').is(':visible')

Jika nilainya true, maka AdBlocker aktif.

NGix
sumber
6

Anda tidak perlu permintaan HTTP tambahan, Anda cukup menghitung tinggi dari add palsu.

Ngomong-ngomong, berikut adalah daftar lengkap yang cocok dengan elemen-elemen yang dihindari oleh adblockers.

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

cara yang aman adalah membungkus iklan Anda di dalam <div>dan memeriksa tingginya

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

ini bekerja dengan adblock plus dan bluehell firewall.

uingtea
sumber
6

Cara yang efisien untuk memeriksa apakah ada adblock: Cukup periksa apakah ada adblock yang diaktifkan dengan mencoba memicu URL iklan google. Jika ya maka jalankan callback_has_adblock, jika tidak maka jalankan callback_no_adblock. Solusi ini lebih mahal satu permintaan tetapi setidaknya berhasil:

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

Solusi ini berfungsi untuk semua jenis iklan, tidak hanya google adsense.

John Skoumbourdis
sumber
beberapa adblockers memblokir jQuery, maka skrip tidak berjalan karena "$ tidak didefinisikan". Lebih baik gunakan js murni.
nyx
3

Terlepas dari usia pertanyaan ini, saya baru-baru ini merasa sangat berguna dan karena itu hanya dapat berasumsi ada orang lain yang masih melihatnya. Setelah mencari di sini dan di tempat lain saya menduga bahwa tiga sisi utama klien memeriksa secara tidak langsung mendeteksi pemblokir iklan adalah untuk memeriksa diblokir div/ img, diblokiriframe , dan diblokir sumber daya (file javascript).

Mungkin itu di atas atau paranoid tetapi mencakup untuk sistem pemblokiran iklan yang hanya memblokir satu atau dua dari seleksi dan karenanya mungkin tidak tercakup seandainya Anda hanya melakukan satu pemeriksaan.

Pada halaman Anda menjalankan cek tambahkan: (Saya menggunakan 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>

dan tambahkan berikut ini di tempat lain di halaman:

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

Saya menggunakan div dengan nama umpan serta gambar yang dihosting secara eksternal dengan teks "Iklan" dan dalam dimensi yang digunakan oleh AdSense (terima kasih kepada placehold.it!).

Dalam advertisement.jsAnda harus menambahkan sesuatu ke dokumen yang dapat kita periksa nanti. Meskipun sepertinya Anda melakukan hal yang sama seperti sebelumnya, Anda sebenarnya memeriksa file ( advertisement.js) itu sendiri sedang dimuat, bukan output.

$(document).ready(
{

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

});

Dan kemudian script deteksi pemblokir iklan yang menggabungkan semuanya

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

});

Ketika dokumen sudah siap , yaitu markup dimuat, kami juga menambahkan iframe ke dokumen. Kemudian, ketika jendela dimuat , yaitu konten termasuk. gambar dll dimuat, kami memeriksa:

  • Dimensi dan visibilitas div tes pertama.
  • Bahwa isi dari div tes kedua adalah "cek", karena itu akan menjadi jika advertimsent.jsitu tidak diblokir.
  • Dimensi (dan saya kira visibilitas, sebagai objek tersembunyi tidak memiliki tinggi atau lebar?) Iframe

Dan gaya:

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

div#myTestAd2
{
    display: none;
}

Semoga ini membantu

Luke S
sumber
3

Jika menggunakan kode AdSense baru, Anda dapat melakukan pemeriksaan mudah, tanpa menggunakan konten atau cek css.

Tempatkan iklan Anda seperti biasa di markup Anda:

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

Kemudian Anda memanggil kode adsense di bagian bawah halaman Anda (perhatikan jangan menggunakan "async"bendera saat memanggil adsbygoogle.jsskrip):

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

Kemudian tambahkan potongan kecil kode di bawah ini:

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

AdSense selalu menciptakan / set bendera adsbygoogle.loadeduntuk truesaat iklan dimuat, Anda dapat menempatkan cek dalam fungsi setTimeout untuk menunda pemeriksaan oleh beberapa detik.

Troy Morehouse
sumber
2
Ini tentu saja tergantung pada bagaimana iklan diblokir. Jika perangkat lunak adblocking Anda mencegah AdSense untuk memuat semuanya, ini akan berfungsi. Tetapi jika perangkat lunak adblocking Anda melakukan sesuatu seperti menyetel properti tampilan CSS ke "tidak ada" atau ketinggian div masing-masing ke 0, maka ini mungkin tidak berfungsi.
Bangkok
Benar. Saya tidak berpikir ada cara mudah untuk menangkap 100% dari semua adblock, tetapi setidaknya Anda dapat menangkap beberapa dari mereka.
Troy Morehouse
3

Sebagian besar adblocker membatalkan permintaan HTTP ke ads.jsdan membuat 0pxelemen, tetapi adblocker terkadang menghapus DOM , dan beberapa jawaban di atas akan gagal karena tidak memeriksa keberadaan elemen.

Menggunakan setTimeout()adalah praktik yang baik karena tanpa itu, akan membuat skrip berlomba dengan adblocker.

Script di bawah ini akan memeriksa apakah dom ada / dihapus dan memeriksa offsetHeightelemen jika ada.

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

Semua jawaban di atas valid, namun sebagian besar tidak akan berfungsi untuk pemblokiran iklan tingkat DNS.

Pemblokir iklan tingkat DNS (seperti lubang-piPemblokir ) pada dasarnya mengembalikan NXDOMAIN (domain tidak ada) untuk daftar domain pemblokiran iklan (mis. Telemetry.microsoft.com akan "tidak ada" ketika itu terjadi).

Ada beberapa cara untuk menghindari ini:

Metode A : Permintaan iklan berdasarkan alamat ip, bukan domain.

Metode ini sedikit mengganggu karena Anda harus melacak alamat ip. Ini akan bermasalah jika kode Anda tidak dirawat dengan baik atau diperbarui secara teratur.

Metode B : Blokir semua permintaan yang gagal - bahkan jika klien melaporkan NXDOMAIN.

Ini akan sangat menyebalkan bagi pengguna jika itu adalah NXDOMAIN yang "sah".

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

dan dalam file getbanner.cfm:

adb = false;

Saya pikir ini cara termudah untuk mendeteksi adblock.

mikas
sumber
file lain yang diblokir: easylist-downloads.adblockplus.org/easylist.txt itu adalah filter AdBlock default
mikas
adb tampaknya trueselalu
Deb
1

Inilah yang bekerja untuk saya:

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

$(document).ready(function(){
    if(isAdBlocked()) {
       alert('Y U NO LIKE ADS?');
    }
});
jesal
sumber
Coba saja ini; tidak bekerja. Selalu mengembalikan true bahkan ketika tidak ada perangkat lunak pemblokiran iklan yang diinstal.
ecnepsnai
Perlu diingat ini hanya akan berfungsi pada halaman tempat Anda menggunakan AdSense. Kalau tidak, itu akan selalu kembali benar karena itulah respons yang benar - window.google_jobrunner tidak akan terdeteksi di semua halaman. Hanya yang menggunakan Google AdSense. Anda sebenarnya dapat melihat kode ini berfungsi di situs saya: ruddl.com
jesal
Menarik bahwa metode Anda kebetulan menggunakan pesan yang sama seperti yang digunakan oleh HowToGeek . Sebagai catatan, menampilkan kotak pesan tidak melakukan apa pun selain mengganggu dan membuat pengguna kesal terhadap situs Anda; sebagian besar situs memilih untuk menampilkan pesan di halaman (HTG mencoba melakukan keduanya, tetapi hanya pop-up yang mengganggu yang berfungsi).
Synetech
1

Saya tahu ini sudah dijawab, tetapi saya melihat situs sampel yang disarankan, dan saya melihat mereka melakukannya seperti ini:

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

Tidak perlu untuk timeout dan mengendus DOM. Cobalah untuk memuat skrip dari jaringan iklan populer, dan lihat apakah pemblokir iklan mencegat permintaan 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
sumber
1

Baru saja membuat "plugin" saya sendiri untuk menyelesaikan ini dan berfungsi dengan sangat baik:

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

Saya menambahkan kompatibilitas seluler dan deteksi jsBlocking antara lain ... (Seperti hamparan yang diperlihatkan kepada pengguna yang meminta mereka untuk menonaktifkan adBlocking / jsBlocking perangkat lunak ); Juga membuatnya ramah responsif.

Ini open source di bawah Lisensi Coffeeware .

Jmlevick
sumber
Hargai upaya ini, tetapi tampaknya tidak bekerja dengan adblock ... setidaknya saat menulis komentar ini.
arunskrish
itu berfungsi dengan adBlock, situs tempat saya menerapkan plugin ini adalah calyphrox.net, di mana siapa pun memang dapat memverifikasi plugin bekerja.
Jmlevick
3
Tautan Mati ... bisakah kita menghapus ini?
Evan Langlois
2
Harap perbarui tautannya, ini membuat jawaban ini buruk.
Yazan Rawashdeh
0

Saya memahami ketegangan Anda dan Anda dapat memeriksa apakah elemen telah dibuat oleh skrip atau elemen disembunyikan. Dan jika kita berbicara tentang pemblokiran iklan, Anda hanya dapat mengandalkan visibilitas elemen, bukan pada kehadiran elemen.

Elemen yang dibuat dengan skrip pihak ketiga tidak akan pernah ada, bahwa jika skrip tidak dapat dijangkau saat ini (kesalahan DNS, kesalahan server web jarak jauh, preload halaman web offline, dll), dan Anda akan selalu mendapatkan false positive.

Semua jawaban lain dengan cek sudah benar, tetapi ingatlah ini.

Eir Nym
sumber
0

timing's Jawabannya bagus dipikirkan tetapi tidak berfungsi lagi, jadi saya telah memperbarui nama file js ke 'adsense' dari 'iklan' dan itu bekerja kembali seperti pesona!

Ini kodenya, mungkin ini akan membantu seseorang:

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

Dalam file Js cantumkan baris ini: var adblockDetecter = true;

gerhana
sumber
0

Sekarang ada cara yang lebih baik untuk melakukannya menggunakan skrip JS sederhana yang disebut AdBlock Detector
Berikut cara menggunakannya:
Tambahkan ini ke <head>bagian Anda :

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

Sekarang Anda dapat menggunakan ab-messageid di mana pun Anda ingin menampilkan pesan kepada pengguna AdBlock:

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

Perhatikan gaya sebaris yang ditambahkan untuk menyembunyikannya semula (Tentu saja, Anda juga dapat melakukan ini dari file CSS Anda sendiri).
Perlu diketahui juga bahwa diperlukan 500 ms, itu karena harus menunggu adblocker untuk melakukan sesuatu atau tidak akan berfungsi.

Sedikit penjelasan tentang cara kerja skrip ini

Pertama, ia menambahkan iframe dengan sumber tautan yang dibuat secara acak. (Ini dihasilkan secara acak karena beberapa adblock cerdas, pada titik tertentu, mereka menyadari bahwa tautan itu palsu).
Kemudian ia menjalankan beberapa pemeriksaan pada iframe itu (jika berhasil dimuat atau jika gayanya dimodifikasi). Jika salah satu dari tes ini benar, maka akan ditampilkanab-message elemen untuk adblock pengguna.

Skrip ini berfungsi untuk sebagian besar (jika tidak semua) pemblokir iklan.

TAMBAHAN

Tidak ada gunanya, sungguh, bisa saja menciptakan intisari, tetapi sebaliknya saya membuat proyek Github, tapi tetap saja, periksa dan beri bintang jika itu membantu Anda.
abDetector: Detektor AdBlock JavaScript vanilla sederhana.
Nikmati.

Nick Rameau
sumber
Solusi yang buruk. File .js eksternal mudah diblokir.
Bangkok
@Bangkokian Cukup salin dan rujuklah (dan lisensinya) di pesan Anda yang menunjukkan file javascript atau index.js (atau apa pun).
BlueEyesWhiteDragon
1
@BlueEyesWhiteDragon Anda benar. Tapi itu sama sekali bukan jawaban asli Troy. Sekarang telah 100% diedit untuk menampilkan skrip sebaris. Komentar saya berdiri. Jawaban aslinya adalah menggunakan skrip eksternal. stackoverflow.com/posts/34738388/revisi
Bangkok
@Bangkokian tepatnya, saya lupa menyebutkan bahwa berkat komentar Anda, saya mengedit jawaban saya untuk mengikuti pedoman SO dan menjadikannya skrip inline. Terima kasih.
Nick Rameau
0

Anda dapat memeriksa ini mungkin membantu mendeteksi-adblocker

Ini merupakan implementasi dari jawaban waktu

Tambahkan ini sebelum skrip apa pun di tag kepala:

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

Kemudian, gunakan itu:

if (adblocker) {
    // the add blocker is enabled
}else{
    // ad blocker is not enabled
}
Mustafa Dwekat
sumber
Itu tidak bekerja. Itu selalu menunjukkan bahwa iklan diblokir.
Himanshu Aggarwal
periksa nilainya window.adblockerdi konsol peramban Anda jika kembali truemaka adblocker diaktifkan jika tidak maka akan kembali falseAnda dapat memeriksa dokumentasi lengkap deteksi-adblocker
Mustafa Dwekat