web-dev-qa-db-ja.com

私のウェブサイトでAdblockを検出するにはどうすればいいですか?

ユーザーが自分のWebサイトにアクセスしたときに、ユーザーがブロックソフトウェアを使用しているかどうかを検出できるようにしたいです。彼らがそれを使っているのであれば、 this website doesのように、プロジェクトをサポートするためにオフにするように頼むメッセージを表示したいです。

そのサイトにアクセスし、ブラウザで何らかのAdblockソフトウェアが有効になっていると、実際の広告を表示する代わりに、広告収入がプロジェクトのホスティングに使用されていることをユーザーに知らせる小さなバナーが表示されます。 。

私は自分のウェブサイトでそれをしたいのですが、私はそれにAdSense広告を使用しています、どのようにそれを行うことができますか?

343
Jmlevick

私の解決策は特定の広告ネットワークに固有のものではなく、非常に軽量です。私は数年間プロダクションでそれを実行しています。 AdBlockはWordの "ads"を含むすべてのURLをブロックします。だからこれは私がやったことです:

私はads.jsという名前で小さなjsファイルを私のwebrootに追加しました

これはそのファイルのコードの唯一の行です

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上のこれらのadblockerによってブロックされます。

  • アドブロック
  • Adblock Plus
  • Adblock Pro
  • ゴステリー

2019-02-15に更新:

拡張機能がads.jsへのリクエストもブロックするようになったため、上記のリストにGhosteryを追加しました。とても便利な。これはGhosteryが実際に私たちが彼らの拡張機能を使って広告のブロックを検出するために私たちを助けるのを意味しているのでしょうか?

では動作しません

プライバシーアナグマ

381
timing

直接の答えではありませんが、ロードする広告の背後にメッセージを配置します。それを検出しようとするのではなく、広告が表示されないときに表示されるだけです。

140
mavrck

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

もちろん、必要に応じてこれらの両方を1つのifブロックに組み合わせることができます。

visibility: hiddenも同様にキャプチャされないことに注意してください(レイアウトスペースは残りますが、広告は表示されません)。それを確認するために、他のフィルタを使用することができます。

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

これにより、「見えない」(理論上、0よりも大きいものは問題になります)広告要素の配列が得られます。

102
Jared Farrish

追加のリクエストはありません。外部ライブラリはありません。単純で単純な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);
  • Adboxクラスの定義ファイルでリムーバブル要素として定義されている、adsboxクラスで要素を作成します。
  • あなたはそれをドキュメントに追加し、そしてあなたがそのoffsetHeightを読んでいる間の少し後に
  • AdBlockがインストールされている場合、要素の高さはわかりません。

Christian Heilmannの投稿 の功績により、AdBlockを検出するためのこれまでのところ最高のソリューションだと思います。

86
Cumulo Nimbus

ほとんどの広告はJavaScriptで動的に読み込まれます。 onerrorイベントを使用して、広告スクリプトを読み込めるかどうかを検出しました。動作しているようです。

GoogleAdsの例:

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

これは、広告ブロッカーがコンテンツをブロックしているかどうかを確認するために他の要素でも使用できます。このメソッドは、リモート要素が存在しないか到達できない場合に誤検知を引き起こす可能性があります。

38
JonMayer

ユーザーが広告をブロックしているかどうかを検出するには、広告JavaScriptで機能を見つけてテストするだけです。広告をブロックするためにどのような方法を使用してもかまいません。 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

19
Beau

Jqueryを使った私の最も簡単な解決策は、

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

advertising.jsには何も含まれていません。誰かがadblockを使用すると、それは失敗し、関数が呼び出されます。

14
Luca Steeb

私はすでに十分な答えがあることを知っていますが、この質問はGoogleでトピックで "ad adblock"を検索するので、adsenseを使用していない場合の洞察を提供したいと思いました.

具体的には、この例では、Firefox Adblockが提供するデフォルトのAdblockリストが使用されているかどうかを検出できます。このブロックリストに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が返されました。アドブロッカーがアクティブかどうかに関係なく。私はこれについて2つのアイデアを持っていました:レンダリングがまだ行われていないかAdblockがまだ開始していないかのどちらかです。私はさらに調査することを気にしませんでした。

11
mark

私のアドバイスは:それをしないでください!

あなたが人々を「不正行為者」として扱うどんなシナリオでも彼らは反撃する結果となるでしょう。

これが私の提案です。

I *totally* respect your right to block adsというテキストとRead more ...という名前の別のページ/ポップアップへのリンクを付けて、ページの上部に目立たない小さなメッセージを(広告がブロックされているかどうかにかかわらず)置きます。

他のページでは、自分のコンピュータであり、広告ブロックを自由に使用できることを理解してください。

また、を非疑いの余地のない方法でにしておくと、これらのブロッカーを使用すると優れたコンテンツを配信することが難しくなることがわかります。あなたはあなたのサイトで広告ブロックが起こらないことを望みます、それは完全に彼らの決定です。ブロッキングをオフにすることのプラス面に焦点を当てます。

広告に熱心に反対している人はこれを無視しますが、とにかくあなたはとにかくそれらを納得させるチャンスがありませんでした。無関心な人は、「私に道を譲るか、私は私のボールを持って帰って行きましょう」ということをしていないので、あなたの魅力に左右されることがあります。

覚えておいて、誰もあなたの頭に銃を持って、あなたがネットにあなたのものを置くことを強制しなかったことを忘れないでください。あなたの読者/ユーザーを尊重して扱うと、おそらくあなたはそれらの多くが往復することに気付くでしょう。

11
paxdiablo

彼らは、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
Robbie

私は以前のコメントがテスト対象としてグーグルアドセンスを使っているのに気づいた。一部のページはAdSenseを使用していません、そしてテストとしてAdSenseブロックを使用することは実際には良い考えではありません。 AdSenseブロックがあなたの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です。表示されているかどうかを確認すると、adblockerがオンになっているかどうかを検出できます。

9
Roman Losev

私のサイトではこのアプローチを使用していますが、おそらく便利でしょう。私の意見では、それは最も簡単な解決策です。

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はアクティブです。

7
NGix

AdBlockはAdSense(など)JavaScriptファイルのロードをブロックしているようです。そのため、AdSense広告の非同期バージョンを使用している場合は、adsbygoogleArrayであるかどうかを確認できます。非同期スクリプトは...非同期なので、数秒後にこれをチェックする必要があります。これは大まかな概要です。

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が配列として初期化されていることに注目してください。 adsbygoogle.jsライブラリは、実行時にこの配列をObject {Push: ...}に変更します。特定の時間が経過した後に変数の種類を確認すると、スクリプトがロードされたかどうかがわかります。

7
Salman A

あなたのサイトに小さなスクリプトを追加するだけです。

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>

この解決策が見つかりました ここ

7
druss

追加の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>
7
vorillaz

安全な方法は、広告を<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プラスとブルーシェルファイアウォールで動作します。

6
uingtea

広告ブロックがあるかどうかを確認する効率的な方法:Google広告のURLをトリガーして、広告ブロックが有効になっているかどうかを確認するだけです。そうであればcallback_has_adblockを実行し、そうでなければcallback_no_adblockを実行します。このソリューションは1つ以上のリクエストがかかりますが、少なくともうまくいきます。

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 AdSenseだけでなく、あらゆる種類の広告に有効です。

4

新しい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コードを呼び出します(noteしないでください"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.loadedtrueに作成または設定します。チェックをsetTimeout関数に入れて、チェックを数秒遅らせることができます。

4
Troy Morehouse

この質問の時代にもかかわらず、私は最近それが非常に有用であるとわかったので、まだそれを見ている人がまだいると仮定することしかできません。ここや他の場所で見た結果、広告ブロッカーを間接的に検出するための3つの主なクライアントチェックは、ブロックされたdiv/img、ブロックされたiframes、およびブロックされたリソース(JavaScriptファイル)をチェックすることでした。

たぶんそれはトップや妄想を超えていますが、それは選択から1つか2つのみをブロックする広告ブロックシステムをカバーしているので、あなたが1つのチェックをしただけでカバーされなかったかもしれません。

あなたがチェックを実行しているページに追加:(私は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と、 "広告"というテキストと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の寸法と可視性。
  • advertimsent.jsブロックされていなかった場合のように、2番目のテストdivの内容は "check"です。
  • Iframeの大きさ(そして隠れたオブジェクトには高さも幅もないのですか?)

そしてスタイル:

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

div#myTestAd2
{
    display: none;
}

お役に立てれば

3
Luke S

タイムアウトや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';
});
2

これを解決するために私自身の "プラグイン"を作成しただけで、本当にうまくいきます。

adBuddy + jsBuddy:

ADBuddy JSBuddy GitHub

私はとりわけモバイル互換性とjsBlockingの検出を追加しました...(ユーザーに表示されるオーバーレイのようにadBlocking/jsBlockingソフトウェアを無効にするように)。また、レスポンシブフレンドリーになりました。

それは Coffeeware License の下で公開されています。

2
Jmlevick

私はこれがすでに答えられていることを知っています、しかし私は提案されたサンプルサイトを見ました、そして私は彼らがこれのようにそれをするのを見ます:

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

ほとんどのadblockerはads.jsへのHTTPリクエストをキャンセルして要素の0pxを作成しますが、adblockerが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
cieunteung

あなたはこれをチェックすることができますそれはそれを見つけるかもしれません 検出adblocker

タイミング回答 の実装

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
}
1
Mustafa Dwekat

上記の答えはすべて有効ですが、ほとんどの場合DNSレベルの広告ブロックでは機能しません。

DNSレベルの広告ブロッカー( pi-hole のような)は、基本的に広告ブロックドメインのリストに対してNXDOMAIN(ドメインが存在しない)を返します(例:telemetry.Microsoft .comが存在する場合は「存在しません」。

これを回避するにはいくつかの方法があります。

方法A:ドメインではなく、IPアドレスで広告をリクエストします。

あなたがIPアドレスを追跡しなければならないので、この方法は少し面倒です。あなたのコードがうまくメンテナンスされていないか定期的に更新されていない場合、これは問題になります。

方法B:ブロックallクライアントがNXDOMAINを報告しても失敗する要求。

それが「正当な」NXDOMAINであるならば、これはユーザーにとって非常に迷惑です。

1
kot83

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;

1
eclipseR
<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を検出する最も簡単な方法だと思います。

1
mikas

これで、 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>

AdBlockユーザーにメッセージを表示したいところならどこでもab-message idを使うことができます:

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

もともとそれを隠すために追加されたインラインスタイルに注意してください(もちろん、あなた自身のCSSファイルからこれを行うこともできます)。
また、500ミリ秒かかることに注意してください。これは、アドブロッカーがそのことを実行するのを待たなければならない、または機能しないためです。

このスクリプトのしくみについての簡単な説明

まず、ランダムに生成されたリンクのソースとともにiframeを追加します。 (一部のadblockはスマートであるため、ランダムに生成されます。ある時点で、リンクが偽であることがわかります)。
そして、それはそのiframeに対して複数のチェックを実行します(それがうまくロードされたか、またはそのスタイルが変更されたかどうか)。これらのテストのいずれかが当てはまる場合は、ab-message要素を表示してユーザーをブロックします。

このスクリプトは、(全部ではないにしても)ほとんどの広告ブロッカーに対して機能します。

余分な

Gistを作成しただけでは、実際には意味がありませんが、その代わりにGithubプロジェクトを作成しました。
abDetector:シンプルなVanilla JavaScript AdBlock Detector。
楽しい。

1
Nick Rameau

これは私のために働いたものです:

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

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

私はここでパーティーに少し遅れますが、これは私がjQueryを使った古いAdSenseコードのために私が知っている最も簡単な解決策です:

$ads = $("ins");
if ($ads.length == 0) {
    // Replacement code about you needing ad income
}

そして普通のJavaScriptでは:

$ads = document.getElementsByTagName("ins");
if ($ads.length == 0) {
    // Replacement code about you needing ad income
}

$adsには、生成される広告と一致することがわかっているセレクタを使用できます。例えば。新しいAdSenseコードには$("iframe#google_ads_frame1")を使用できます。

0
jonbaldie

React.jsでは、次のことができます。

class AdblockDetect extends Component {
  constructor (props) {
    super(props)
    this.state = {
      usingAdblock: false
    }
  }

  componentDidMount() {
    this.setState({ usingAdblock: this.fakeAdBanner.offsetHeight === 0 });
  }

  render() {
    if (this.state.usingAdblock === true) {
      return this.props.children;
    }

    return (
      <div
        ref={r => (this.fakeAdBanner = r)}
        style={{ height: '1px', width: '1px', visiblity: 'none', pointerEvents: 'none' }}
        className="adBanner"
      />
    );
  }
}

class App extends Component {
  render() {
    return (
      <div className="App">
        <AdblockDetect>You are using adblock</AdblockDetect>
      </div>
    );
  }
}

出典: https://stackoverflow.com/a/55635499/5539715

0
Nic Scozzaro

私にとってはうまくいったトリックはありませんでした。しかし、これはGoogle広告に実装するための非常に具体的な方法です。

window.onload = function() {
   if (document.getElementsByClassName('google-auto-placed').length == 0){
                // Adblock Detected
   }        
}

Amazonのような他の広告システムがある場合は、ページを調べてそれらの一般的なクラス名/ IDを探します。

このコードを別の.jsファイルに入れることを計画している場合は、ファイル名に「Ad」Wordが含まれていないことを確認してください。名前を付けるだけmagic.js

Googleがdiv名を変更しようと決めた場合、この方法は失敗します。しかしそれはありそうもないようです。

0
Ojas Kale

これは私のために働いたあなたがadblockを探す前に文書は準備ができていなければならないこれが誰かに役立つことを願っています!

jQuery(document).ready(function() {

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


});
0
SeanDp32

私はあなたの緊張を理解しています、そして、あなたは要素がスクリプトによって作成されたかどうかまたは要素が隠されているかどうかをチェックすることができます。また、広告ブロックについて説明すると、要素の表示ではなく要素の表示設定のみに頼ることができます。

現時点でスクリプトにアクセスできない場合(DNSエラー、リモートWebサーバーエラー、オフラインWebページのプリロードなど)、サードパーティのスクリプトで作成された要素は存在しません。その場合、常に誤検知となります。

小切手による他のすべての答えは正しいですが、これを覚えておいてください。

0
Eir Nym

今日よく使用されている2つのタイプの広告ブロッカーの両方に対処する良い単純な答えは見たことがないので、私は私自身の答えを提供します。

広告ブロッカータイプ1:スクリプト名(AdBlock、uBlock Originなど)に基づいてWeb広告スクリプトをブロックします。

広告ブロッカータイプ2:広告配信ホスト名のデータベース(FireFoxコンテンツブロッカー、さまざまなゲートウェイプラグインなど)に基づいてWeb広告をブロックします。

この解決策は両方に有効です。ユーザーに広告ブロッカーを無効にするよう求める大きなピンクの「アピールボックス」が表示されます。メニューの下、コンテンツの上に配置するのが好きです。サイトへのアクセスをブロックするわけではありません - これは、ページ上のコンテンツを少しプッシュするだけですが、ほとんどのユーザーがサイトの広告ブロッカーを順守して無効にするのに十分なほど厄介です。

enter image description here

だからここに解決策があります:

A)advertising.jsという名前のファイルを作成し、それをWebサーバーのルートに配置します。次のコードで構成されています。

document.write('<div id="tester">an advertisement</div>');

B)あなたのWebページに次のように入力します(これを行うには、広告サーバーのコードを使用することもできます)。おすすめの場所はメニューの下、コンテンツの上です。

<script src="advertisement.js"></script>
<table id="tbl_ab_appeal" style="width: 900px; margin-left:auto; margin-right: auto; padding: 25px; background: #FCC; border: 1px solid #F66; visibility:collapse; border-collapse: collapse;">
    <tr>
        <td>We've detected that you're using an <strong>ad content blocking</strong> browser plug-in or feature. Ads provide a critical source of revenue to the continued operation of [This website name].&nbsp; We ask that you disable ad blocking while on [This
            website name] in the best interests of our community.</td>
    </tr>
</table>
<script>
    if (document.getElementById("tester") == undefined) adsBlocked();

    function adsBlocked() {
        document.getElementById("tbl_ab_appeal").style.visibility = "visible";
        document.getElementById("tbl_ab_appeal").style.borderCollapse = "separate";
        document.getElementById("tbl_ab_appeal").style.marginTop = "10px"
        document.getElementById("tbl_ab_appeal").style.marginBottom = "10px"
    }
</script>
<script onerror="adsBlocked()" src="//www.googletagservices.com/tag/js/gpt.js"></script>

それはどのように機能しますか?メッセージは読み込まれますが、高さがゼロになり、表示されなくなります。ローカルスクリプトadvertising.jsの実行に失敗した場合、またはリモートAdSenseスクリプトwww.googletagservices.com/tag/js/gpt.jsの読み込みに失敗した場合は、ボックスが表示されます。

0
zax

ブラウザで新しいタブをブロックするadblockに問題がある場合は、次のようにしてください。

$('a').click(function(e){ // change $('a') into more specific
    var w = window.open(this.href, '_blank');

    setTimeout(function(){
        if(w.closed){
            alert('Adblock detected!');
        }
    }, 300);  // if you can close new tab in less than 0.3 sec you're very fast ;)

    e.preventDefault(); // return false if you like
});

このコードは、サイト全体をブロックしたくない場合や、ブラウザのタブが閉じられている理由をユーザーに通知したくない場合にのみ有用です。

0
instead