46

Google と Stackoverflow を数時間検索した後、解決策が見つかりませんでした。私がやろうとしているのは、Adblock plus を検出して、今のところ簡単なメッセージを表示することです。

私がやりたいことは、JavaScript ファイルや jQuery を使用せずにAdblock plus を検出することです。ほとんどの adblock と検出スクリプトは、ファイルを使用します。たとえば、独自のドメインでホストされている「show_ads.js」には、「adblock = false;」を設定する行が含まれています。

JavaScript ファイルを使用する際の問題です。ユーザーはその JavaScript ファイルをホワイトリストに登録すると、それが検出されなくなります。私が探しているのは、誰かがファイルを使用せずに広告ブロッカーを使用しているかどうかを検出する、HTML に直接読み込まれる JavaScript です。

以下の例:

<script type="text/javascript">
 // line of code that detects if using ad blocker

 if so display message
 </script>

このようにする理由は、広告ブロッカーがサーバー上の JavaScript ファイルをホワイトリストに登録できないためです。はい、NoScript アドオンを使用してこれを回避する方法が他にもあることは知っていますが、その解決策は既にあります。私は試したことのない素晴らしいアイデアを持っています。広告ブロッカーは、それが完了するとこれをブロックできません。

どんな提案や例も大歓迎です。

4

15 に答える 15

75

adblock を検出するためのプラグインは必要ありません。これを使用するだけです。

<script type="text/javascript">
    var adblock = true;
</script>
<script type="text/javascript" src="adframe.js"></script>
<script type="text/javascript">
    if(adblock) {
          //adblock is installed and enabled on this site :-D
    }
</script>

adframe.jsの内容:

adblock = false;

更新: Adblock Plus は、特定のリクエストをブロックしたり、既存のパターンに基づいて特定の要素を非表示にしたりします。これらのパターンの 1 つがこれです ( patterns.ini内):

[Filter]
text=/adframe.
hitCount=843
lastHit=1456391595626

その中に含まれるすべての URL をブロックします/adframe.

2018 年 8 月 25 日更新

Adblock plus は、リストを見つけて広告をブロックする方法を変更しました。ブロックに使用されるサブスクリプションと呼ばれるリストがたくさんあります。たとえば、これはデフォルトのものです:

https://easylist-downloads.adblockplus.org/easylist.txt

このファイルのルールを使用して、使用するファイル名を見つけることができます。たとえば、seo-ads.jsを使用できます。

開発者向け PS : 何らかの理由で、ローカル環境でこれらのファイルを ABP にブロックさせることができませんでした。

PS : ABP は私のお気に入りの広告ブロッカーです :-D

于 2014-06-08T21:50:09.120 に答える
20

私のプラグイン「FuckAdBlock」を使用すると、AdBlock を非常に簡単に検出できます: https://github.com/sitexw/FuckAdBlock

例 :

fuckAdBlock.on(true, function() {
    alert('AdBlock detected !');
}).on(false, function() {
    alert('AdBlock is not detected =)');
});

オンラインの例: http://fuckadblock.sitexw.fr/

于 2013-11-29T09:57:31.273 に答える
10

私が現場で見たのは、広告の背後に背景画像を使用していることです。adblock がアクティブでない場合、広告は background-image の上に表示されます (background-image が表示されなくなります)。adblock がアクティブな場合、広告はブロックされ、ユーザーには代わりに背景画像が表示されます。

<div id="ad-container">
  <img src="../ad/ad.png" id="ad">
</div>

CSS の場合:

#ad-container {
  background-image: url( http://domain.com/pleasedonotuseadblocker.png );
  height: 200px;
  width: 200px;
}

#ad {
  height: 200px;
  width: 200px;
}
于 2013-08-12T06:25:26.100 に答える
6

AdBlock がアクティブな場合でも広告を表示したい場合は、AdBlock の機能を理解する必要があります。

  1. AdBlockはリソースの読み込みをブロックできます
  2. AdBlock は、DOM 内の特定の要素を非表示にすることができます。

AdBlock は CSS も変更できると言われていますが、要素の非表示と折りたたみ以外のドキュメントは見つかりません。


では、AdBlock よりも「賢く」なるには、具体的に何ができるでしょうか?

決して「一致」しないようにリクエストを偽装することができます (たとえばhttp://domain.com/ae9a70e0a.png、イメージ名が毎回ランダムで、共通のプレフィックスがない場合)。私の知る限り、AdBlock のルールに正規表現を含めることはできません。ルールは広告に一致しないか、リソースが多すぎます。サーバー上でこのような URL を書き換えて、広告を指すようにすることができます。

ただし、AdBlock で広告の読み込みをブロックできない場合でも、非表示にできる場合があります。これを回避する実際の方法はありません。要素を選択するだけのスマート CSS セレクターが常に存在します。ただし、コンテンツを含む背景画像を追加することはできます。これは広告には役に立ちません (クリックできません) が、他のメッセージを表示するのに役立つ場合があります。欠点は、誰かがその迷惑な背景画像をブロックすることを決定した場合、コンテンツも非表示になることです.


スクリプトに関する限り、ajax リクエストで広告を読み込める可能性があります。リソースをロードできなかった場合(ブロックされたため)、エラーが発生すると思います(ただしテストはできません)。($.ajax( request ).error( function() { ... } );jQueryまたは通常のJavaScriptの同等のもの)。それを使って何か他のことをすることができます。外部リソースの代わりにそれをドキュメント自体に含めて、常に実行されるようにすることができます(JavaScriptが有効な場合)。それでも、「他に何をしても」が目に見えるように表示されるかどうかはわかりません。最後の手段として、window.alert( ... ). それを使用すると、3ページ以内に訪問者が戻ってこないと仮定します。

私が考えることができる別の方法は、サーバーへの Websocket を作成することです (これは AdBlock でブロックできません)。サーバー側では、特定のページが読み込まれたときに広告ページが読み込まれていないかどうかを調べる必要があります。この情報は、スクリプトで「何か」を行うために使用できるソケットを介して送信できます。ただし、これはとてつもなく複雑に聞こえ、AdBlock を検出する「ただの」スクリプトにとってはかなりのオーバーヘッドです。

于 2013-08-12T08:26:02.757 に答える
4

単純な Ajax 呼び出しがその仕事をします:

var xmlhttp = new XMLHttpRequest()
xmlhttp.onreadystatechange = function() {
  if( xmlhttp.readyState == XMLHttpRequest.DONE ){
    if( xmlhttp.status !== 404 ){
        console.log("Blocking ads")
    }else{
        console.log("Not blocking ads")
    }
  }
}
xmlhttp.open("GET", "/498100ffe815d700cd838d1/ads/showad.js", true)
xmlhttp.send()

またはさらに良いことに、HTTP オーバーヘッドはありません。

var adBlockTester = document.createElement('div');
adBlockTester.innerHTML = '&nbsp;';
adBlockTester.className = 'adsbox';
document.body.appendChild(adBlockTester);
window.setTimeout(function() {
  if( adBlockTester.offsetHeight === 0 ){
    console.log("Blocking ads")
  }else{
    console.log("Not blocking ads")
  }
  document.body.removeChild(adBlockTester);
}, 60);
于 2017-08-09T02:32:14.820 に答える
3

次のスニペットは、ほぼすべての広告ブロッカーを検出します。が必要jQueryです。

(function(){
    var bait = 'http://googleads.g.doubleclick.net/pagead/gen_204?id=wfocus&gqid=advertisment&advert=ads';
      $.ajax({ url: bait, dataType: "script"})
      .fail(function () { alert('ad blocked'); })
      .abort(function () { alert('ad blocked'); });
    })();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

自己実行型の匿名関数にラップされているため、サイト上の他の変数やコードに干渉しません。

最もbait人気のある広告配信ネットワーク (Google のダブルクリック) を使用し、easylistなどで使用される他のいくつかのクエリ パラメータが含まれています。

fail()メソッドとメソッドのabort()両方が必要ですが、呼び出されるのはどちらか一方だけです。

これらの種類のファイル名自体はロードがブロックされるため、コードを入れadblocker.jsたり、類似したものを入れたりしないでください。インライン化するか、ランダム/任意のファイル名に含めるか、メイン サイトの JS ファイルに結合します。

于 2016-10-27T09:02:57.027 に答える
2

うまく機能する単純な javascript/jQuery 検出:

$('body').append('<div id="ad-container" style="position:absolute;"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=" id="ad"></div>');
var ad_container = $('body').children('#ad-container');
if(!ad_container.is(":visible")) {
  // Add your warning and/or adblock detection logic here.
}
ad_container.remove();
于 2017-09-10T05:09:43.503 に答える
2

私が見つけた最もスマートで簡単な方法は次のとおりです。

1)htmlこのコードをマークアップのどこかに、おそらく一番上に追加します。

<div id="bait" class="pub_300x250" style="color: #fff">.</div>

通常、広告ブロッカーは、 Easylistに記載されている (pub_300x250) の広告サイズを検出してブロックしますが、これは「餌」によってトリガーされます。

2)次に、この js コードをスクリプト ファイルに追加します。

if (document.getElementById("bait").offsetHeight === 0) {
    // function code or alert (whatever) here.
   alert("Ad-Blocker DETECTED");
}

html私たちのスクリプトは、 「bait」ID をチェックすることで、そのマークアップが現在存在するかどうかを検出します。

これは、すべてのブラウザのすべてのサイトでAdblock&AdBlock-Plusで機能します。uBlock Origin

于 2018-07-16T22:31:19.467 に答える
-1

私はこれがちょっと古いことを知っていますが、ここにそれを行うためのより良い方法があります:
これをあなたのセクションに追加してください<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 ミリ秒かかることにも注意してください。これは、広告ブロッカーが機能するのを待たなければならないか、機能しないためです。

このスクリプトがどのように機能するかについての簡単な説明

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

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

追加

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

于 2016-01-12T07:50:53.177 に答える
-3

サードパーティの広告を使用する場合に最適なスクリプトの 1 つを見つけました。

antiblock.org免責事項 とにかく、私はこのサイトと提携していません。

ほとんどのサイトで機能し、バイパスしたい場合は、独自のフィルターを追加するか (通常のユーザーにとっては複雑です)、adblock フィルターに連絡して追加する必要がありますが、リストが過負荷になり、速度が低下する原因となります。広告ブロック ユーザー。

于 2015-08-20T14:44:48.713 に答える