จะตรวจจับ Adblock บนเว็บไซต์ของฉันได้อย่างไร


370

ฉันต้องการตรวจสอบว่าผู้ใช้กำลังใช้ซอฟต์แวร์ adblocking หรือไม่เมื่อพวกเขาเยี่ยมชมเว็บไซต์ของฉัน หากพวกเขากำลังใช้งานอยู่ฉันต้องการแสดงข้อความที่ขอให้พวกเขาปิดเพื่อสนับสนุนโครงการเช่นเว็บไซต์นี้ทำ

หากคุณเข้าสู่ไซต์นั้นและเบราว์เซอร์ของคุณเปิดใช้งานซอฟต์แวร์ adblock บางประเภทเว็บไซต์นั้นแทนที่จะแสดงโฆษณาจริงแสดงแบนเนอร์เล็ก ๆ บอกผู้ใช้ว่ารายได้โฆษณาถูกนำไปใช้สำหรับการโฮสต์โครงการและควรพิจารณาปิด Adblock .

ฉันต้องการทำสิ่งนั้นบนเว็บไซต์ของฉันฉันใช้โฆษณาของ Adsense บนมันฉันจะทำสิ่งนั้นได้อย่างไร



5
สำหรับผู้ใช้ที่กำลังมองหาโซลูชันล่าสุดโปรดทราบว่ามีโซลูชันแบบเสียบได้ที่github.com/sitexw/BlockAdBlock
yeaske

5
บางคนไม่ชอบที่จะวิเคราะห์และโฆษณาบนเว็บ เว็บไซต์บางแห่งที่ฉันเคยเยี่ยมชมโดยบอกเราว่ารายได้สนับสนุนโครงการของพวกเขาติดขัดอยู่ในโฆษณาที่มันไร้สาระ
เปาโล

7
ขณะนี้ไซต์กำลังทำสิ่งนี้มากขึ้นเรื่อย ๆ (และใช้ในทางที่ผิดและโกหกเราเกี่ยวกับโฆษณาของพวกเขาที่ไม่เป็นอันตรายและบังคับให้เราทำรายการที่ปลอดภัยทั้งไซต์เพื่อป้อน ... ) - มีส่วนขยายหรือลูกเล่นใด ๆ จะป้องกันไม่ให้ตรวจพบว่าเราใช้ AdBlock + - ฉันไม่รังเกียจที่จะเห็นโฆษณาแบนเนอร์ที่ตรงเป้าหมายที่นี่หรือที่นั่น แต่คลิกที่ช่องเสียบและป๊อปอัปวิดีโอแบบเต็มหน้าจอคงที่ไม่ใช่สิ่งที่ฉัน
BrainSlugs83

1
โปรดดูวิธีแก้ปัญหาของฉันมันง่ายและสะอาด Pure JS ไม่มีการร้องขอพิเศษไม่มีไลบรารีหรือปลั๊กอินภายนอกหรือ BS อื่นใด
Cumulo Nimbus

คำตอบ:


410

โซลูชันของฉันไม่เฉพาะเจาะจงกับเครือข่ายโฆษณาบางรายการและมีน้ำหนักเบามาก ฉันใช้งานในการผลิตมาหลายปีแล้ว AdBlock บล็อก URL ทั้งหมดที่มีคำว่า "โฆษณา" ดังนั้นนี่คือสิ่งที่ฉันทำ:

ฉันเพิ่มไฟล์ js ขนาดเล็กลงใน webroot ของฉันด้วยชื่อ ads.js

นี่เป็นรหัสบรรทัดเดียวในไฟล์นั้น

var canRunAds = true;

ถ้าอย่างนั้นในหน้าของฉัน:

<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 ถูกบล็อกโดยตัวบล็อกโฆษณาเหล่านี้อย่างน้อยใน Chrome:

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • Ghostery

อัพเดทเมื่อวันที่ 2019-02-15:

เพิ่ม Ghostery ในรายการด้านบนเพราะตอนนี้ส่วนขยายบล็อกการร้องขอไปยัง ads.js ด้วย มีประโยชน์มาก นี่หมายความว่า Ghostery ช่วยให้เรา devs ตรวจพบการบล็อกโฆษณาด้วยส่วนขยายของพวกเขาหรือไม่?

ไม่ทำงานกับ:

ความเป็นส่วนตัวแบดเจอร์


1
คุณสามารถให้ลิงค์เต็มของjs/ads.jsโปรด? เป็นฉันใน blogger ฉันได้เพื่ออัปโหลด.jsที่ไหนสักแห่ง (เช่น: Google ไดรฟ์) adsและการเชื่อมโยงในกรณีที่ไม่ได้มี มันจะมีประโยชน์จริง ๆ ถ้าคุณให้ลิงค์ของไฟล์ของคุณ
Deb

91
ไฟล์มีเพียงคำว่า "var canRunAds = true;" ดังนั้นเพียงแค่สร้างมันขึ้นมาเอง
กำหนดเวลา

5
ตัวบล็อคโฆษณาบางตัวดูเหมือนจะไม่ปิดกั้นไฟล์ ads.js เช่นเดียวกับฉัน adblock อย่างง่ายสำหรับโครเมี่ยม
Mgamerz

2
ABP สำหรับโครเมียมตอบสนองได้ดีดังนั้นทำงานได้ดี!
Maxime Lafarie

9
คุณสามารถลองเรียกใช้ ajax ใน URL ที่ถูกบล็อคโดย adblocker หากประสบความสำเร็จจะไม่มี adblocker หากล้มเหลวก็จะมี adblocker
SethWhite

138

ไม่ใช่คำตอบโดยตรง แต่ฉันจะใส่ข้อความไว้ด้านหลังโฆษณาเพื่อโหลด ... แทนที่จะพยายามตรวจจับมันก็จะปรากฏขึ้นเมื่อโฆษณาไม่ได้


5
ผู้ใช้ยังสามารถบล็อกประกาศโฆษณาที่ถูกบล็อกเหล่านี้โดยใช้ Adblock: นั่นเป็นข้อบกพร่องเดียวที่ฉันรู้
Anderson Green

25
อาจเป็นเรื่องง่าย แต่ก็ไม่ใช่วิธีที่เหมาะสมที่จะทำหากรูปแบบของคุณผิดเพี้ยนหรือโหลดช้าผู้ใช้สามารถเห็นข้อผิดพลาดที่ไม่เกี่ยวข้องกับเขา นอกจากนี้โปรดทราบว่า Adblock กำลังใช้มาตรการเพื่อบล็อกข้อความที่สร้างความรำคาญให้กับผู้ใช้ ABP หากคุณต้องการขอให้ผู้ใช้ยกเลิกการปิดกั้นให้ทำผ่านข้อความที่ซ่อนได้ง่ายซึ่งอยู่นอกเลย์เอาต์ (ไม่ได้ผลักองค์ประกอบอื่น ๆ ออกไป) ดูduckduckgo.com/?q=foo+barเมื่อเปิดใช้งานadblock
Xeevis

1
@Xeevis - ฉันกำลังมองหาอะไร - ฉันคิดว่า AdBlock + บล็อกสิ่งที่ duckduckgo ทำอยู่แล้ว
BrainSlugs83

101

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

ด้วย jQuery:

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

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

แน่นอนคุณจะต้องมีหน้า Landing Page สำหรับ AdblockNotice.html และคลาส. myTestAd จะต้องแสดงถึงคอนเทนเนอร์โฆษณาของคุณจริง แต่มันก็ใช้ได้ดี

แก้ไข

ตามที่ TD_Nijboer แนะนำวิธีที่ดีกว่าคือใช้ตัวเลือก:hidden(หรือ:visibleตามที่ฉันใช้ด้านล่าง) เพื่อให้display: noneมีการตรวจสอบด้วย:

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

แน่นอนว่าทั้งสองอย่างนี้สามารถรวมกันเป็นหนึ่งifบล็อกได้ถ้าต้องการ

โปรดทราบว่าvisibility: hiddenจะไม่ถูกจับด้วยเช่นกัน (ในกรณีที่พื้นที่เลย์เอาต์อยู่ แต่โฆษณานั้นไม่ปรากฏให้เห็น) หากต้องการตรวจสอบว่าสามารถใช้ตัวกรองอื่นได้:

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

ซึ่งจะทำให้คุณมีองค์ประกอบของโฆษณาที่ "มองไม่เห็น" (ด้วยสิ่งใดก็ตามที่ยิ่งใหญ่กว่า0ปัญหาในทางทฤษฎี)


16
การเปลี่ยนเส้นทางในกรณีนี้เป็นความคิดที่ไม่ดี หากบริการโฆษณาของคุณไม่ทำงานผู้เยี่ยมชมทั้งหมดอาจถูกเปลี่ยนเส้นทางไปยังหน้านั้น ฉันขอแนะนำให้ใช้หน้าต่างเหตุการณ์การโหลดมากกว่าเอกสารพร้อม
Andy E

1
วิธีที่ดีกว่าในการตรวจจับคือ $ ('. myTestAd'). คือ (": ซ่อน"); ตามคู่มือระบุว่ามันยังตรวจพบว่าความกว้าง / ความสูงเป็น 0 และถ้า 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.จริง ไม่พูดถึงว่าพวกเขาเพียงแค่รวบรวมสคริปต์ง่าย ๆ เพื่อเอาชนะเคาน์เตอร์ นอกจากนี้คุณยังทำสิ่งที่เป็นจริงโดยการก้าวร้าวและมีพลังที่ผู้ใช้จะได้รับแรงจูงใจให้ปิดการใช้งานตัวป้องกันโฆษณาของพวกเขา? ไม่สิ่งที่จะทำให้สำเร็จคือการฉี่พวกเขาและทำให้พวกเขาสกปรกกับเว็บไซต์ของคุณ เว็บไซต์ส่วนใหญ่เลือกที่จะแสดงข้อความแทนที่จะเป็นศัตรู
Synetech

สิ่งนี้ไม่ได้ผลสำหรับฉันใน Chrome ในเหตุการณ์ DOMReady โฆษณายังคงปรากฏให้เห็น
nwellnhof

3
โปรดอย่าป้องกันผู้ใช้จากการเข้าสู่เว็บไซต์ของคุณเพราะพวกเขามีโฆษณาที่ปิดใช้งาน - ที่เพิ่งเพิ่มการแข่งขันอาวุธ - หากคุณขอให้เราเปิดใช้งานเราอาจทำ - หากคุณพยายามบังคับให้เราเราจะหยุดไปที่ไซต์ของคุณหรือเราจะรายงานข้อผิดพลาดใน adblocker ของเราและรับ มันได้รับการแก้ไขสำหรับเว็บไซต์ของคุณ - นี่เป็นลักษณะการทำงานที่แน่นอนที่ adblockers มีอยู่เพื่อปกป้องผู้ใช้
BrainSlugs83

93

ไม่มีคำขอพิเศษ ไม่มีห้องสมุดภายนอก 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);

  • คุณสร้างองค์ประกอบด้วยกล่องคลาส (ตามที่กำหนดเป็นองค์ประกอบแบบถอดได้ในไฟล์คำจำกัดความของ AdBlock Plus)
  • คุณเพิ่มลงในเอกสารและหลังจากนั้นไม่นานในขณะที่คุณอ่าน offsetHeight
  • หากติดตั้ง AdBlock องค์ประกอบจะไม่มีความสูงใด ๆ

ให้เครดิตกับการโพสต์ของ Christian Heilmannฉันคิดว่านี่เป็นทางออกที่ดีที่สุดในการตรวจจับ AdBlock


5
เพื่อป้องกันข้อผิดพลาดคุณสามารถเพิ่มtestAd.style.display = 'absolute'และย้ายออกจากหน้าจอได้
เจอราลด์

4
วิธีแก้ปัญหาที่ดี แต่สำหรับคนที่ทุกข์ทรมานจากความล่าช้า 100ms ฉันขอแนะนำให้เพิ่มสิ่งนี้ลงในร่างกาย 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>(แน่นอนหลังจากการทดสอบ css ควรเปลี่ยนเป็น<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
@ เจอรัลด์จุดที่ดี แต่ AFAIK absoluteเป็นpositionค่า
Em Seven

ฉันขอเพิ่มได้ฉันได้วิธีนี้ใช้งานได้เมื่อฉันเพิ่มภายในwindow.onloadฟังก์ชัน
Peter Cullen

โปรดทราบว่าสิ่งนี้ไม่สามารถใช้ได้กับ AdBlock สำหรับ Firefox
Eda190

42

โฆษณาส่วนใหญ่โหลดแบบไดนามิกใน javascript ฉันเพิ่งใช้เหตุการณ์ onerror เพื่อตรวจสอบว่าสคริปต์โฆษณาสามารถโหลดได้หรือไม่ ดูเหมือนว่าจะทำงาน

ตัวอย่างด้วย GoogleAds:

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

สามารถใช้กับองค์ประกอบอื่น ๆ ได้เช่นกันเพื่อดูว่าตัวบล็อคโฆษณากำลังบล็อกเนื้อหาหรือไม่ วิธีการนี้สามารถสร้างผลบวกปลอมหากองค์ประกอบระยะไกลไม่อยู่หรือไม่สามารถเข้าถึงได้


1
นี่เป็นวิธีที่ดีที่สุดวิธีหนึ่งในการตรวจสอบว่ามีการโหลดโฆษณาหรือไม่ .. เนื่องจากการโหลดสคริปต์ของคุณด้วยตนเองโดยอาศัยตัวบล็อกเกอร์เพื่อบล็อกสิ่งนั้นจะล้มเหลวในบางครั้ง ..
MaZZly

นี่น่าจะเป็นทางออกที่ดีที่สุดสำหรับสคริปต์ที่โหลดแบบไดนามิก
Carca

ไม่รู้ว่ามีอะไรเปลี่ยนแปลงไปบ้างตั้งแต่เขียน แต่ฉันไม่สามารถ onerror ที่จะยิงด้วยปลั๊กอิน Fair Adblock โดย STANDS chrome
Melchester

ณ เดือนมีนาคม 2018 ยังคงดีที่สุดที่เรียบง่ายและวิธีการแก้ปัญหาที่ชัดเจน
แดเนียล Vukasovich

อย่างที่กล่าวไว้ข้างต้นมันไม่สามารถใช้งานoffsetHeight
cieunteung

17

ในการตรวจสอบว่าผู้ใช้บล็อกโฆษณาหรือไม่สิ่งที่คุณต้องทำคือค้นหาฟังก์ชันในจาวาสคริปต์โฆษณาและลองทดสอบดู ไม่สำคัญว่าพวกเขาใช้วิธีใดในการบล็อกโฆษณา นี่คือลักษณะของโฆษณา Google Adsense:

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

วิธีนี้แสดงไว้ที่นี่: http://www.metamorphosite.com/detect-web-popup-blocker-software-adblock-spam


8
google_render_ad ไม่ได้กำหนดไว้ทุกที่ทุกเวลาพิมพ์ (window.google_jobrunner)! = 'วัตถุ' ใช้งานได้สำหรับฉัน
Dmitrii Korotovskii

4
เนื่องจากไม่ใช่รหัสที่คุณควบคุมฉันคิดว่ามันเป็นความคิดที่ไม่ดีที่จะใช้สิ่งนี้เนื่องจากผู้ออกแบบไลบรารีจะทำให้สคริปต์ของคุณตรวจพบบล็อกโฆษณาสำหรับผู้ใช้ทั้งหมด
แพทริคลืม

1
typeofเป็นค่าใช้จ่ายถ้าคุณตรวจสอบคุณสมบัติของวัตถุ === undefinedการใช้งานง่าย
Robo Robok

12

ทางออกที่ง่ายที่สุดของฉันด้วย jquery คือ:

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

โฆษณา.jsไม่มีอะไรเลย เมื่อใครบางคนใช้ adblock มันล้มเหลวและฟังก์ชั่นได้รับการเรียก


10

ฉันรู้ว่ามีคำตอบอยู่แล้วพอ แต่เนื่องจากคำถามนี้ขึ้นมาบน Google ค้นหา "ตรวจสอบ Adblock" ที่หัวข้อที่ผมอยากจะให้ข้อมูลเชิงลึกบางอย่างในกรณีที่คุณไม่ได้ใช้ AdSense

ด้วยตัวอย่างนี้คุณสามารถตรวจสอบว่ามีการใช้รายการ Adblock เริ่มต้นที่มีให้โดย Firefox Adblock หรือไม่ #bottomAdจะใช้ประโยชน์ว่าในรายการบล็อกนี้มีองค์ประกอบที่ถูกปิดกั้นด้วยรหัสแบบ CSS หากฉันรวมองค์ประกอบดังกล่าวในหน้าและทดสอบความสูงของมันฉันรู้ว่าการปิดกั้นโฆษณานั้นทำงานอยู่หรือไม่:

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

ส่วนที่เหลือจะทำผ่านผู้ต้องสงสัย jQuery ปกติ:

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

ดังที่เห็นได้ว่าฉันใช้setTimeoutเวลาอย่างน้อย 1 มิลลิวินาที ฉันได้ทดสอบสิ่งนี้กับเบราว์เซอร์ต่างๆและส่วนใหญ่แล้วตรวจสอบองค์ประกอบในreadyคืน 0 เสมอ; ไม่ว่าตัวปิดกั้นจะทำงานหรือไม่ก็ตาม ฉันมีความคิดสองประการเกี่ยวกับเรื่องนี้: การแสดงผลยังไม่เสร็จหรือ Adblock ยังไม่เริ่มเล่น ฉันไม่ได้กังวลที่จะตรวจสอบเพิ่มเติม


ฉันชอบคำตอบนี้มากเพราะมันไม่ได้เกี่ยวข้องกับการร้องขอพิเศษจะมีข้อเสียสำหรับวิธีการนี้แทนที่จะเป็นคำขอปลอม ads.js หรือไม่
JeroenVdb

แทนที่จะทดสอบความยาวและความสูงคุณไม่สามารถใช้ถ้า ($ ("# bottomAd"). คือ (': ซ่อนอยู่')) ... ?
Evan Langlois

@EvanLanglois ฉันรู้ว่าคุณถามเมื่อสองปีก่อน แต่คำถามของคุณสนใจฉันจริง ๆ ฉันเลยไปดำน้ำเพื่อดูข้อมูล เห็นได้ชัดว่าการ.is(":hidden")ตรวจสอบขึ้นอยู่กับว่าทั้งความสูงและความกว้างเป็นศูนย์ หากคุณเพิ่งตั้งความสูงเป็น 0 แต่ div ยังคงใช้ความกว้างอยู่จะไม่ถือว่า "ซ่อน" โดย jQuery ดังนั้นไม่ว่าคุณจะพูดหรือไม่.is(":hidden")ก็ขึ้นอยู่กับว่า adblocker ตัดสินใจปรับขนาด / ซ่อนเนื้อหาอย่างไร
Spencer D

10

คำแนะนำของฉันคือ: อย่าทำมัน!

สถานการณ์ใดก็ตามที่คุณปฏิบัติต่อผู้คนในฐานะ "ผู้กระทำผิด" จะส่งผลให้พวกเขาต่อสู้กลับ

นี่คือข้อเสนอของฉัน

ใส่ข้อความสร้างความรำคาญเล็ก ๆ ที่ด้านบนของหน้า (ไม่ว่าโฆษณาจะถูกบล็อก) ที่มีข้อความI *totally* respect your right to block adsและลิงค์ไปยังหน้าอื่น / pop-up Read more ...สิทธิ

ในหน้าอื่น ๆ ให้ชัดเจนว่าคุณเข้าใจว่าเป็นคอมพิวเตอร์ของพวกเขาและพวกเขามีอิสระที่จะใช้การบล็อกโฆษณา

และทำให้ชัดเจนในลักษณะที่ไม่มีการกล่าวหาว่าการใช้ตัวบล็อกเหล่านี้ทำให้คุณส่งเนื้อหาที่ยอดเยี่ยมได้ยากขึ้น (อธิบายเหตุผลในรายละเอียด) และในขณะที่คุณต้องการให้โฆษณาปิดกั้นไม่ให้เกิดขึ้นในเว็บไซต์ของคุณ มันเป็นการตัดสินใจของพวกเขาทั้งหมด มุ่งเน้นไปที่ข้อดีของการปิดการบล็อก

ผู้ที่ต่อต้านโฆษณาจะเพิกเฉยต่อสิ่งนี้ แต่คุณไม่เคยมีโอกาสโน้มน้าวพวกเขา คนที่ไม่แยแสอาจโดนอิทธิพลจากคำอุทธรณ์ของคุณเพราะคุณไม่ได้ทำทั้งหมด "ให้ฉันไปทางของฉันหรือฉันจะเอาบอลแล้วกลับบ้าน" สิ่งที่จริง ๆ แล้วควรเป็นโดเมนพิเศษของเด็กอายุห้าขวบ

โปรดจำไว้ว่าไม่มีใครถือปืนไว้ที่หัวคุณและบังคับให้คุณเอาสิ่งของใส่ในเน็ต ปฏิบัติต่อผู้อ่าน / ผู้ใช้ของคุณด้วยความเคารพและคุณอาจพบว่ามีคนจำนวนมากจะตอบสนอง


1
เกี่ยวกับ "ดูเหมือนคุณใช้ ad ad blocker มันยอดเยี่ยม! เราทำเช่นนั้น :) โปรดสนับสนุน X ด้วยการบอกเพื่อนของคุณเกี่ยวกับเรา!"
ADTC

3
heh พยายามสร้างรายได้ด้วยวิธีนี้ ... โฆษณาเป็นวิธีการชำระเงินปกติดังนั้นผู้ใช้ควรจ่าย
dev1223

อะไรคือรูปแบบของฉันที่พังเมื่อ adblock เปิด
godblessstrawberry

5
หากเว็บไซต์บังคับให้ฉันปิดการใช้งานเครื่องมือป้องกันโฆษณาของฉันฉันจะดำเนินการต่อ พวกเขาสูญเสียและฉันไม่สนใจ ฉันเพิ่งดึงสำเนาแคชจาก Google
RayfenWindspear

1
@Tallboy ไม่มีคำตอบในจริยธรรมของฉัน มีเพียงความเป็นจริงของผู้ชมที่คุณพยายามกำหนดเป้าหมาย และแม้ว่าความตั้งใจของคุณอาจเป็นไปตามที่อธิบายไว้ แต่การอ่านคำถามอีกครั้งจะแสดงให้คุณเห็นว่าเป็นการขอให้ผู้ใช้อนุญาตโฆษณาโดยเฉพาะไม่ให้ล้างข้อมูลเลย์เอาต์หรือบางอย่าง นั่นเป็นคำถามที่ฉันตอบไม่ได้คิดคำถามอื่น ๆ อีกครึ่งทศวรรษหลังจากนั้น :-)
paxdiablo

9

พวกเขาใช้ประโยชน์จากความจริงที่ว่าโค้ดโฆษณาของ Google สร้าง iframe ด้วย id "iframe" ดังนั้นตราบใดที่คุณยังไม่มีบางสิ่งบนหน้าเว็บของคุณที่มี ID นั้นสิ่งนี้ก็ใช้ได้กับคุณเช่นกัน

<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

เพียงเพิ่มสคริปต์เล็ก ๆ บนเว็บไซต์ของคุณ:

var isAdsDisplayed = true;

ด้วยชื่อadsbygoogle.js

จากนั้นทำตาม:

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

พบโซลูชันนี้ที่นี่


นี้เป็นคนที่น่ากลัวขอบคุณมาก💓
Jodyshop

8

ฉันสังเกตเห็นความคิดเห็นก่อนหน้าใช้ google Adsense เป็นวัตถุทดสอบ บางหน้าไม่ใช้ adsense และการใช้ adsense block เนื่องจากการทดสอบไม่ใช่ความคิดที่ดี เพราะบล็อก Adsense อาจเป็นอันตรายต่อ SEO ของคุณ นี่คือตัวอย่างวิธีตรวจสอบโดย adblocker simple class ถูกบล็อก:

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" เป็นรหัสที่ adblocker บล็อก ดังนั้นการตรวจสอบถ้ามันสามารถมองเห็นได้คุณสามารถตรวจพบว่า adblocker เปิดอยู่


7

AdBlock ดูเหมือนว่าจะบล็อกการโหลดไฟล์ JavaScript ของ AdSense (ฯลฯ ) ดังนั้นหากคุณใช้โฆษณา AdSense เวอร์ชันอะซิงโครนัสคุณสามารถตรวจสอบว่าadsbygoogleเป็นหรือArrayไม่ ต้องตรวจสอบสิ่งนี้หลังจากไม่กี่วินาทีเนื่องจากสคริปต์อะซิงโครนัสคือ ... อะซิงโครนัส นี่คือเค้าโครงคร่าวๆ :

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

ในการชี้แจงนี่คือตัวอย่างของโค้ดโฆษณาแบบอะซิงโครนัสของ 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>

ขอให้สังเกตว่าadsbygoogleจะเริ่มต้นเป็นแบบ Array adsbygoogle.jsห้องสมุดเปลี่ยนแปลงอาร์เรย์นี้ในObject {push: ...}เมื่อมันรัน การตรวจสอบประเภทของตัวแปรหลังจากระยะเวลาหนึ่งสามารถบอกคุณได้ว่าสคริปต์ถูกโหลดหรือไม่


วิธีนี้จะใช้เวลาส่วนใหญ่ แต่ถ้าผู้ใช้มีการเชื่อมต่อที่ช้า (คิดว่าอุปกรณ์มือถือ)?
Luca Steeb

6

ฉันใช้วิธีนี้ในเว็บไซต์ของฉันบางทีคุณอาจพบว่ามีประโยชน์ ในความคิดของฉันมันเป็นที่ง่ายวิธีการแก้ปัญหา

AdBlocker บล็อกคลาสและองค์ประกอบ html ที่เฉพาะเจาะจงโดยการตรวจสอบตัวเลือกเหล่านี้ของโฆษณาที่ถูกบล็อกในคอนโซลนักพัฒนาซอฟต์แวร์ (อยู่ในรายการทั้งหมด) คุณสามารถดูองค์ประกอบที่จะถูกบล็อกเสมอ

เช่นเพียงตรวจสอบหน้าคำถามนี้ใน stackoverflow และคุณจะเห็นโฆษณาที่ถูกบล็อกจำนวนมาก

ตัวอย่างเช่นองค์ประกอบใด ๆ ที่มีbottom-adคลาสจะถูกบล็อกโดยอัตโนมัติ

  1. ฉันสร้างองค์ประกอบ div ที่ไม่ว่างกับbottom-adคลาส: <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. หลังจากโหลดหน้าเว็บแล้วให้ตรวจสอบว่าองค์ประกอบนี้ถูกซ่อนหรือไม่ ฉันใช้ jQuery แต่รู้สึกอิสระที่จะใช้ javascript: $('.bottom-ad').css('display') == "none"หรือดีกว่าโดยใช้$('.bottom-ad').is(':visible')

หากมีค่าtrueAdBlocker จะทำงาน


6

คุณไม่ต้องการคำขอ HTTP พิเศษคุณเพียงแค่คำนวณความสูงของการเพิ่มปลอม

นี่คือรายการทั้งหมดที่ตรงกับองค์ประกอบที่ 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>


6

วิธีที่ปลอดภัยคือห่อโฆษณาของคุณไว้ด้านใน<div>และตรวจสอบความสูง

<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 และไฟร์วอลล์ bluehell


6

วิธีที่มีประสิทธิภาพในการตรวจสอบว่ามี adblock หรือไม่: เพียงตรวจสอบว่ามีการเปิดใช้งาน adblock หรือไม่โดยพยายามเรียก URL ของโฆษณา google หากใช่ให้เรียกใช้ callback_has_adblock หากไม่ใช้งานให้เรียกใช้ callback_no_adblock โซลูชันนี้มีค่าใช้จ่ายมากกว่าหนึ่งคำขอ แต่อย่างน้อยก็ใช้งานได้:

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

วิธีนี้ใช้ได้กับโฆษณาทุกประเภทไม่เพียง แต่ Adsense ของ Google


adblockers บางคนบล็อก jQuery ดังนั้นสคริปต์จะไม่ทำงานเนื่องจาก "$ ไม่ได้กำหนด" ควรใช้ js บริสุทธิ์
nyx

3

แม้อายุของคำถามนี้ฉันเพิ่งพบว่ามีประโยชน์มากและสามารถคาดเดาได้เท่านั้นที่มีคนอื่นยังคงดูอยู่ หลังจากดูที่นี่และที่อื่น ๆ ฉันคิดว่าหลักสามด้านลูกค้าตรวจสอบทางอ้อมตรวจพบ ad blocker คือการตรวจสอบถูกบล็อก div / imgบล็อกiframeและทรัพยากรที่ถูกบล็อก (ไฟล์จาวาสคริปต์)

อาจจะอยู่ด้านบนหรือหวาดระแวง แต่ครอบคลุมสำหรับระบบปิดกั้นโฆษณาที่ปิดกั้นการเลือกเพียงหนึ่งหรือสองครั้งดังนั้นจึงอาจไม่ได้รับการคุ้มครองหากคุณทำการตรวจสอบเพียงครั้งเดียว

ในหน้าของคุณกำลังเรียกใช้การตรวจสอบเพิ่ม: (ฉันใช้ 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>

และเพิ่มรายการต่อไปนี้จากที่อื่นในหน้า:

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

ฉันใช้ div ที่มีชื่อเหยื่อรวมถึงรูปภาพที่โฮสต์ภายนอกด้วยข้อความ "Advert" และขนาดที่ AdSense ใช้ (ขอบคุณ placehold.it!)

ในadvertisement.jsคุณควรผนวกบางสิ่งลงในเอกสารซึ่งเราสามารถตรวจสอบได้ในภายหลัง แม้ว่าดูเหมือนว่าคุณจะเคยทำมาก่อน แต่คุณกำลังตรวจสอบไฟล์ ( advertisement.js) ตัวเองกำลังโหลดอยู่ไม่ใช่เอาท์พุท

$(document).ready(
{

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

});

จากนั้นสคริปต์ตรวจจับตัวบล็อกโฆษณาซึ่งรวมทุกอย่างเข้าด้วยกัน

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

});

เมื่อเอกสารพร้อมเช่นโหลดมาร์กอัปเราจะเพิ่ม iframe ลงในเอกสารด้วย จากนั้นเมื่อโหลดหน้าต่างเช่นเนื้อหารวม โหลดภาพ ฯลฯ แล้วเราตรวจสอบ:

  • ขนาดและการมองเห็นของ div การทดสอบครั้งแรก
  • ว่าเนื้อหาของ div ทดสอบที่สองคือ "การตรวจสอบ" ในขณะที่มันจะได้รับถ้าadvertimsent.jsถูกไม่ถูกปิดกั้น
  • ขนาด (และฉันคิดว่าการมองเห็นเป็นวัตถุที่ซ่อนอยู่ไม่มีความสูงหรือความกว้าง?) ของ iframe

และรูปแบบ:

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

div#myTestAd2
{
    display: none;
}

หวังว่านี่จะช่วยได้


3

หากใช้รหัส AdSense ใหม่คุณสามารถทำการตรวจสอบได้อย่างง่ายดายโดยไม่ต้องใช้การตรวจสอบเนื้อหาหรือการตรวจสอบ css

วางโฆษณาของคุณตามปกติในมาร์กอัปของคุณ:

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

จากนั้นคุณเรียกรหัส Adsense ที่ด้านล่างของหน้า (หมายเหตุอย่าใช้การ"async"ตั้งค่าสถานะเมื่อเรียกadsbygoogle.jsสคริปต์):

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

จากนั้นเพิ่มส่วนย่อยเล็ก ๆ ของรหัสด้านล่างนี้:

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

AdSense จะสร้าง / ชุดธงadsbygoogle.loadedไปtrueเมื่อโฆษณาที่มีการโหลดคุณสามารถวางการตรวจสอบในการทำงาน setTimeout ให้ชะลอการตรวจสอบโดยไม่กี่วินาที


2
แน่นอนนี้ขึ้นอยู่กับว่าโฆษณาถูกบล็อกอย่างไร หากซอฟต์แวร์ adblocking ของคุณป้องกันไม่ให้ AdSense โหลดพร้อมกันจะสามารถใช้งานได้ แต่หากซอฟต์แวร์ adblocking ของคุณกำลังทำบางอย่างเช่นการตั้งค่าคุณสมบัติการแสดงผล CSS เป็น "none" หรือความสูงของ div ที่เกี่ยวข้องเป็น 0 นั่นอาจไม่ทำงาน
กรุงเทพ

จริง ฉันไม่คิดว่าจะมีวิธีที่ง่ายในการจับตัวบล็อกโฆษณาทั้งหมด 100% แต่อย่างน้อยคุณก็สามารถจับมันได้
ทรอยมอร์เฮาส์

3

adblocker ส่วนใหญ่ยกเลิกการร้องขอ HTTP ads.jsและสร้าง0pxองค์ประกอบ แต่บางครั้ง adblocker ก็ลบ DOMและคำตอบบางอย่างข้างต้นจะล้มเหลวเนื่องจากไม่ตรวจสอบองค์ประกอบที่มีอยู่

การใช้ setTimeout()เป็นแนวปฏิบัติที่ดีเพราะหากไม่ใช้ก็จะทำให้สคริปต์แข่งขันกับ adblocker

สคริปต์ด้านล่างจะตรวจสอบว่ามีอยู่ / ถูกลบและตรวจสอบoffsetHeightองค์ประกอบถ้ามีอยู่

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

คำตอบทั้งหมดข้างต้นนั้นถูกต้อง แต่ส่วนใหญ่จะไม่สามารถใช้งานการบล็อกโฆษณาระดับ DNS ได้

ตัวบล็อกโฆษณาระดับ DNS (เช่นpi-hole ) โดยทั่วไปจะแสดงผลคืน NXDOMAIN (ไม่มีโดเมน) สำหรับรายการของโดเมนที่ปิดกั้นโฆษณา (เช่น telemetry.microsoft.com จะ "ไม่มีอยู่" เมื่อเป็นเช่นนั้น)

มีสองสามวิธีในการหลีกเลี่ยงสิ่งนี้:

วิธี A : ร้องขอโฆษณาตามที่อยู่ ip ไม่ใช่โดเมน

วิธีนี้ค่อนข้างน่ารำคาญเพราะคุณต้องติดตามที่อยู่ IP นี่จะเป็นปัญหาหากรหัสของคุณไม่ได้รับการดูแลอย่างดีหรืออัพเดทเป็นประจำ

วิธี B : บล็อกทั้งหมดคำขอที่ล้มเหลวแม้ว่าไคลเอนต์จะรายงาน NXDOMAIN

สิ่งนี้จะสร้างความรำคาญแก่ผู้ใช้หากเป็น "ที่ถูกต้อง" NXDOMAIN


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>

และในไฟล์ getbanner.cfm:

adb = false;

ฉันคิดว่ามันเป็นวิธีที่ง่ายที่สุดในการตรวจสอบ adblock


ไฟล์ที่ถูกปิดกั้นอื่น ๆ : easylist-downloads.adblockplus.org/easylist.txtมันเป็นค่าเริ่มต้นตัวกรอง AdBlock
mikas

adb น่าจะเป็นtrueเสมอ
Deb

1

นี่คือสิ่งที่ได้ผลสำหรับฉัน:

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

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

เพิ่งลองสิ่งนี้; ไม่ทำงาน, ไม่เป็นผล. กลับมาจริงเสมอแม้ว่าจะไม่ได้ติดตั้งซอฟต์แวร์ปิดกั้นโฆษณา
ecnepsnai

โปรดทราบว่านี่จะใช้งานได้ในหน้าเว็บที่คุณใช้งาน AdSense เท่านั้น มิฉะนั้นจะส่งคืนจริงเสมอเพราะนั่นเป็นคำตอบที่ถูกต้อง - window.google_jobrunner จะไม่ถูกตรวจพบในทุกหน้า เฉพาะรายการที่ใช้งาน Google AdSense เท่านั้น คุณสามารถเห็นรหัสนี้ทำงานได้บนเว็บไซต์ของฉัน: ruddl.com
jesal

ที่น่าสนใจว่าวิธีการของคุณเกิดขึ้นที่จะใช้ข้อความเดียวกันกับที่ใช้โดยHowToGeek สำหรับระเบียนการแสดงกล่องข้อความไม่ได้ทำอะไรนอกจากสร้างความรำคาญและทำให้ผู้ใช้สกปรกกับไซต์ของคุณ ไซต์ส่วนใหญ่เลือกที่จะแสดงข้อความในหน้าเว็บ (HTG พยายามทำทั้งสองอย่าง แต่ทำงานได้เฉพาะป๊อปอัปที่น่ารำคาญ)
Synetech

1

ฉันรู้ว่านี่ตอบแล้ว แต่ฉันดูเว็บไซต์ตัวอย่างที่แนะนำและฉันเห็นพวกเขาทำเช่นนี้:

<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

ไม่จำเป็นต้องใช้การหมดเวลาและการดมดม DOM เพียงพยายามโหลดสคริปต์จากเครือข่ายโฆษณายอดนิยมและดูว่าตัวบล็อกโฆษณาขัดขวางคำขอ 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';
});

1

เพิ่งสร้าง "ปลั๊กอิน" ของฉันเองเพื่อแก้ปัญหานี้และมันใช้งานได้ดีจริงๆ

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

ผมเพิ่มความเข้ากันได้โทรศัพท์มือถือและการตรวจสอบ jsBlocking เหนือสิ่งอื่นใด ... (เช่นเดียวกับการซ้อนทับที่แสดงให้กับผู้ใช้ขอให้ปิดการใช้งานที่adBlocking / jsBlockingซอฟต์แวร์); ยังทำให้มันตอบสนองเป็นมิตร

มัน opensourced ภายใต้ใบอนุญาต Coffeeware


ชื่นชมความพยายาม แต่ดูเหมือนจะไม่ทำงานกับ adblock ... อย่างน้อยก็ในขณะที่เขียนความคิดเห็นนี้
arunskrish

มันใช้งานได้กับ adBlock ไซต์ที่ฉันใช้งานปลั๊กอินนี้คือ calyphrox.net ซึ่งทุกคนสามารถตรวจสอบปลั๊กอินได้
Jmlevick

3
ลิงก์ is Dead ... เราจะลบได้ไหม?
Evan Langlois

2
โปรดอัปเดตลิงก์ซึ่งทำให้นี่เป็นคำตอบที่ไม่ดี
Yazan Rawashdeh

0

ฉันเข้าใจความตึงเครียดของคุณและคุณสามารถตรวจสอบว่าองค์ประกอบถูกสร้างขึ้นโดยสคริปต์หรือองค์ประกอบถูกซ่อนอยู่หรือไม่ และหากเราพูดถึงการปิดกั้นโฆษณาคุณสามารถนับได้เฉพาะกับการเปิดเผยองค์ประกอบไม่ใช่การปรากฏตัวขององค์ประกอบ

องค์ประกอบที่สร้างขึ้นด้วยสคริปต์ของบุคคลที่สามจะไม่ปรากฏว่าหากสคริปต์ไม่สามารถเข้าถึงได้ในขณะนี้ (ข้อผิดพลาด DNS, ข้อผิดพลาดของเว็บเซิร์ฟเวอร์ระยะไกล, โหลดหน้าเว็บออฟไลน์ล่วงหน้าเป็นต้น) และคุณจะได้รับผลบวกปลอมเสมอ

คำตอบอื่น ๆ ทั้งหมดที่มีการตรวจสอบนั้นถูกต้อง แต่พึงระลึกไว้เสมอ


0

timing's คิดว่าคำตอบเป็นสิ่งที่ดี แต่ไม่ทำงานอีกต่อไปดังนั้นฉันได้อัปเดตชื่อไฟล์ js เป็น 'adsense' จาก 'ads' และมันกลับมาใช้งานได้อย่างมีเสน่ห์!

นี่คือรหัสบางทีสิ่งนี้จะช่วยใครซักคน:

<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 ใส่บรรทัดนี้: var adblockDetecter = true;


0

ขณะนี้มีวิธีที่ดีกว่าในการใช้สคริปต์ JS ที่เรียกว่าAdBlock Detector
ต่อไปนี้เป็นวิธีใช้:
เพิ่มใน<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>

ตอนนี้คุณสามารถใช้ab-messageรหัสได้ทุกที่ที่คุณต้องการแสดงข้อความถึงผู้ใช้ AdBlock:

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

สังเกตสไตล์แบบอินไลน์ที่เพิ่มเพื่อซ่อนไว้ในตอนแรก (แน่นอนคุณสามารถทำได้จากไฟล์ CSS ของคุณเอง)
นอกจากนี้โปรดทราบว่าต้องใช้เวลา 500 มิลลิวินาทีนั่นเป็นเพราะต้องรอให้ adblocker ทำสิ่งนั้นหรือไม่ทำงาน

คำอธิบายเล็กน้อยเกี่ยวกับการทำงานของสคริปต์นี้

ก่อนอื่นมันจะผนวก iframe ที่มีแหล่งที่มาของลิงค์ที่สร้างแบบสุ่ม (มันถูกสร้างแบบสุ่มเพราะ adblocks บางอันฉลาดในบางจุดพวกเขารู้ว่าลิงค์นั้นเป็นของปลอม)
จากนั้นจะรันการตรวจสอบหลายครั้งบน iframe นั้น (หากโหลดสำเร็จหรือมีการปรับเปลี่ยนสไตล์) หากหนึ่งในการทดสอบเหล่านี้เป็นจริงมันจะแสดงab-messageองค์ประกอบให้กับผู้ใช้ adblock

สคริปต์นี้ใช้ได้กับตัวบล็อกโฆษณาส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด)

EXTRA

ไม่มีจุดจริง ๆ แล้วเพิ่งจะสร้างเพียงส่วนสำคัญ แต่ฉันสร้างโครงการ Github แทน แต่ก็ยังตรวจสอบมันออกมาและติดดาวถ้ามันช่วยคุณได้
abDetector: เครื่องมือตรวจจับ AdBlock ของวานิลลาอย่างง่าย
สนุก.


ทางออกที่ไม่ดี ไฟล์. js ภายนอกถูกบล็อกได้ง่าย
กรุงเทพ

@Bangkokian เพียงแค่คัดลอกและอ้างอิง (และใบอนุญาต) ในข้อความของคุณที่แสดงไฟล์ javascript หรือ index.js (หรืออะไรก็ตาม)
BlueEyesWhiteDragon

1
@BlueEyesWhiteDragon คุณถูกต้อง แต่นั่นไม่ใช่สิ่งที่ทรอยเดิมตอบ ขณะนี้ได้รับการแก้ไข 100% เพื่อแสดงสคริปต์แบบอินไลน์ ความคิดเห็นของฉันยืนอยู่ คำตอบเดิมของเขาคือใช้สคริปต์ภายนอกโดยเฉพาะ stackoverflow.com/posts/34738388/revisions
Bangkokian

@Bangkokian แน่นอนฉันลืมที่จะพูดถึงว่าขอบคุณความคิดเห็นของคุณฉันแก้ไขคำตอบของฉันที่จะปฏิบัติตามแนวทาง SO และทำให้มันเป็นสคริปต์แบบอินไลน์ ขอบคุณ.
Nick Rameau

0

คุณสามารถตรวจสอบสิ่งนี้ได้มันอาจช่วย detect-adblocker

มันใช้งานของคำตอบเวลา

เพิ่มสิ่งนี้ก่อนสคริปต์ใด ๆ ในแท็กหัว:

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

จากนั้นใช้ภายหลัง:

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

มันไม่ทำงาน มันมักจะแสดงว่าโฆษณาถูกบล็อก
Himanshu Aggarwal

ตรวจสอบค่าwindow.adblockerในคอนโซลเบราว์เซอร์ของคุณถ้ามันกลับมาtrueแล้วเปิดใช้งานfalse
adblocker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.