내 웹 사이트에서 Adblock을 감지하는 방법은 무엇입니까?


370

사용자가 내 웹 사이트를 방문 할 때 광고 차단 소프트웨어를 사용하고 있는지 감지하고 싶습니다. 그들이 그것을 사용하고 있다면, 나는 이 웹 사이트 처럼 프로젝트를 지원하기 위해 끄도록 요청하는 메시지를 표시하고 싶습니다 .

해당 사이트에 들어가서 브라우저에 일종의 애드 블록 소프트웨어가 활성화 된 경우 실제 광고를 표시하는 대신 사이트에 광고 수익이 프로젝트를 호스팅하는 데 사용됨을 알리는 작은 배너가 표시됩니다. .

내 웹 사이트에서 그렇게하고 싶습니다. 애드 센스 광고를 사용하고 있습니다. 어떻게해야합니까?



5
최신 솔루션을 찾는 사용자의 경우 github.com/sitexw/BlockAdBlock
yeaske

5
어떤 사람들은 웹에서 분석하고 광고하는 것을 좋아하지 않습니다. 내가 방문한 일부 사이트는 수익이 프로젝트를 지원한다고 광고에 너무 혼란스러워 진다고 알려줍니다.
Paul

7
이제 사이트에서 점점 더 많은 작업을 수행하고 있으며 (광고를 악용하고 광고에 방해가되지 않고 사이트 전체를 허용하도록 강제로 등록하도록 강요하고 있습니다 ...)-사용할 수있는 확장 기능이나 트릭이 있습니까? 그들이 AdBlock +를 사용하는 것을 감지하지 못하도록하기 위해? -여기저기서 몇 가지 타겟 배너 광고를 볼 수는 없지만 클릭 재킹 (click jacking) 및 지속적인 전체 화면 비디오 팝업은 제 것이 아닙니다.
BrainSlugs83

1
내 솔루션을 참조하십시오. 간단하고 깨끗합니다. 순수 JS, 추가 요청, 외부 라이브러리 또는 플러그인 또는 기타 BS가 없습니다.
Cumulo Nimbus

답변:


410

내 솔루션은 특정 광고 네트워크에만 국한되지 않으며 매우 가볍습니다. 나는 몇 년 동안 프로덕션 환경에서 운영해 왔습니다. AdBlock은 "ads"라는 단어가 포함 된 모든 URL을 차단합니다. 이것이 내가 한 일입니다.

작은 js 파일을 웹 루트에 이름으로 추가했습니다. 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에서 다음과 같은 애드 블로커에 의해 차단됩니다.

  • 애드 블록
  • 애드 블록 플러스
  • 애드 블록 프로
  • 유령

2019-02-15에 업데이트 :

확장 프로그램이 ads.js에 대한 요청도 차단하므로 위 목록에 Ghostery가 추가되었습니다. 매우 편리합니다. 이것은 Ghostery가 실제로 개발자가 확장 프로그램을 사용하여 광고가 차단되는 것을 감지하는 데 도움이된다는 것을 의미합니까?

작동하지 않습니다 :

프라이버시 오소리


1
당신은 전체 링크를 줄 수 js/ads.js있습니까? 블로거에 .js있을 때 어딘가에 (Google 드라이브와 같은) 업로드해야 했으며 그 경우 링크에 포함되어 있지 않습니다 ads. 파일의 링크를 제공하면 정말 도움이 될 것입니다.
Deb

91
이 파일에는 "var canRunAds = true;"라는 단어 만 포함됩니다. 직접 작성하십시오.
타이밍

5
일부 광고 차단기는 나에게 크롬과 같은 간단한 광고 차단과 같은 ads.js 파일을 차단하지 않는 것 같습니다.
Mgamerz

2
크롬 용 ABP가 잘 반응하므로 모든 것이 제대로 작동합니다!
Maxime Lafarie

9
애드 블로커가 차단 한 URL에서 아약스 요청을 실행할 수도 있습니다. 성공하면 애드 블로커가없고, 실패하면 애드 블로커가있는 것입니다.
SethWhite

138

직접적인 대답은 아니지만 광고 뒤에 메시지를로드하여 표시하려고합니다. 감지하려고하면 광고가 표시되지 않을 때 표시됩니다.


5
사용자는 여전히 Adblock을 사용하여 차단 된 광고 알림을 차단할 수 있습니다. 이것이 내가 아는 유일한 결함입니다.
Anderson Green

25
쉬운 일이지만 적절한 방법이 아닙니다. 레이아웃이 왜곡되거나 광고가 느리게로드되면 사용자는 자신과 관련이없는 오류를 파악할 수 있습니다. 또한 Adblock은 ABP 사용자를 대상으로하는 방해 메시지를 차단하기위한 조치를 취하고 있습니다. 사용자에게 차단 해제를 요청하려면 레이아웃 외부에있는 간단한 숨길 수있는 메시지를 통해 요청하십시오 (다른 요소를 밀지 않음). 애드 블록이 활성화 된 duckduckgo.com/?q=foo+bar 를 보십시오 .
Xeevis

1
@ Xeevis-무엇을 찾고 있습니까? -AdBlock +는 이미 duckduckgo가하는 모든 것을 차단한다고 생각합니다.
BrainSlugs8383

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

물론 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
이 경우 리디렉션은 나쁜 생각입니다. 광고 서비스가 중단되면 모든 방문자가 해당 페이지로 리디렉션 될 수 있습니다. 또한 문서 준비가 아닌 window onload 이벤트를 사용하는 것이 좋습니다.
Andy E

1
더 나은 감지 방법은 $ ( '. myTestAd'). is ( ": hidden")입니다. 수동으로 지정하면 너비 / 높이가 0인지 여부와 표시 = 없음을 감지합니다.
TD_Nijboer 2013

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
광고가 비활성화되어 사용자가 사이트를 방문하는 것을 막지 마십시오. 광고 경쟁이 확대됩니다. -당신이 친절하게 우리에게 그들을 켜달라고 요청하면, 우리는 그냥 할 수 있습니다. 만약 당신이 우리를 강제로 시도한다면, 우리는 단지 당신의 사이트로가는 것을 멈추거나, 애드 블로커에 버그를보고 할 것입니다. 귀하의 사이트에 맞게 수정되었습니다. -이것은 사용자를 보호하기 위해 애드 블록 커가 존재하는 정확한 유형의 동작입니다.
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);

  • 클래스 adsbox를 사용하여 요소를 만듭니다 (AdBlock Plus의 정의 파일에 이동식 요소로 정의 됨)
  • 문서에 추가하고 offsetHeight를 읽는 동안 잠시 후
  • AdBlock이 설치된 경우 요소의 높이가 없습니다.

에 신용 기독교 Heilmann의 게시물에 , 나는 그것이 지금까지 AdBlock을을 검출하기위한 가장 좋은 방법 같아요.


5
결함을 방지하기 위해 testAd.style.display = 'absolute'화면에 추가 하고 이동할 수 있습니다.
Gerald

4
하지만이 문서의 몸에이 같은 추가 제안 지연이 100ms에서 고통받는 사람을위한 좋은 해결책 : <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 absoluteposition가치입니다.
Em Seven

방금 추가 할 수 window.onload
Peter Cullen

참고이 파이어 폭스에 대한 AdBlock을 위해 작동하지 않습니다
Eda190

42

대부분의 광고는 자바 스크립트로 동적으로로드됩니다. 방금 onerror 이벤트를 사용하여 광고 스크립트를로드 할 수 있는지 여부를 감지했습니다. 작동하는 것 같습니다.

GoogleAds의 예 :

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

광고 차단기가 콘텐츠를 차단하고 있는지 확인하기 위해 다른 요소에도 사용할 수 있습니다. 원격 요소가 존재하지 않거나 도달 할 수없는 경우이 메소드는 오 탐지를 생성 할 수 있습니다.


1
이것은 광고가로드되었는지 여부를 확인하는 가장 좋은 방법 중 하나입니다. 차단기에 의존하는 스크립트를 수동으로로드하여 때때로 실패하는 것을 차단하기 때문입니다.
MaZZly

이것은 동적으로로드 된 스크립트에 가장 적합한 솔루션 인 것 같습니다.
Carca

이것이 쓰여진 이후로 무엇이 바뀌 었는지 모르겠지만 STANDS 크롬 플러그인으로 Fair Adblock을 사용하여 오류를 일으킬 수는 없습니다.
Melchester

2018 년 3 월 현재, 최고의 단순하고 확실한 솔루션
Daniel Vukasovich

등이 더 잘 확인할 공정의 adblocker과의하지 작업 위에 말했다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는 이제 언제든지 정의되지 않습니다. typeof (window.google_jobrunner)! = 'object'가 작동합니다.
Dmitrii Korotovskii 2016 년

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

Advertise.js는 아무것도 포함하지 않습니다. 누군가 애드 블록을 사용하면 실패하고 함수가 호출됩니다.


10

답변이 충분하다는 것을 알고 있지만 Google에서이 주제에 대해 "adblock 감지"를 검색했을 때이 질문이 표시되므로 adsense를 사용하지 않는 경우에 대한 통찰력을 제공하고자합니다 .

특히,이 예에서는 Firefox Adblock에서 제공 한 기본 Adblock-list가 사용되는지 감지 할 수 있습니다. 이 차단 목록에는 CSS id로 차단 된 요소가 있다는 장점이 #bottomAd있습니다. 페이지에 이러한 요소를 포함시키고 높이를 테스트하면 광고 차단이 활성화되어 있는지 여부를 알고 있습니다.

<!-- 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적어도 1ms의 시간 초과로 사용 하고 있습니다. 나는 이것을 다양한 브라우저에서 테스트했으며 대부분의 경우 요소를 직접 확인하여 ready항상 0을 반환했습니다. 애드 블로커의 활성화 여부에 관계없이 나는 이것에 대해 두 가지 아이디어를 가지고있었습니다 : 렌더링이 아직 완료되지 않았거나 Adblock이 아직 시작되지 않았습니다. 더 조사 할 필요가 없었습니다.


가짜 ads.js 요청 대신이 접근법에 대한 단점이 있습니까? 추가 요청을 포함하지 않기 때문에이 답변을 정말 좋아합니다.
JeroenVdb

길이와 높이를 테스트하는 대신 if ($ ( "# bottomAd"). is ( ': hidden')) ...?
Evan Langlois

@EvanLanglois, 나는 당신이 2 년 전에 물었다는 것을 알고 있습니다. 분명히 .is(":hidden")검사는 높이와 너비가 모두 0인지 여부에 달려 있습니다. 높이를 0으로 설정했지만 div가 여전히 너비를 차지하는 경우 jQuery에서 "숨김"으로 간주하지 않습니다. 따라서 말할 수 있는지 여부 .is(":hidden")는 애드 블로커가 콘텐츠 크기 조정 / 숨기기를 결정하는 방법에 따라 다소 다릅니다.
스펜서 D

10

내 충고는 :하지 마십시오!

사람들을 "범죄자"로 취급하는 모든 시나리오는 반격을 초래할 것입니다.

여기 내 제안이 있습니다.

광고가 차단되는지 여부에 관계없이 페이지 상단에 작은 메시지를 표시 I *totally* respect your right to block ads하고 제목이있는 다른 페이지 / 팝업 링크Read more ... .

다른 쪽에서는 컴퓨터임을 이해하고 광고 차단을 자유롭게 사용할 수 있음을 분명히하십시오.

또한 비 고발적인 방식으로 명확 하게 이러한 차단제의 사용은 귀하의 사이트에서 발생하지 않는 광고 차단을 선호하는 것 동안, 훌륭한 콘텐츠 (이유를 자세히 설명)하고 전달하는 것이 더 어렵게 만드는 것으로, 전적으로 그들의 결정입니다. 차단 기능을 끄는 장점에 중점을 둡니다.

광고에 강력히 반대하는 사람들은 이것을 무시할 것이지만 당신은 결코 그들을 설득 할 기회를 가지지 않았습니다. 무관심한 사람들은 "내가 길을 가지거나 공을 가져 가서 집에 갈 것이다"라는 모든 일을하지 않고 정직하게 5 살짜리 어린이들의 독점 영역이되어야하는 일을하지 않기 때문에 귀하의 호소에 크게 동요 될 수 있습니다.

아무도 머리에 총을 들고 물건을 그물에 올려 놓지 마십시오. 독자 / 사용자를 존중하여 대우하면 많은 사람들이 왕복 할 것입니다.


1
"광고 차단기를 사용하는 것 같군요. 멋지네요! :) 우리에게 친구를 말함으로써 X를 지원하십시오!"
ADTC

3
그는

애드 블록을 켤 때 레이아웃이 어떻습니까?
godblessstrawberry 오전

5
웹 사이트에서 광고 차단기를 사용 중지하도록 설정하면 계속 진행합니다. 그들은 잃어 버려 걱정하지 않습니다. Google에서 캐시 된 사본을 가져옵니다.
RayfenWindspear

1
@allboy, 내 대답에는 윤리가 없습니다. 타겟팅하려는 잠재 고객의 현실 만 있습니다. 의도가 설명대로되어 있더라도 질문을 다시 읽으면 사용자에게 광고 레이아웃을 정리하지 않고 광고를 허용하도록 요청했음을 나타냅니다. 질문은 제가 대답 한 질문이었습니다. 반년이 지난 후에도 다른 질문이 없었습니다 :-)
paxdiablo

9

Google의 광고 코드가 ID가 "iframe"인 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 애드 센스를 사용하는 것으로 나타났습니다. 일부 페이지는 애드 센스를 사용하지 않으며 테스트로 애드 센스 차단을 사용하는 것은 실제로 좋은 생각이 아닙니다. 애드 센스 차단은 SEO에 해를 끼칠 수 있습니다. 다음은 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"는 adblocker가 차단하는 ID입니다. 따라서 눈에 보이는지 확인하면 애드 블로커가 켜져 있는지 감지 할 수 있습니다.


7

AdBlock은 애드 센스 (etc) JavaScript 파일의로드를 차단하는 것 같습니다. 따라서 비동기 버전의 애드 센스 광고를 사용 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);

명확히하기 위해 다음은 애드 센스 비동기 광고 코드의 예입니다.

<!-- 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배열로 초기화됩니다. adsbygoogle.js라이브러리에이 배열 변경 Object {push: ...}이 실행될 때를. 특정 시간이 지난 후 변수 유형을 확인하면 스크립트가로드되었는지 알 수 있습니다.


이것은 대부분의 시간에 작동하지만 사용자의 연결 속도가 느린 경우 (모바일 장치를 생각하면)
Luca Steeb

6

내 사이트에서 사용하는이 방법은 도움이 될 것입니다. 제 생각에는 가장 간단합니다 해결책입니다.

AdBlocker는 개발자 콘솔에서 차단 된 광고의 선택자를 검사하여 특정 클래스와 html 요소를 차단합니다 (모두 나열되어 있음). 항상 어떤 요소가 차단되는지 확인할 수 있습니다.

예를 들어 stackoverflow에서이 질문 페이지를 검사하면 차단 된 광고가 많이 표시됩니다.

예를 들어 bottom-ad클래스가 있는 요소 는 자동으로 차단됩니다.

  1. bottom-ad클래스를 사용 하여 비어 있지 않은 div 요소를 만들었습니다 . <div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
  2. 페이지가로드 된 후이 요소가 숨겨져 있는지 확인하십시오. jQuery를 사용했지만 Javascript를 자유롭게 $('.bottom-ad').css('display') == "none"사용하십시오.$('.bottom-ad').is(':visible')

값이 true인 경우 AdBlocker가 활성화됩니다.


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

애드 블록이 있는지 확인하는 효율적인 방법 : Google 광고의 URL을 실행하여 애드 블록이 활성화되어 있는지 확인하십시오. 그렇다면 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();
    });
};

이 솔루션은 Google 애드 센스뿐만 아니라 모든 종류의 광고에 적용됩니다.


일부 애드 블로커가 jQuery를 차단하면 "$가 정의되지 않았기 때문에"스크립트가 실행되지 않습니다. 순수한 js를 더 잘 사용하십시오.
NYX

3

이 질문의 나이에도 불구하고 최근에 나는 그것이 매우 유용하다는 것을 알았으므로 다른 사람들이 여전히 그것을보고 있다고 가정 할 수 있습니다. 여기와 다른 곳을 살펴본 후 광고 차단기를 간접적으로 감지하기위한 주요 세 가지 클라이언트 측 검사는 차단 된 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"및 애드 센스에서 사용하는 치수 (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의 내용은, "확인"입니다 advertimsent.js했다 하지 차단.
  • iframe의 크기 (그리고 숨겨진 객체에는 높이 또는 너비가 없으므로 가시성이 있다고 생각합니까?)

그리고 스타일 :

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

div#myTestAd2
{
    display: none;
}

도움이 되었기를 바랍니다


3

새 애드 센스 코드를 사용하는 경우 콘텐츠 또는 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>

그런 다음 페이지 하단 에서 애드 센스 코드를 호출합니다 ( 스크립트를 호출 할 때 플래그를 사용 하지 마십시오 )."async"adsbygoogle.js

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

그런 다음이 작은 코드 스 니펫을 그 아래에 추가하십시오.

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

애드 센스는 항상 광고가로드 될 때 플래그 adsbygoogle.loaded를 생성 / 설정합니다 true. setTimeout 함수에 확인 표시를하여 확인을 몇 초 지연시킬 수 있습니다.


2
이것은 물론 광고가 어떻게 차단 되었는지에 달려 있습니다. 애드 블로킹 소프트웨어로 인해 애드 센스가 완전히로드되지 않는 경우 작동합니다. 그러나 광고 차단 소프트웨어가 CSS 표시 속성을 "없음"으로 설정하거나 각 div의 높이를 0으로 설정하는 것과 같은 작업을 수행하는 경우 작동하지 않을 수 있습니다.
Bangkokian

진실. 모든 광고 블록을 100 % 잡는 쉬운 방법은 없다고 생각하지만 적어도 일부를 잡을 수는 있습니다.
Troy Morehouse

3

대부분의 애드 블로커 는 요소에 대한 HTTP 요청을 취소 ads.js하고 만들지 0px만 언젠가 애드 블로커 는 DOM을 제거했습니다. 했으며 요소의 존재를 확인하지 않기 때문에 위의 답변이 실패합니다.

사용 setTimeout()하지 않으면 스크립트를 adblocker와 경쟁하게되므로 사용하는 것이 좋습니다.

아래 스크립트는 dom 존재 / 제거 여부 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;

애드 블록을 감지하는 가장 쉬운 방법이라고 생각합니다.


다른 차단 된 파일 : 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?');
    }
});

그냥 이것을 시도; 작동하지 않습니다. 광고 차단 소프트웨어가 설치되지 않은 경우에도 항상 true를 반환합니다.
ecnepsnai 2018 년

이는 애드 센스를 사용중인 페이지에서만 작동합니다. 그렇지 않으면 정답이므로 항상 true를 반환합니다. 모든 페이지에서 window.google_jobrunner가 감지되지 않습니다. Google 애드 센스를 사용하는 사용자 만 이 코드가 실제로 내 사이트에서 작동하는 것을 볼 수 있습니다 : 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 + js 버디 :

ADBuddy JS 버디 깃 허브

모바일 호환성과 jsBlocking 감지 기능을 추가했습니다 ... ( adBlocking / jsBlocking 을 비활성화하도록 사용자에게 표시하는 오버레이처럼 소프트웨어); 또한 반응이 좋았습니다.

Coffeeware 라이센스에 따라 오픈 소스 입니다.


노력을 감사하지만 적어도이 의견을 작성하는 동안 adblock과 함께 작동하지 않는 것 같습니다.
arunskrish

이 플러그인을 구현 한 사이트 인 adBlock과 함께 작동합니다 .calyphrox.net은 누구나 실제로 플러그인이 작동하는지 확인할 수 있습니다.
Jmlevick

3
링크가 죽었습니다 ... 이것을 제거 할 수 있습니까?
Evan Langlois

2
링크를 업데이트하십시오. 잘못된 답변입니다.
Yazan Rawashdeh

0

나는 당신의 긴장을 이해하고 요소가 스크립트에 의해 생성되었거나 요소가 숨겨져 있는지 확인할 수 있습니다. 광고 차단에 대해 말하면 요소의 존재 여부가 아니라 요소의 가시성에만 의존 할 수 있습니다.

타사 스크립트로 작성된 요소는 존재하지 않습니다. 즉, 현재 스크립트에 도달 할 수없는 경우 (DNS 오류, 원격 웹 서버 오류, 오프라인 웹 페이지 사전로드 등) 항상 긍정 오류가 발생합니다.

확인 사항이있는 다른 모든 답변은 정확하지만 명심하십시오.


0

timing's 대답은 좋은 생각이지만 더 이상 작동하지 않으므로 js 파일의 이름을 'ads'에서 'adsense'로 업데이트했으며 매력처럼 다시 작동합니다!

다음은 코드입니다. 아마도 누군가를 도울 것입니다.

<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

이제 AdBlock Detector 라는 간단한 JS 스크립트를 사용하여 더 나은 방법
을 사용할 수 있습니다. 사용 방법은 다음과 같습니다. 섹션에
추가 <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-messageAdBlock 사용자에게 메시지를 표시 할 때마다 ID 를 사용할 수 있습니다 .

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

원래 숨기도록 추가 된 인라인 스타일에 유의하십시오 (물론, 자신의 CSS 파일에서이를 수행 할 수도 있습니다).
또한 500ms가 걸린다는 점에 유의하십시오. 왜냐하면 애드 블로커가 작업을 수행 할 때까지 기다려야하거나 작동하지 않기 때문입니다.

이 스크립트의 작동 방식에 대한 약간의 설명

먼저 무작위로 생성 된 링크의 소스가있는 iframe을 추가합니다. (일부 광고 블록은 똑똑하기 때문에 무작위로 생성됩니다.
그런 다음 해당 iframe에서 여러 검사를 실행합니다 (로드 된 경우 또는 스타일이 수정 된 경우). 이러한 테스트 중 하나에 해당하면 ab-message사용자를 차단 하는 요소가 표시됩니다 .

이 스크립트는 대부분의 광고 차단기에 작동합니다.

특별한

실제로 요점을 만들 수는 없었지만 대신 Github 프로젝트를 만들었지 만 여전히 확인하고 도움이된다면 별표 표시하십시오.
abDetector : 간단한 바닐라 JavaScript AdBlock Detector.
즐겨.


불쌍한 솔루션. 외부 .js 파일은 쉽게 차단됩니다.
Bangkokian

@Bangkokian 그냥 복사하고 자바 스크립트 파일 또는 index.js (또는 무엇이든)를 보여주는 메시지에서 파일 (및 라이센스)을 참조하십시오.
BlueEyesWhiteDragon

1
@BlueEyesWhiteDragon 맞습니다. 그러나 트로이의 원래 대답은 전혀 아닙니다. 인라인 스크립트를 표시하기 위해 100 % 편집되었습니다. 내 의견은 서있다. 그의 원래 답변은 외부 스크립트를 사용하는 것이 었습니다. stackoverflow.com/posts/34738388/revisions
Bangkokian 2014 년

@Bangkokian 정확하게, 나는 당신의 의견 덕분에 SO 지침을 따르기 위해 답변을 편집하고 인라인 스크립트로 만들었다는 것을 언급하지 않았습니다. 감사합니다.
Nick Rameau

0

이것을 확인하면 애드 블로커를 감지하는 데 도움이 될 수 있습니다

타이밍 응답 구현

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>

그런 다음 나중에 사용하십시오.

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

작동하지 않습니다. 항상 광고가 차단되었음을 보여줍니다.
Himanshu Aggarwal 10

값을 확인 window.adblocker이 돌아 오면 브라우저 콘솔에서 true다음 adblocker이 반환됩니다 그렇지 않으면 활성화 false하면 전체 문서를 확인하실 수 있습니다 감지-adblocker
무스타파 Dwekat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.