WebサイトでAdblockを検出するにはどうすればよいですか?


370

ユーザーが私のウェブサイトにアクセスしたときにアドブロッキングソフトウェアを使用しているかどうかを検出したいのですが。もし彼らがそれを使っているなら、このウェブサイトのように、プロジェクトをサポートするためにそれをオフにするように求めるメッセージを表示したいと思います。

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

私は自分のウェブサイトでそれをしたいです、私はそれにアドセンス広告を使用しています、どうすればそれができますか?



5
最新のソリューションを探しているユーザーは、github.com
sitexw /

5
一部の人々は単にウェブで分析され、宣伝されることを好まない。私がアクセスしたいくつかのサイトは、収入が彼らのプロジェクトをサポートしていると私たちに告げています。
Paul

7
サイトがこれをどんどん行っている(そしてそれを悪用し、広告が邪魔にならないと嘘をつき、サイト全体をホワイトリストに登録するように強制する...)-使用できる拡張機能やトリックはありますか? AdBlock +の使用を検出されないようにするには?-あちこちにターゲットを絞ったバナー広告がいくつか表示されてもかまいませんが、クリックジャッキングや常時フルスクリーンビデオポップアップは私のようなものではありません。
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の次のadblockerによってブロックされます。

  • AdBlock
  • Adblock Plus
  • Adblock Pro
  • 幽霊

2019-02-15の更新:

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

で動作しません:

プライバシーバッジ


1
完全なリンクをjs/ads.jsお願いします。私はブロガーにいるので、.jsどこか(Googleドライブなど)にアップロードする必要があり、その場合のリンクにはが含まれていませんads。あなたのファイルのリンクを提供することは本当に役に立ちます。
Deb

91
ファイルには「var canRunAds = true;」という単語のみが含まれています。自分で作成してください。
タイミング

5
一部の広告ブロッカーは、Chromeの単純なadblockのように、ads.jsファイルをブロックしないようです。
Mgamerz 2014年

2
ABP for chromeは十分に反応しているため、すべて正常に動作します。
Maxime Lafarie、2015年

9
adblockerによってブロックされたURLでajaxリクエストを実行することもできます。成功した場合はadblockerはなく、失敗した場合はadblockerがあります。
SethWhite 2015年

138

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


5
ユーザーは引き続きAdblockを使用して、これらのブロックされた広告通知をブロックできます。それが私が知っている唯一の欠陥です。
アンダーソングリーン

25
簡単なことかもしれませんが、適切な方法ではありません。レイアウトがゆがんだり、広告の読み込みが遅い場合、ユーザーは自分に関係のないエラーを垣間見ることができます。また、Adblockは、ABPユーザーを対象とした目障りなメッセージをブロックする対策を講じていることにも注意してください。ユーザーにブロック解除を依頼する場合は、レイアウトの外側にある単純な非表示のメッセージを使用して行います(他の要素を押しのけないでください)。adblockを有効にしてduckduckgo.com/?q=foo+barを見てください。
Xeevis 2014

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

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

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

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

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


16
この場合のリダイレクトはお勧めできません。広告サービスが停止すると、すべての訪問者がそのページにリダイレクトされる可能性があります。また、ドキュメントの準備が整っているのではなく、ウィンドウのonloadイベントを使用することをお勧めします。
アンディE

1
より良い検出方法は$( '。myTestAd')。is( ":hidden");です。マニュアルで指定されているように、幅/高さが0かどうか、display = noneかどうかも検出されます。
TD_Nijboer 2014

6
Redirecting in this case is a bad idea. If your advertising service goes down, all visitors could be redirected to that page.確かに。言うまでもなく、彼らは単純なスクリプトをまとめて対策を打ち負かすだけです。その上、あなたは本当に積極的で強力であることによって、ユーザーが彼らの広告ブロッカーを無効にするように動機づけられることを本当に思いますか?いいえ、それを達成するすべてはそれらを怒らせ、あなたのサイトに対してそれらを酸っぱくすることです。ほとんどのサイトは、敵対するのではなく、単にメッセージを表示することを選択します。
Synetech 2014年

これはChromeでは機能しません。DOMReadyイベントでは、広告はまだ表示されているようです。
nwellnhof 2014年

3
広告が無効になっているため、ユーザーがサイトにアクセスできないようにしないでください。これは、競争をエスカレートさせるだけです。-オンにするように親切にお願いした場合は、オンにするだけです-強制しようとすると、サイトへのアクセスを停止するか、adblockerのバグを報告して、それはあなたのサイトのために修正されました。-これは、adblockerがユーザーを保護するために存在する動作の正確なタイプです。
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がインストールされている場合、要素には高さがありません。

クリスチャンハイルマンの投稿の功績です。AdBlockを検出するための最善の解決策だと思います。


5
グリッチを防ぐために、追加testAd.style.display = 'absolute'して画面の外に移動できます
Gerald

4
良い解決策が、100ミリ秒に苦しむものは、私はドキュメント本体にこのような何かを追加することをお勧め遅らせるため:<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

これはFirefoxのAdBlockでは機能しないことに注意してください
Eda190

42

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

GoogleAdsの例:

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

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


1
これは、広告がロードまたはnot..because手動で1回で失敗しようとしていることをブロックするブロッカーに頼って独自のスクリプトをロードしているかどうかを確認するための最良の方法の一つである...
MaZZly

これは、動的にロードされるスクリプトに最適なソリューションのようです。
カルカ

これが書かれてから何かが変更されたかどうかはわかりませんが、STANDS chromeプラグインによるFair Adblockでエラーが発生することはありません。
メルチェスター2018年

2018年3月の時点で、依然として最善のシンプルで明確なソリューション
Daniel Vukasovich

上記のように、公正なadblockerでは機能しないため、確認することをお勧めしますoffsetHeight
cieunteung

17

ユーザーが広告をブロックしているかどうかを検出するには、広告の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


8
google_render_adはいつでも未定義になり、typeof(window.google_jobrunner)!= 'object'が機能します。
Dmitrii Korotovskii 2013年

4
それはあなたが制御するコードではないので、ライブラリのリファクタリングによりスクリプトがすべてのユーザーの広告ブロックを検出するため、これに依存するのは悪い考えだと思います。
Patrick Forget

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

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


10

私はすでに十分な回答があることを知っていますが、この質問はGoogleで「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を返す要素を直接チェックしています。adblockerがアクティブかどうかに関係なく。これについては2つのアイデアがありました。レンダリングがまだ完了していないか、Adblockがまだ開始されていません。さらに調査する必要はありませんでした。


余分なリクエストを作成する必要がないため、私はこの回答が本当に気に入っています。偽のads.jsリクエストではなく、このアプローチには短所がありますか?
JeroenVdb 2015

長さと高さをテストする代わりに、if($( "#bottomAd")。is( ':hidden'))...だけを使用できませんか?
エヴァンラングロワ2015年

@ EvanLanglois、2年前に聞いたのは知っていますが、あなたの質問は実際に私に興味があったので、その情報についてダイビングに行きました。どうやら、.is(":hidden")チェックは高さと幅の両方がゼロかどうかに依存しています。高さを0に設定しても、divが幅を占める場合、jQueryによって「非表示」とは見なされません。したがって、言えるかどうか.is(":hidden")は、adblockerがコンテンツのサイズ変更/非表示を決定する方法に多少依存します。
スペンサーD

10

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

あなたが人々を「悪党」として扱うどんなシナリオでも、彼らは反撃することになります。

これが私の提案です。

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

別のページで、それが彼らのコンピュータであり、広告ブロックを自由に使用できることを明確に伝えます。

また、これらのブロッカーを使用すると優れたコンテンツを配信することが難しくなり(理由を詳細に説明)、非限定的な方法で明確します。また、サイトで広告のブロックが発生しないようにしたい場合は、それは完全に彼らの決定です。ブロックをオフにすることのメリットに焦点を当てます。

広告に激しく反対する人はこれを無視しますが、とにかく彼らを説得するチャンスはありませんでした。無関心な人は、正直に5歳の子供たちの独占ドメインとなる「私に道を譲るか、ボールを持って家に帰る」ということのすべてを行っているわけではないので、あなたの魅力に揺さぶられるかもしれません。

誰もあなたの頭に銃を構えて、あなたの物をネットに置くことを強制しなかったことを覚えておいてください。読者やユーザーを尊重して扱ってください。そうすれば、かなりの数のユーザーが往復することがわかります。


1
「あなたが広告ブロッカーを使用しているようです。それは素晴らしいことです!それで私達はそうします:)友達に私たちについて話してXをサポートしてください!」
ADTC 2016

3
この方法で何かを収益化しようとします...広告は通常の支払い方法なので、ユーザーは支払う必要があります
dev1223

adblockをオンにすると、レイアウトが壊れますか?
godblessstrawberry 2016年

5
ウェブサイトで広告ブロッカーを無効にするように強制された場合は、次に進みます。彼らは負けて、私は気にしません。Googleからキャッシュコピーを取得するだけです。
RayfenWindspear 2016

1
@トールボーイ、私の答えには倫理はありません。対象としているオーディエンスの現実だけがあります。そして、あなたの意図は説明されたとおりかもしれませんが、質問をもう一度読むと、レイアウトなどをクリーンアップするのではなく、ユーザーに広告を許可するように求めることが特に求められていることがわかります。それは私が答えていた質問であり、半年後の予想された他のいくつかの質問ではなかった:-)
paxdiablo 2017

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 AdSenseを使用していることに気付きました。一部のページでは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がオンになっているかどうかを検出できます。


7

AdBlockは、AdSense(など)JavaScriptファイルのロードをブロックしているようです。したがって、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配列として初期化されていることに注意してください。adsbygoogle.jsライブラリは、にこの配列を変更するObject {push: ...}ことが実行されたとき。一定時間後に変数のタイプを確認すると、スクリプトがロードされたかどうかがわかります。


これはほとんどの時間で動作しますが、ユーザーの接続が遅い場合はどうなりますか(モバイルデバイスを考えてみてください)。
Luca Steeb、2015年

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リクエストは必要ありません。単純に偽のアドの高さを計算できます。

ちなみに、adblockerがレンダリングを回避する要素と一致する完全なリストを次に示します。

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があるかどうかを確認する効率的な方法:Google広告のURLをトリガーして、adblockが有効になっているかどうかを確認するだけです。はいの場合は、callback_has_adblockを実行し、そうでない場合は、callback_no_adblockを実行します。このソリューションは、1つのリクエストにコストがかかりますが、少なくとも機能します。

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 AdSenseだけでなく、あらゆる種類の広告で機能します。


一部のadblockerがjQueryをブロックすると、「$が定義されていない」ため、スクリプトは実行されません。純粋なjsを使用することをお勧めします。
nyx

3

この質問の時代にもかかわらず、私は最近それが非常に便利であると気づきました。ここや他の場所を調べた後、広告ブロッカーを間接的に検出するための主要な3つのクライアント側のチェックは、ブロックされた div/ img、ブロックされたiframe、ブロックされたリソース(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と、「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の寸法と可視性。
  • あれば、それはあったであろうように、第2の試験の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
もちろん、これは広告がどのようにブロックされたによって異なります。広告ブロックソフトウェアが原因でAdSenseの読み込みが完全に妨げられている場合、これは機能します。ただし、アドブロッキングソフトウェアがCSS表示プロパティを「なし」に設定したり、それぞれのdivの高さを0に設定したりしている場合、これは機能しない可能性があります。
バンコクの2015年

そうだね。すべてのadblockを100%キャッチする簡単な方法はないと思いますが、少なくともいくつかはキャッチできます。
Troy Morehouse、

3

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

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

以下のようなDNSレベルの広告ブロッカー(PI-穴)は、基本的に広告ブロックドメインのリストに対して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?');
    }
});

これを試してみました。動作しません。広告ブロックソフトウェアがインストールされていない場合でも、常にtrueを返します。
ecnepsnai

これは、AdSenseを使用しているページでのみ機能することに注意してください。それ以外の場合、それは正しい応答であるため、常にtrueを返します-window.google_jobrunnerはすべてのページで検出されません。Google AdSenseを使用しているもののみ。あなたは実際に私のサイトでこのコードが動作しているのを見ることができます:ruddl.com
jesal

あなたのメソッドがたまたまHowToGeekで使用されているのと同じメッセージを使用しているのは興味深いことです。記録のために、メッセージボックスを表示することは、サイトに対してユーザーを苛立たせ、酸っぱくするだけです。ほとんどのサイトは、メッセージをページはめ込み表示することを選択しています(HTGは両方を実行しようとしますが、迷惑なポップアップのみが機能します)。
Synetech 2014年

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を無効にするようにユーザーに要求するユーザーに表示されるオーバーレイのようにソフトウェア); また、応答性を向上させました。

Coffeeware Licenseの下でオープンソース化されています。


努力を感謝しますが、adblockで動作しないようです...少なくともこのコメントを書いている時点では。
arunskrish 2014

それはadBlockで動作します。このプラグインを実装したサイトはcalyphrox.netです。このサイトでは、誰もがプラグインが機能することを確認できます。
Jmlevick 2014

3
Link is Dead ...これを削除できますか?
エヴァンラングロワ2015年

2
リンクを更新してください。これは悪い答えです。
Yazan Rawashdeh 2016年

0

あなたの緊張を理解し、スクリプトによって要素が作成されたか、要素が非表示になっているかを確認できます。また、広告のブロックについて説明する場合は、要素の表示ではなく、要素の存在に頼ることができます。

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

チェック付きの他のすべての答えは正しいですが、これを覚えておいてください。


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-message、AdBlockユーザーにメッセージを表示したい場所でID を使用できます。

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

最初に非表示にするために追加されたインラインスタイルに注意してください(もちろん、独自のCSSファイルからこれを行うこともできます)。
また、500ミリ秒かかることに注意してください。これは、adblockerが機能するまで待機する必要があるためです。そうしないと機能しません。

このスクリプトのしくみの簡単な説明

まず、ランダムに生成されたリンクのソースをiframeに追加します。(一部のadblockはスマートなため、ランダムに生成されます。ある時点で、リンクが偽物であると認識します)。
次に、そのiframeに対して複数のチェックを実行します(正常に読み込まれた場合、またはスタイルが変更された場合)。これらのテストのいずれかが真の場合は、ab-message要素をユーザーをアドブロックします。

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

追加

要点は、実際には要点を作成するだけだったかもしれませんが、代わりにGithubプロジェクトを作成しましたが、それでもチェックして、役に立った場合はスターを付けてください。
abDetector:シンプルなJavaScript JavaScript AdBlock Detector。
楽しい。


貧弱なソリューション。外部の.jsファイルは簡単にブロックされます。
バンコクの2016

@Bangkokianコピーして、JavaScriptファイルまたはindex.js(またはその他)を示すメッセージでそれ(およびそのライセンス)を参照します。
BlueEyesWhiteDragon 2016年

1
@BlueEyesWhiteDragonあなたは正しいです。しかし、それはトロイの最初の答えがまったくそうでなかった。インラインスクリプトを表示するように100%編集されました。私のコメントは立っています。彼の最初の答えは、特に外部スクリプトを使用することでした。stackoverflow.com/posts/34738388/revisions
バンコクの

@Bangkokian正確に、私はあなたのコメントのおかげで私がSOガイドラインに従うように私の回答を編集し、それをインラインスクリプトにしたことを忘れていました。ありがとうございました。
Nick Rameau 2016年

0

これをチェックして、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 2016年

window.adblocker返される場合はブラウザコンソールで値を確認し、trueadblockerが有効になっている場合はそれが返されfalseます。完全なドキュメントを確認できますdetect-adblocker
Mustafa Dwekat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.