Làm cách nào để phát hiện Adblock trên trang web của tôi?


370

Tôi muốn có thể phát hiện xem người dùng có đang sử dụng phần mềm chặn quảng cáo khi họ truy cập trang web của tôi không. Nếu họ đang sử dụng nó, tôi muốn hiển thị một thông báo yêu cầu họ tắt nó để hỗ trợ dự án, giống như trang web này.

Nếu bạn truy cập vào trang web đó và trình duyệt của bạn đã bật một số loại phần mềm quảng cáo, thì trang web đó thay vì hiển thị quảng cáo thực tế sẽ hiển thị một biểu ngữ nhỏ cho người dùng biết rằng doanh thu quảng cáo được sử dụng để lưu trữ dự án và họ nên xem xét tắt Adblock .

Tôi muốn làm điều đó trên trang web của mình, tôi đang sử dụng quảng cáo adsense trên đó, Làm thế nào tôi có thể làm điều đó?



5
Đối với người dùng đang tìm kiếm một giải pháp mới nhất, vui lòng biết rằng có một giải pháp có thể cắm toàn diện có sẵn tại github.com/sitexw/BlockAdBlock
yeaske

5
Một số người chỉ đơn giản là không muốn được phân tích và quảng cáo trên web. Một số trang web tôi đã truy cập, nói với chúng tôi rằng doanh thu hỗ trợ cho dự án của họ, bị sa lầy vào quảng cáo, điều đó trở nên lố bịch.
Paul

7
Bây giờ các trang web đang làm điều này ngày càng nhiều (và lạm dụng nó, và nói dối với chúng tôi về quảng cáo của họ là không đáng tin cậy và buộc chúng tôi phải đưa danh sách trắng toàn bộ trang web của họ chỉ để vào ...) - Có bất kỳ tiện ích mở rộng hoặc thủ thuật nào chúng tôi có thể sử dụng để ngăn họ phát hiện chúng tôi sử dụng AdBlock +? - Tôi không phiền khi thấy một vài quảng cáo biểu ngữ được nhắm mục tiêu ở đây hoặc ở đó, nhưng nhấp vào kích hoạt và cửa sổ bật lên video toàn màn hình liên tục không phải là điều của tôi.
BrainSlugs83

1
Xin vui lòng xem giải pháp của tôi, nó đơn giản và sạch sẽ. JS thuần túy, không có yêu cầu bổ sung, không có thư viện hoặc plugin bên ngoài hoặc bất kỳ BS nào khác.
Cumulo Nimbus ngày 30/8/2016

Câu trả lời:


410

Giải pháp của tôi không dành riêng cho một mạng quảng cáo nhất định và rất nhẹ. Tôi đã chạy nó trong sản xuất một vài năm. AdBlock chặn tất cả các URL có chứa từ "quảng cáo". Vì vậy, đây là những gì tôi đã làm:

Tôi đã thêm một tệp js nhỏ vào webroot của mình với tên ads.js

Đây là dòng mã duy nhất trong tệp đó

var canRunAds = true;

Sau đó, một nơi nào đó trong trang của tôi:

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

Các tệp như ads.js bị chặn bởi ít nhất các trình chặn quảng cáo này trên Chrome:

  • Khóa quảng cáo
  • Quảng cáo cộng
  • Quảng cáo chuyên nghiệp
  • Hồn ma

Cập nhật vào 2019-02-15:

Đã thêm Ghostery trong danh sách ở trên vì tiện ích mở rộng hiện cũng chặn các yêu cầu tới ads.js. Rất tiện dụng. Điều này có nghĩa là Ghostery thực sự đang giúp chúng tôi phát hiện ra việc chặn quảng cáo bằng tiện ích mở rộng của họ phải không?

Không hoạt động với:

Quyền riêng tư Badger


1
bạn có thể cung cấp cho các liên kết đầy đủ của js/ads.jsxin vui lòng? vì tôi đang ở trong blogger nên tôi phải tải lên .jsmột nơi nào đó (như: Google Drive) và liên kết trong trường hợp đó không chứa ads. Nó sẽ thực sự hữu ích nếu bạn cung cấp liên kết của tập tin của bạn.
Nợ

91
Tệp chỉ chứa các từ "var canRunAds = true;" Vì vậy, chỉ cần tạo ra nó cho mình.
thời gian

5
Một số trình chặn quảng cáo dường như không chặn tệp ads.js, như đối với tôi, quảng cáo đơn giản cho chrome.
Mgamerz

2
ABP cho chrome đang phản ứng tốt, vì vậy tất cả đều hoạt động đúng!
Maxime Lafarie

9
Bạn cũng có thể thử chạy yêu cầu ajax trên một URL bị chặn bởi trình chặn quảng cáo. Nếu thành công, sẽ không có trình chặn quảng cáo, nếu thất bại, sẽ có trình chặn quảng cáo.
SethWhite

138

Không phải là một câu trả lời trực tiếp, nhưng tôi đã đặt thông điệp đằng sau quảng cáo sẽ được tải ... thay vì cố gắng phát hiện nó, nó sẽ chỉ hiển thị khi quảng cáo không xuất hiện.


5
Người dùng vẫn có thể chặn các thông báo quảng cáo bị chặn này bằng Adblock: đó là lỗ hổng duy nhất mà tôi biết.
Anderson Green

25
Nó có thể dễ dàng nhưng đó không phải là cách thích hợp để làm điều đó, nếu bố cục của bạn bị méo hoặc tải quảng cáo chậm, người dùng có thể thoáng thấy lỗi không liên quan đến mình. Ngoài ra, hãy lưu ý rằng Adblock đang thực hiện các biện pháp để chặn các tin nhắn gây khó chịu nhắm vào người dùng ABP. Nếu bạn muốn yêu cầu người dùng bỏ chặn, hãy thực hiện thông qua tin nhắn đơn giản có thể ẩn bên ngoài bố cục (không đẩy các yếu tố khác đi). Hãy nhìn vào duckduckgo.com/?q=foo+bar khi bật quảng cáo.
Xeevis

1
@Xeevis - Tôi đang tìm gì vậy? - Tôi nghĩ AdBlock + đã chặn bất cứ điều gì vịt con đang làm.
BrainSlugs83

101

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

Với jQuery:

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

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

Tất nhiên, bạn sẽ cần phải có một trang đích cho AdblockNotice.html và lớp .myTestAd cần phản ánh các thùng chứa quảng cáo thực tế của bạn. Nhưng điều này nên làm việc.

BIÊN TẬP

Như TD_Nijboer khuyến nghị, cách tốt hơn là sử dụng bộ chọn :hidden(hoặc :visible, như tôi sử dụng bên dưới) để nó display: nonecũng được kiểm tra:

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

Tất nhiên, cả hai có thể được kết hợp thành một ifkhối nếu muốn.

Lưu ý rằng visibility: hiddencũng sẽ không bị bắt (nơi không gian bố cục vẫn còn, nhưng quảng cáo không hiển thị). Để kiểm tra điều đó, một bộ lọc khác có thể được sử dụng:

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

Điều này sẽ cung cấp cho bạn một loạt các yếu tố quảng cáo "vô hình" (với bất kỳ 0vấn đề nào lớn hơn là một vấn đề, theo lý thuyết).


16
Chuyển hướng trong trường hợp này là một ý tưởng tồi. Nếu dịch vụ quảng cáo của bạn ngừng hoạt động, tất cả khách truy cập có thể được chuyển hướng đến trang đó. Tôi cũng khuyên bạn nên sử dụng sự kiện tải cửa sổ thay vì tài liệu sẵn sàng.
Andy E

1
một cách tốt hơn để phát hiện sẽ là $ ('. myTestAd'). là (": hidden"); vì hướng dẫn sử dụng chỉ định nó cũng phát hiện nếu chiều rộng / chiều cao bằng 0 và nếu display = none.
TD_Nijboer

6
Redirecting in this case is a bad idea. If your advertising service goes down, all visitors could be redirected to that page.Thật. Không phải đề cập đến việc họ chỉ đơn giản là tập hợp một kịch bản đơn giản để đánh bại các biện pháp đối phó. Bên cạnh đó, bạn có thực sự nghĩ rằng bằng cách tích cực và mạnh mẽ, người dùng sẽ có động lực để vô hiệu hóa trình chặn quảng cáo của họ không? Không, tất cả những gì nó sẽ đạt được sẽ khiến họ tức giận và chua chát với trang web của bạn. Hầu hết các trang web chọn chỉ đơn giản là hiển thị một tin nhắn chứ không phải là thù địch.
Synetech

Điều này không hoạt động với tôi trong Chrome. Trong sự kiện DOMReady, quảng cáo dường như vẫn hiển thị.
nwellnhof

3
Vui lòng không ngăn người dùng truy cập trang web của bạn vì họ đã vô hiệu hóa quảng cáo - điều đó chỉ làm leo thang cuộc chạy đua vũ trang. - Nếu bạn yêu cầu chúng tôi vui lòng bật chúng lên, chúng tôi có thể làm điều đó - nếu bạn cố ép buộc chúng tôi, chúng tôi sẽ ngừng truy cập trang web của bạn hoặc chúng tôi sẽ báo cáo lỗi trên trình chặn quảng cáo của chúng tôi và nhận nó cố định cho trang web của bạn. - Đây là loại hành vi chính xác mà trình chặn quảng cáo tồn tại để bảo vệ người dùng khỏi.
BrainSlugs83

93

Không có yêu cầu thêm. Không có thư viện bên ngoài. Chỉ đơn giản, JavaScript đơn giản:

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

  • Bạn tạo một phần tử với hộp quảng cáo lớp (như được xác định là phần tử có thể tháo rời trong tệp định nghĩa của AdBlock Plus)
  • Bạn thêm nó vào tài liệu và sau một thời gian ngắn bạn đọc phần bù của nó
  • Nếu AdBlock được cài đặt, phần tử sẽ không có chiều cao.

Tín dụng cho bài viết của Christian Heilmann , tôi nghĩ rằng đó là giải pháp tốt nhất để phát hiện AdBlock.


5
Để tránh sự cố, bạn có thể thêm testAd.style.display = 'absolute'và di chuyển nó ra khỏi màn hình
Gerald

4
Giải pháp tốt, nhưng đối với những người bị chậm 100ms, tôi khuyên bạn nên thêm một cái gì đó như thế này vào cơ thể 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>(tất nhiên sau khi thử nghiệm css nên được đổi thành <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 7/11/2016

2
@Gerald Điểm tốt. nhưng AFAIK, absolutelà một positiongiá trị.
Em Bảy

Tôi chỉ có thể thêm, tôi chỉ làm cho giải pháp này hoạt động khi tôi thêm nó vào trong một window.onloadchức năng
Peter Cullen

Lưu ý rằng điều này không hoạt động cho AdBlock cho Firefox
Eda190

42

Hầu hết các quảng cáo được tải động trong javascript. Tôi chỉ sử dụng sự kiện onerror để phát hiện xem tập lệnh quảng cáo có thể được tải hay không. Có vẻ để làm việc.

Ví dụ với GoogleAds:

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

Điều này cũng có thể được sử dụng trên các yếu tố khác để xem liệu trình chặn quảng cáo có chặn nội dung hay không. Phương pháp này có thể tạo ra dương tính giả nếu các phần tử từ xa không tồn tại hoặc không thể đạt được.


1
Đây là một trong những cách tốt nhất để kiểm tra xem quảng cáo có được tải hay không..vì vì tải thủ công tập lệnh của bạn dựa vào trình chặn để chặn rằng một lần nào đó sẽ thất bại ..
MaZZly

Đây có vẻ là giải pháp tốt nhất cho các tập lệnh được tải động.
Carca

Không biết có điều gì đã thay đổi kể từ khi điều này được viết hay không, nhưng tôi không thể kích hoạt tính năng khởi động với Fair Adblock bằng trình cắm chrome STANDS.
Melchester

kể từ tháng 3 năm 2018, vẫn là giải pháp tốt nhất, đơn giản và chắc chắn
Daniel Vukasovich

như đã nói ở trên nó không hoạt động với trình offsetHeight
chặn quảng cáo

17

Để phát hiện xem người dùng có chặn quảng cáo hay không, tất cả những gì bạn phải làm là tìm một chức năng trong javascript quảng cáo và thử kiểm tra nó. Không quan trọng họ đang sử dụng phương pháp nào để chặn quảng cáo. Đây là giao diện của quảng cáo Google Adsense:

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

Phương pháp này được phác thảo ở đây: http : //www.metamorphổng.com/detect-web-popup-blocker-software-adblock-spam


8
google_Vnder_ad hiện không được xác định bất cứ lúc nào, typeof (window.google_jobrunner)! = 'object' hoạt động với tôi.
Dmitrii Korotovskii

4
Vì nó không phải là mã mà bạn kiểm soát, tôi nghĩ rằng nên dựa vào điều này, vì một bộ tái cấu trúc của thư viện sẽ khiến tập lệnh của bạn phát hiện khối quảng cáo cho tất cả người dùng.
Patrick Quên

1
typeoflà một chi phí nếu bạn kiểm tra tài sản của đối tượng. Sử dụng đơn giản === undefined.
Robo Robok

12

Giải pháp đơn giản nhất của tôi với jquery là:

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

Advertising.js không chứa gì. Khi ai đó sử dụng adblock, nó sẽ thất bại và chức năng được gọi.


10

Tôi biết đã có đủ câu trả lời, nhưng vì câu hỏi này xuất hiện trên Google đã tìm kiếm "phát hiện quảng cáo" tại chủ đề, tôi muốn cung cấp một số thông tin chi tiết trong trường hợp bạn không sử dụng adsense .

Cụ thể, với ví dụ này, bạn có thể phát hiện xem danh sách Adblock mặc định do Firefox Adblock cung cấp có được sử dụng hay không. Lợi thế là trong danh sách chặn này có một phần tử bị chặn với id CSS #bottomAd. Nếu tôi bao gồm một yếu tố như vậy trong trang và kiểm tra chiều cao của nó, tôi biết liệu quảng cáo có hoạt động hay không:

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

Phần còn lại được thực hiện thông qua nghi ngờ jQuery thông thường:

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

Có thể thấy, tôi đang sử dụng setTimeoutvới thời gian chờ ít nhất là 1ms. Tôi đã thử nghiệm điều này trên nhiều trình duyệt khác nhau và hầu hết thời gian, trực tiếp kiểm tra phần tử readyluôn được trả về 0; bất kể người chặn quảng cáo có hoạt động hay không. Tôi đã có hai ý tưởng về điều này: hoặc kết xuất chưa được thực hiện hoặc Adblock chưa khởi động. Tôi không buồn điều tra thêm.


Tôi thực sự rất thích câu trả lời này vì nó không liên quan đến việc đưa ra các yêu cầu bổ sung có khuyết điểm nào cho cách tiếp cận này thay vì các yêu cầu ads.js giả không?
JeroenVdb

Thay vì kiểm tra chiều dài và chiều cao, bạn không thể sử dụng if ($ ("# bottomAd"). Là (': hidden')) ...?
Evan Langlois

@EvanLanglois, tôi biết bạn đã hỏi hai năm trước, nhưng câu hỏi của bạn thực sự khiến tôi quan tâm nên tôi đã đi lặn tìm thông tin về nó. Rõ ràng, việc .is(":hidden")kiểm tra phụ thuộc vào việc cả chiều cao và chiều rộng đều bằng không. Nếu bạn chỉ đặt chiều cao thành 0, nhưng div vẫn chiếm chiều rộng, thì nó không được coi là "ẩn" bởi jQuery. Vì vậy, cho dù bạn có thể nói, .is(":hidden")phần nào phụ thuộc vào cách trình chặn quảng cáo quyết định thay đổi kích thước / ẩn nội dung.
Spencer D

10

Lời khuyên của tôi là: đừng làm điều đó!

Bất kỳ kịch bản nào mà bạn coi mọi người là "kẻ làm sai" sẽ dẫn đến việc họ đánh trả.

Đây là đề xuất của tôi.

Đặt một thông điệp nhỏ không gây khó chịu ở đầu trang (bất kể quảng cáo có bị chặn hay không) với văn bản I *totally* respect your right to block adsvà liên kết đến một trang / cửa sổ bật lên khác có tiêu đề Read more ....

Trên trang khác, hãy làm rõ rằng bạn hiểu đó là máy tính của họ và họ có thể tự do sử dụng chặn quảng cáo.

Ngoài ra, hãy nói rõ theo cách không bị buộc tội rằng việc sử dụng các trình chặn này khiến bạn gặp khó khăn hơn trong việc cung cấp nội dung tuyệt vời (giải thích lý do chi tiết) và trong khi bạn muốn chặn quảng cáo không xảy ra trên trang web của mình, đó hoàn toàn là quyết định của họ. Tập trung vào các tích cực của tắt tắt chặn.

Những người phản đối kịch liệt quảng cáo sẽ bỏ qua điều này nhưng dù sao bạn cũng không bao giờ có cơ hội thuyết phục họ. Những người thờ ơ có thể bị ảnh hưởng bởi sự hấp dẫn của bạn vì bạn không làm toàn bộ "hãy để tôi đi hoặc tôi sẽ đưa bóng về nhà", điều đó thực sự nên là lãnh địa độc quyền của trẻ em năm tuổi.

Hãy nhớ rằng, không ai cầm súng lên đầu bạn và buộc bạn phải đặt đồ lên mạng. Đối xử với độc giả / người dùng của bạn với sự tôn trọng và có thể bạn sẽ tìm thấy một số lượng tốt trong số họ sẽ đáp lại.


1
Thế còn "Có vẻ như bạn sử dụng trình chặn quảng cáo. Thật tuyệt! Chúng tôi cũng vậy :) Hãy ủng hộ X bằng cách nói với bạn bè của bạn về chúng tôi!"
ADTC

3
heh cố gắng kiếm tiền bằng cách này ... quảng cáo là cách thanh toán thường xuyên, vì vậy người dùng nên thanh toán
dev1223

Bố cục của tôi bị hỏng khi bật quảng cáo?
godblessstrawberry 04/11/2016

5
Nếu một trang web buộc tôi phải vô hiệu hóa trình chặn quảng cáo của mình, tôi sẽ tiếp tục. Họ thua, và tôi không quan tâm. Tôi chỉ cần lấy một bản sao lưu từ Google.
RayfenWindspear

1
@Tallboy, không có đạo đức trong câu trả lời của tôi. Chỉ có thực tế của khán giả mà bạn đang cố gắng nhắm mục tiêu. Và, mặc dù ý định của bạn có thể được mô tả, việc đọc lại câu hỏi sẽ cho bạn thấy nó đặc biệt để yêu cầu người dùng cho phép quảng cáo, không dọn dẹp bố cục hoặc một số thứ như vậy. Đó là câu hỏi tôi đã trả lời, không phải là một số câu hỏi khác được dự tính nửa thập kỷ sau :-)
paxdiablo

9

Họ đang sử dụng thực tế là mã quảng cáo của Google tạo ra một iframe với id "iframe". Vì vậy, miễn là bạn chưa có thứ gì đó trên trang của mình với ID đó, thì điều này cũng phù hợp với bạn.

<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

Chỉ cần thêm tập lệnh nhỏ trên trang web của bạn:

var isAdsDisplayed = true;

Với tên adsbygoogle.js

Sau đó làm như sau:

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

Tìm thấy giải pháp này ở đây


Đây là người đàn ông tuyệt vời, cảm ơn bạn rất nhiều 💓
Jodyshop

8

Tôi nhận thấy các bình luận trước đó sử dụng google adsense làm đối tượng để kiểm tra. Một số trang không sử dụng adsense và sử dụng khối adsense vì thử nghiệm không thực sự là một ý tưởng hay. Bởi vì khối adsense có thể gây hại cho SEO của bạn. Dưới đây là ví dụ về cách tôi phát hiện bởi lớp chặn quảng cáo đơn giản:

Html:

<div class="ad-placement" id="ablockercheck"></div>
<div id="ablockermsg" style="display: none"></div>

Câu hỏi:

$(document).ready(function()
{
   if(!$("#ablockercheck").is(":visible"))
   {
     $("#ablockermsg").text("Please disable adblocker.").show();
   }
});

"ablockercheck" là một ID mà trình chặn quảng cáo chặn. Vì vậy, kiểm tra nó nếu nó hiển thị, bạn có thể phát hiện nếu trình chặn quảng cáo được bật.


7

AdBlock dường như chặn tải các tệp JavaScript AdSense (v.v.). Vì vậy, nếu bạn đang sử dụng phiên bản quảng cáo AdSense không đồng bộ, bạn có thể kiểm tra xem có phải adsbygooglelà một Array. Điều này phải được kiểm tra sau vài giây vì tập lệnh không đồng bộ là ... không đồng bộ. Đây là một phác thảo sơ bộ :

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

Để làm rõ, đây là một ví dụ về mã quảng cáo không đồng bộ của AdSense trông như thế nào:

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

Lưu ý rằng adsbygoogleđược khởi tạo như là một mảng. Các adsbygoogle.jsthư viện thay đổi mảng này vào Object {push: ...}khi nó thực thi. Kiểm tra loại biến sau một thời gian nhất định có thể cho bạn biết nếu tập lệnh đã được tải.


Điều này sẽ hoạt động hầu hết thời gian nhưng nếu người dùng có kết nối chậm (nghĩ về thiết bị di động) thì sao?
Luca Steeb 13/03/2015

6

Cách tiếp cận này tôi sử dụng trên trang web của tôi, có thể bạn sẽ thấy nó hữu ích. Theo tôi, đó là giải pháp đơn giản nhất.

AdBlocker chặn các lớp và phần tử html cụ thể, bằng cách kiểm tra các bộ chọn này của bất kỳ quảng cáo bị chặn nào trong bảng điều khiển dành cho nhà phát triển (tất cả chúng đều được liệt kê), bạn có thể thấy phần tử nào sẽ luôn bị chặn.

Ví dụ: chỉ cần kiểm tra trang câu hỏi này trên stackoverflow và bạn sẽ thấy một loạt các quảng cáo bị chặn.

Ví dụ, bất kỳ phần tử nào với bottom-adlớp sẽ tự động bị chặn.

  1. Tôi đã tạo một phần tử div không trống với bottom-adlớp: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. Sau khi tải trang, chỉ cần kiểm tra nếu phần tử này bị ẩn. Tôi đã sử dụng jQuery, nhưng cảm thấy thoải mái khi sử dụng javascript: $('.bottom-ad').css('display') == "none"hoặc thậm chí tốt hơn bằng cách sử dụng$('.bottom-ad').is(':visible')

Nếu giá trị là true, thì AdBlocker đang hoạt động.


6

Bạn không cần thêm một yêu cầu HTTP, bạn có thể chỉ cần tính chiều cao của một add giả.

Nhân tiện, đây là một danh sách đầy đủ phù hợp với các yếu tố mà trình chặn quảng cáo tránh kết xuất.

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

cách an toàn là bọc quảng cáo của bạn bên trong <div>và kiểm tra chiều cao

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

nó hoạt động với adblock plus và bluehell tường lửa.


6

Một cách hiệu quả để kiểm tra xem có quảng cáo hay không: Đơn giản chỉ cần kiểm tra xem có bật quảng cáo hay không bằng cách thử kích hoạt URL của quảng cáo google. Nếu có thì chạy callback_has_adblock, nếu không thì chạy callback_no_adblock. Giải pháp này chi phí một yêu cầu nhiều hơn nhưng ít nhất nó hoạt động:

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

Giải pháp này hoạt động cho tất cả các loại quảng cáo, không chỉ google adsense.


một số trình chặn quảng cáo chặn jQuery, sau đó tập lệnh không chạy vì "$ không được xác định". Sử dụng tốt hơn js tinh khiết.
nyx

3

Mặc dù tuổi của câu hỏi này, gần đây tôi thấy nó rất hữu ích và do đó chỉ có thể cho rằng có những người khác vẫn đang xem nó. Sau khi xem ở đây và các nơi khác, tôi phỏng đoán rằng ba khách hàng chính kiểm tra gián tiếp phát hiện trình chặn quảng cáo là để kiểm tra các tài nguyên bị chặn div/ img, bị chặn iframevà bị chặn (tệp javascript).

Có thể nó vượt quá đỉnh hoặc hoang tưởng nhưng nó bao trùm cho các hệ thống chặn quảng cáo chỉ chặn một hoặc hai trong số các lựa chọn và do đó có thể không được bảo hiểm nếu bạn chỉ thực hiện một kiểm tra.

Trên trang bạn đang chạy kiểm tra thêm: (Tôi đang sử dụng 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>

và thêm bất cứ nơi nào khác trên trang:

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

Tôi đã sử dụng một div với tên mồi cũng như hình ảnh được lưu trữ bên ngoài với văn bản "Quảng cáo" và trong các kích thước được sử dụng bởi AdSense (cảm ơn địa điểm.it!).

Trong advertisement.jsbạn nên thêm một cái gì đó vào tài liệu mà chúng ta có thể kiểm tra sau này. Mặc dù có vẻ như bạn đang làm giống như trước đây, nhưng thực tế bạn đang kiểm tra chính tệp ( advertisement.js) đang được tải chứ không phải đầu ra.

$(document).ready(
{

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

});

Và sau đó, tập lệnh phát hiện trình chặn quảng cáo kết hợp mọi thứ

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

});

Khi tài liệu đã sẵn sàng , tức là đánh dấu được tải, chúng tôi cũng thêm iframe vào tài liệu. Sau đó, khi cửa sổ được tải , tức là nội dung bao gồm. hình ảnh được tải, chúng tôi kiểm tra:

  • Kích thước và khả năng hiển thị của div thử nghiệm đầu tiên.
  • Đó là nội dung của div thử nghiệm thứ hai là "kiểm tra", như nó đã có nếu advertimsent.jsđã không bị chặn.
  • Kích thước (và tôi đoán khả năng hiển thị, vì một đối tượng ẩn không có chiều cao hoặc chiều rộng?) Của iframe

Và các phong cách:

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

div#myTestAd2
{
    display: none;
}

Hi vọng điêu nay co ich


3

Nếu sử dụng mã AdSense mới, bạn có thể thực hiện kiểm tra dễ dàng, không cần dùng đến kiểm tra nội dung hoặc kiểm tra css.

Đặt quảng cáo của bạn như bình thường trong đánh dấu của bạn:

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

Sau đó, bạn gọi mã adsense ở cuối trang của bạn (lưu ý không sử dụng "async"cờ khi gọi adsbygoogle.jstập lệnh):

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

Sau đó thêm đoạn mã nhỏ bên dưới:

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

AdSense luôn tạo / bộ cờ adsbygoogle.loadedđến truekhi quảng cáo được nạp, bạn có thể đặt dấu check ở một hàm setTimeout để trì hoãn việc kiểm tra bởi một vài giây.


2
Điều này tất nhiên phụ thuộc vào cách quảng cáo đã bị chặn. Nếu phần mềm chặn quảng cáo của bạn ngăn không cho AdSense tải hoàn toàn, thì phần mềm này sẽ hoạt động. Nhưng nếu phần mềm chặn quảng cáo của bạn đang làm một cái gì đó như đặt thuộc tính hiển thị CSS thành "không" hoặc chiều cao của div tương ứng thành 0, thì điều này có thể không hoạt động.
Bangkok

Thật. Tôi không nghĩ rằng có một cách dễ dàng để nắm bắt 100% tất cả các quảng cáo, nhưng ít nhất bạn có thể bắt được một số trong số chúng.
Troy Morehouse

3

Hầu hết các trình chặn quảng cáo hủy yêu cầu HTTP ads.jsvà thực hiện 0pxcho phần tử nhưng đôi khi trình chặn quảng cáo đã xóa DOM và một số câu trả lời ở trên sẽ không thành công vì không kiểm tra sự tồn tại của phần tử.

Sử dụng setTimeout()là thực hành tốt bởi vì không có nó, sẽ làm cho cuộc đua kịch bản với trình chặn quảng cáo.

Kịch bản dưới đây sẽ kiểm tra xem dom tồn tại / loại bỏ và kiểm tra offsetHeightmột phần tử nếu nó tồn tại.

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

Tất cả các câu trả lời ở trên là hợp lệ, tuy nhiên hầu hết sẽ không hoạt động đối với chặn quảng cáo cấp DNS.

Các trình chặn quảng cáo cấp DNS (như lỗ pi ) về cơ bản trả về NXDOMAIN (tên miền không tồn tại) cho danh sách các tên miền chặn quảng cáo (ví dụ: telemetry.microsoft.com sẽ "không tồn tại" khi có).

Có một số cách để phá vỡ điều này:

Phương pháp A : Yêu cầu quảng cáo theo địa chỉ IP, không phải tên miền.

Phương pháp này hơi khó chịu vì bạn sẽ phải theo dõi địa chỉ IP. Điều này sẽ có vấn đề nếu mã của bạn không được duy trì tốt hoặc cập nhật thường xuyên.

Phương pháp B : Chặn tất cả các yêu cầu không thành công - ngay cả khi máy khách báo cáo NXDOMAIN.

Điều này sẽ rất khó chịu cho người dùng nếu đó là một NXDOMAIN "hợp pháp".


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>

và trong tệp getbanner.cfm:

adb = false;

Tôi nghĩ đó là cách dễ nhất để phát hiện quảng cáo.


các tệp bị chặn khác: Easylist-doads.adblockplus.org/easylist.txt đó là bộ lọc AdBlock mặc định
mikas

adb dường như trueluôn luôn như vậy
Deb

1

Đây là những gì làm việc cho tôi:

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

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

Chỉ cần thử điều này; không hoạt động. Luôn trả về đúng ngay cả khi không cài đặt phần mềm chặn quảng cáo.
ecnepsnai

Hãy nhớ rằng điều này sẽ chỉ hoạt động trên một trang nơi bạn đang sử dụng AdSense. Nếu không, nó sẽ luôn trả về đúng vì đó là phản hồi chính xác - window.google_jobrunner sẽ không được phát hiện trong bất kỳ và tất cả các trang. Chỉ những người đang sử dụng Google AdSense. Bạn thực sự có thể thấy mã này hoạt động trên trang web của tôi: ruddl.com
jesal

Điều thú vị là phương pháp của bạn tình cờ sử dụng cùng một thông điệp như được sử dụng bởi HowToGeek . Đối với bản ghi, hiển thị hộp thông báo không có gì ngoài những người dùng khó chịu và chua chát đối với trang web của bạn; hầu hết các trang web chọn hiển thị thông báo trong trang (HTG cố gắng thực hiện cả hai, nhưng chỉ các công cụ bật lên gây phiền nhiễu).
Synetech

1

Tôi biết điều này đã được trả lời, nhưng tôi đã xem trang web mẫu được đề xuất và tôi thấy họ làm như thế này:

<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

Không cần thời gian chờ và đánh hơi DOM. Chỉ cần thử tải tập lệnh từ các mạng quảng cáo phổ biến và xem liệu trình chặn quảng cáo có chặn yêu cầu HTTP không.

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

Chỉ cần tạo "plugin" của riêng tôi để giải quyết vấn đề này và nó hoạt động rất tốt:

quảng cáo + jsBuddy:

ADBuddy JSBuddy GitHub

Tôi đã thêm khả năng tương thích di động và phát hiện khóa jsBlocking trong số những thứ khác ... (Giống như lớp phủ được hiển thị cho người dùng yêu cầu họ tắt phần mềm adBlocking / jsBlocking ); Cũng làm cho nó đáp ứng thân thiện.

Nó được mở theo Giấy phép Coffeware .


Đánh giá cao nỗ lực, nhưng dường như không hoạt động với adblock ... ít nhất là khi viết bình luận này.
arunskrish

nó hoạt động với adBlock, một trang web nơi tôi triển khai plugin này là calyphrox.net, nơi mọi người thực sự có thể xác minh plugin hoạt động.
Jmlevick

3
Liên kết đã chết ... chúng ta có thể xóa cái này không?
Evan Langlois

2
Vui lòng cập nhật các liên kết, nó làm cho một câu trả lời xấu.
Yazan Rawashdeh

0

Tôi hiểu sự căng thẳng của bạn và bạn có thể kiểm tra xem phần tử đã được tạo bởi tập lệnh hay phần tử có bị ẩn hay không. Và nếu chúng tôi nói về việc chặn quảng cáo, bạn chỉ có thể tin tưởng vào khả năng hiển thị của thành phần, chứ không phải về sự hiện diện của yếu tố.

Phần tử được tạo bằng tập lệnh của bên thứ ba sẽ không bao giờ xuất hiện, nếu hiện tại không thể truy cập tập lệnh (lỗi DNS, lỗi máy chủ web từ xa, tải trước trang web ngoại tuyến, v.v.) và bạn sẽ luôn nhận được kết quả dương tính giả.

Tất cả các câu trả lời khác với kiểm tra là chính xác, nhưng hãy ghi nhớ điều này.


0

timing's Câu trả lời là suy nghĩ tốt nhưng không còn hiệu quả nữa, vì vậy tôi đã cập nhật tên của tệp js thành 'adsense' từ 'ads' và nó hoạt động trở lại như một cơ duyên!

Đây là mã, có lẽ điều này sẽ giúp ai đó:

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

Trong tệp Js chỉ đặt dòng này: var adblockDetecter = true;


0

Bây giờ có một cách tốt hơn để làm điều đó bằng cách sử dụng tập lệnh JS đơn giản có tên là Trình phát hiện AdBlock
Dưới đây là cách sử dụng:
Thêm phần này vào <head>phần của bạn :

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

Giờ đây, bạn có thể sử dụng ab-messageid bất cứ nơi nào bạn muốn hiển thị thông báo cho người dùng AdBlock:

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

Lưu ý kiểu nội tuyến được thêm vào để ẩn nó ban đầu (Tất nhiên, bạn cũng có thể thực hiện việc này từ tệp CSS của riêng bạn).
Cũng lưu ý rằng phải mất 500ms, đó là vì phải chờ trình chặn quảng cáo thực hiện công việc của mình hoặc nó sẽ không hoạt động.

Một lời giải thích nhỏ về cách hoạt động của kịch bản này

Đầu tiên, nó nối thêm iframe với nguồn liên kết được tạo ngẫu nhiên. (Nó được tạo ngẫu nhiên vì một số adblocks thông minh, đến một lúc nào đó, họ nhận ra một liên kết là giả mạo).
Sau đó, nó chạy nhiều kiểm tra trên iframe đó (nếu nó được tải thành công hoặc nếu kiểu của nó đã được sửa đổi). Nếu một trong những thử nghiệm này là đúng, thì nó sẽ hiển thị ab-messagephần tử cho người dùng quảng cáo.

Tập lệnh này hoạt động với hầu hết (nếu không phải tất cả) trình chặn quảng cáo.

THÊM

Không có điểm nào, thực sự, có thể vừa tạo ra một ý chính, nhưng thay vào đó tôi đã tạo một dự án Github, nhưng vẫn vậy, hãy kiểm tra và đánh dấu sao nếu nó giúp bạn.
abDetector: Trình phát hiện AdBlock JavaScript vanilla đơn giản.
Thưởng thức.


Giải pháp kém. Một tập tin .js bên ngoài dễ dàng bị chặn.
Bangkok

@Bangkokian Chỉ cần sao chép và nó tham chiếu nó (và giấy phép của nó) trong tin nhắn của bạn hiển thị tệp javascript hoặc index.js (hoặc bất cứ điều gì).
BlueEyesWhiteDragon 18/03/2016

1
@BlueEyesWhiteDragon Bạn đúng rồi. Nhưng đó không phải là tất cả những gì câu trả lời ban đầu của Troy là. Hiện tại nó đã được chỉnh sửa 100% để hiển thị một tập lệnh nội tuyến. Nhận xét của tôi đứng. Câu trả lời ban đầu của ông là đặc biệt để sử dụng một kịch bản bên ngoài. stackoverflow.com/posts/34738388/revutions
Bangkok

@Bangkokian chính xác, tôi quên đề cập rằng nhờ nhận xét của bạn, tôi đã chỉnh sửa câu trả lời của mình để làm theo hướng dẫn của SO và biến nó thành một tập lệnh nội tuyến. Cảm ơn bạn.
Nick Rameau

0

Bạn có thể kiểm tra xem nó có thể giúp phát hiện-chặn quảng cáo

Đó là một thực hiện của câu trả lời thời gian

Thêm phần này trước bất kỳ tập lệnh nào trong thẻ head:

<head>
    <title></title>
    <meta/>

    <!--adBlocker detection code - START-->
    <script src="//adblocker.fortiapp.com/ads.js"></script>
    <script>
        (function (i, o, g, r) {
            i[o] = (typeof i[o] == typeof undefined) ? g : r
        })(window, 'adblocker', true, false);
    </script>
    <!--adBlocker detection code - END-->

    // Other scripts

</head>

Sau đó sử dụng nó:

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

Nó không hoạt động. Nó luôn cho thấy quảng cáo bị chặn.
Himanshu Aggarwal

kiểm tra giá trị window.adblockertrong bảng điều khiển trình duyệt của bạn nếu nó quay lại truesau đó trình chặn quảng cáo được bật nếu không nó sẽ quay trở lại, falsebạn có thể kiểm tra tài liệu phát hiện-trình
chặn quảng cáo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.