내 웹 사이트에서 Adblock을 감지하는 방법은 무엇입니까?
사용자가 내 웹 사이트를 방문 할 때 광고 차단 소프트웨어를 사용하고 있는지 감지하고 싶습니다. 그들이 그것을 사용하고 있다면, 나는 이 웹 사이트 처럼 프로젝트를 지원하기 위해 끄도록 요청하는 메시지를 표시하고 싶습니다 .
해당 사이트에 들어가서 브라우저에 일종의 애드 블록 소프트웨어가 활성화 된 경우 실제 광고를 표시하는 대신 사이트에 작은 배너가 표시되어 사용자에게 광고 수익이 프로젝트를 호스팅하는 데 사용된다는 것을 알려주며 애드 블록을 해제해야합니다 .
내 웹 사이트에서 그렇게하고 싶습니다. 애드 센스 광고를 사용하고 있습니다. 어떻게해야합니까?
내 솔루션은 특정 광고 네트워크에만 국한되지 않으며 매우 가볍습니다. 나는 몇 년 동안 프로덕션 환경에서 운영해 왔습니다. 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가 실제로 개발자가 확장 프로그램을 사용하여 광고가 차단되는 것을 감지하는 데 도움이된다는 것을 의미합니까?
작동하지 않습니다 :
프라이버시 오소리
직접적인 답변은 아니지만 광고 뒤에 메시지를로드하여 표시하려고합니다. 감지하려고하면 광고가 표시되지 않을 때 표시됩니다.
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
이론적으로 문제 가 되는 것보다 큰) 광고 요소 배열이 제공됩니다 .
추가 요청이 없습니다. 외부 라이브러리가 없습니다. 평범하고 간단한 JavaScript :
var adBlockEnabled = false;
var testAd = document.createElement('div');
testAd.innerHTML = ' ';
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을을 검출하기위한 가장 좋은 방법 같아요.
대부분의 광고는 자바 스크립트로 동적으로로드됩니다. 방금 onerror 이벤트를 사용하여 광고 스크립트를로드 할 수 있는지 여부를 감지했습니다. 작동하는 것 같습니다.
GoogleAds의 예 :
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" onerror="adBlockFunction();"></script>
광고 차단기가 콘텐츠를 차단하고 있는지 확인하기 위해 다른 요소에도 사용할 수 있습니다. 이 방법은 원격 요소가 없거나 도달 할 수없는 경우 오 탐지를 생성 할 수 있습니다.
사용자가 광고를 차단하고 있는지 감지하려면 광고 자바 스크립트에서 함수를 찾아 테스트 해보십시오. 광고를 차단하기 위해 어떤 방법을 사용하든 문제가되지 않습니다. 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
jquery를 사용하는 가장 쉬운 해결책은 다음과 같습니다.
$.ajax({
url: "/scripts/advertisement.js", // this is just an empty js file
dataType: "script"
}).fail(function () {
// redirect or display message here
});
Advertise.js는 아무것도 포함하지 않습니다. 누군가 애드 블록을 사용하면 실패하고 함수가 호출됩니다.
답변이 이미 충분하다는 것을 알고 있지만 Google에서이 주제에 대해 "adblock 감지"를 검색했을 때이 질문이 표시되므로 adsense를 사용하지 않는 경우에 대한 통찰력을 제공하고자합니다 .
특히,이 예에서는 Firefox Adblock에서 제공 한 기본 Adblock-list가 사용되는지 감지 할 수 있습니다. 이 차단 목록에는 CSS id로 차단 된 요소가 있다는 장점이 #bottomAd
있습니다. 페이지에 이러한 요소를 포함시키고 높이를 테스트하면 광고 차단이 활성화되어 있는지 여부를 알고 있습니다.
<!-- some code before -->
<div id="bottomAd" style="font-size: 2px;"> </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이 아직 시작되지 않았습니다. 더 조사 할 필요가 없었습니다.
내 충고는 :하지 마십시오!
사람들을 "범죄자"로 취급하는 모든 시나리오는 그들과 맞서 싸울 것입니다.
여기 내 제안이 있습니다.
페이지 상단에 광고가 차단되는지 여부에 관계없이 텍스트 I *totally* respect your right to block ads
와 함께 다른 페이지 / 팝업 링크 가 포함 된 작은 눈에 잘 띄지 않는 메시지를 넣으십시오 Read more ...
.
다른 쪽에서는 컴퓨터임을 이해하고 광고 차단을 자유롭게 사용할 수 있음을 분명히하십시오.
또한 그것은 명확하게 비 비난 방법으로 이러한 차단제의 사용은 귀하의 사이트에서 발생하지 않는 광고 차단을 선호하는 것 동안, 훌륭한 콘텐츠 (이유를 자세히 설명)하고 전달하는 것이 더 어렵게 만드는 것으로, 전적으로 그들의 결정입니다. 차단 기능을 끄는 장점에 중점을 둡니다.
광고에 강력히 반대하는 사람들은 이것을 무시할 것이지만 당신은 결코 그들을 설득 할 수있는 기회를 가지지 않았습니다. 무관심한 사람들은 "내가 길을 가지거나 공을 가져 가서 집에 갈 것이다"라는 모든 일을하지 않고 정직하게 5 살짜리 어린이의 독점 영역이되어야하는 일을하지 않기 때문에 귀하의 호소에 크게 좌우 될 수 있습니다.
아무도 머리에 총을 들고 물건을 그물에 올려 놓지 마십시오. 독자 / 사용자를 존중하여 대우하면 많은 사람들이 왕복 할 것입니다.
그들은 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>
이전 의견에서는 테스트 할 객체로 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입니다. 따라서 눈에 보이는지 확인하면 애드 블로커가 켜져 있는지 감지 할 수 있습니다.
사이트에 작은 스크립트를 추가하십시오.
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>
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: ...}
이 실행될 때를. 특정 시간이 지난 후 변수 유형을 확인하면 스크립트가로드되었는지 알 수 있습니다.
내 사이트에서 사용하는이 접근법은 도움이 될 것입니다. 제 생각에는 가장 간단한 해결책입니다.
AdBlocker는 개발자 콘솔에서 차단 된 광고의 선택자를 검사하여 특정 클래스와 html 요소를 차단합니다 (모두 나열되어 있음). 항상 어떤 요소가 차단되는지 확인할 수 있습니다.
예를 들어 stackoverflow에서이 질문 페이지를 검사하면 차단 된 광고가 많이 표시됩니다.
예를 들어 bottom-ad
클래스가 있는 요소 는 자동으로 차단됩니다.
bottom-ad
클래스를 사용 하여 비어 있지 않은 div 요소를 만들었습니다 .<div class="bottom-ad" style="width: 1px; height: 1px;">HI</div>
- 페이지가로드 된 후이 요소가 숨겨져 있는지 확인하십시오. jQuery를 사용했지만 Javascript를 자유롭게
$('.bottom-ad').css('display') == "none"
사용하십시오.$('.bottom-ad').is(':visible')
값이 true
인 경우 AdBlocker가 활성화됩니다.
추가 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>
안전한 방법은 광고를 안에 <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 방화벽과 함께 작동합니다.
애드 블록이 있는지 확인하는 효율적인 방법 : Google 광고의 URL을 실행하여 애드 블록이 활성화되어 있는지 확인하십시오. 그렇다면 callback_has_adblock을 실행하고, 그렇지 않은 경우 callback_no_adblock을 실행하십시오. 이 솔루션은 하나의 요청 비용이 더 들지만 적어도 작동합니다.
var hasAdBlock = function (callback_has_adblock, callback_no_adblock) {
$.getScript( "http://pagead2.googlesyndication.com/pagead/show_ads.js" )
.done(function( script, textStatus ) {
callback_no_adblock();
})
.fail(function( jqxhr, settings, exception ) {
callback_has_adblock();
});
};
이 솔루션은 Google 애드 센스뿐만 아니라 모든 종류의 광고에 적용됩니다.
새 애드 센스 코드를 사용하는 경우 콘텐츠 또는 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 함수에 확인 표시를하여 확인을 몇 초 지연시킬 수 있습니다.
이 질문의 나이에도 불구하고 나는 최근에 그것이 매우 유용하다는 것을 알았으므로 다른 사람들이 여전히 그것을보고 있다고 가정 할 수 있습니다. 여기와 다른 곳을 살펴본 후 광고 차단기를 간접적으로 감지하기위한 주요 세 가지 클라이언트 측 검사는 차단 된 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;
}
도움이 되었기를 바랍니다
나는 이것이 이미 답변 된 것을 알고 있지만 제안 된 샘플 사이트를 보았고 그들이 다음과 같이하는 것을 보았습니다.
<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>
타임 아웃과 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';
});
이 문제를 해결하기 위해 내 "플러그인"을 방금 만들었으며 실제로 잘 작동합니다.
adBuddy + js 버디 :
나는 무엇보다도 모바일 호환성과 jsBlocking 탐지를 추가했습니다 ... ( adBlocking / jsBlocking 소프트웨어 를 비활성화하도록 사용자에게 표시하는 오버레이처럼 ); 또한 반응이 좋았습니다.
Coffeeware 라이센스에 따라 오픈 소스 입니다.
대부분의 adblocker 는 요소에 대한 HTTP 요청을 취소 ads.js
하고 만들지 0px
만 언젠가는 adblocker 가 DOM을 제거 했으며 요소의 존재를 확인하지 않기 때문에 위의 답변이 실패합니다.
사용 setTimeout()
하지 않으면 스크립트가 애드 블로커와 경쟁하게되므로 사용하는 것이 좋습니다.
아래 스크립트는 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>
<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;
애드 블록을 감지하는 가장 쉬운 방법이라고 생각합니다.
이것이 나를 위해 일한 것입니다.
function isAdBlocked() {
return (typeof(window.google_jobrunner) === "undefined") ? true : false;
}
$(document).ready(function(){
if(isAdBlocked()) {
alert('Y U NO LIKE ADS?');
}
});
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;
이제 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-message
AdBlock 사용자에게 메시지를 표시 할 때마다 ID 를 사용할 수 있습니다 .
<div id="ab-message" style="display: none">Your message here!</div>
원래 숨기도록 추가 된 인라인 스타일에 유의하십시오 (물론, 자신의 CSS 파일에서이를 수행 할 수도 있습니다).
또한 500ms가 걸리므로 adblocker가 작업을 수행 할 때까지 기다려야합니다. 그렇지 않으면 작동하지 않습니다.
이 스크립트의 작동 방식에 대한 약간의 설명
먼저 임의로 생성 된 링크의 소스가있는 iframe을 추가합니다. (일부 광고 블록은 똑똑하기 때문에 무작위로 생성됩니다. 어떤 시점에서는 링크가 가짜임을 알 수 있습니다).
그런 다음 해당 iframe에 대해 여러 가지 검사를 실행합니다 (성공적으로로드되었거나 스타일이 수정 된 경우). 이러한 테스트 중 하나에 해당하면 ab-message
사용자를 차단 하는 요소가 표시됩니다 .
이 스크립트는 대부분의 광고 차단기에 작동합니다.
특별한
실제로 요점을 만들 수는 없었지만 대신 Github 프로젝트를 만들었지 만 여전히 확인하고 도움이된다면 별표를 표시하십시오.
abDetector : 간단한 바닐라 JavaScript AdBlock Detector.
즐겨.
이것을 확인하면 애드 블로커를 감지하는 데 도움이 될 수 있습니다
타이밍 응답 구현
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
}
위의 모든 답변은 유효하지만 대부분 DNS 수준 광고 차단에는 작동하지 않습니다.
pi-hole 과 같은 DNS 수준 광고 차단기는 기본적으로 광고 차단 도메인 목록에 대해 NXDOMAIN (도메인이 존재하지 않음)을 반환합니다 (예 : telemetry.microsoft.com은 "존재하지 않음").
이것을 우회하는 몇 가지 방법이 있습니다.
방법 A : 도메인이 아닌 IP 주소로 광고 요청
이 방법은 IP 주소를 추적해야하기 때문에 약간 성가시다. 코드가 제대로 유지 관리되지 않거나 정기적으로 업데이트되지 않으면 문제가 될 수 있습니다.
방법 B : 클라이언트가 NXDOMAIN을보고하더라도 실패한 모든 요청을 차단 합니다 .
"합법적 인"NXDOMAIN 인 경우 사용자에게 매우 성 가실 것입니다.
나는 당신의 긴장을 이해하고 요소가 스크립트에 의해 생성되었거나 요소가 숨겨져 있는지 확인할 수 있습니다. 광고 차단에 대해 말하면 요소의 존재 여부가 아니라 요소의 가시성에만 의존 할 수 있습니다.
타사 스크립트로 작성된 요소는 존재하지 않습니다. 즉, 현재 스크립트에 도달 할 수없는 경우 (DNS 오류, 원격 웹 서버 오류, 오프라인 웹 페이지 사전로드 등) 항상 긍정 오류가 발생합니다.
확인을 포함한 다른 모든 답변은 정확하지만 명심하십시오.
참고 URL : https://stackoverflow.com/questions/4869154/how-to-detect-adblock-on-my-website
'Programming' 카테고리의 다른 글
jQuery removeClass 와일드 카드 (0) | 2020.03.01 |
---|---|
Mobile Safari에서 전화 번호 연결을 비활성화하는 방법은 무엇입니까? (0) | 2020.03.01 |
JavaScript에서 증가 (“++”) 및 감소 (“-”) 연산자를 피해야하는 이유는 무엇입니까? (0) | 2020.03.01 |
$ rootScope. $ broadcast vs. $ scope. $ emit (0) | 2020.03.01 |
ViewModel의 INotifyPropertyChanged와 DependencyProperty (0) | 2020.03.01 |