GoogleとStackoverflowを数時間検索したところ、解決策が見つかりませんでした。私がやろうとしているのは、Adblock plusを検出し、今のところ簡単なメッセージを表示することです。
私がやりたいのは、JavaScriptファイルまたはjQueryを使用してAdblock plus withoutを検出することです。ほとんどのadblockは、「adblock = false;」に設定する行を含む独自のドメインでホストされているファイル「show_ads.js」を使用するスクリプトを検出します。
JavaScriptファイルの使用に関する問題、ユーザーはそのJavaScriptファイルをホワイトリストに登録できますが、検出されなくなります。私が探しているのは、誰かがファイルを使用せずに広告ブロッカーを使用しているかどうかを検出するHTMLに直接読み込まれるJavaScriptです。
以下の例:
<script type="text/javascript">
// line of code that detects if using ad blocker
if so display message
</script>
この方法で行う理由は、広告ブロッカーがサーバー上のJavaScriptファイルをホワイトリストに登録できないことです。はい、NoScriptアドオンでこれを回避する他の方法があることは知っていますが、その解決策は既にあります。一度も試されたことのない素晴らしいアイデアがあり、一度それをやると広告ブロッカーはこれをブロックできません。
提案や例は大歓迎です。
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
/adframe.
を含むURLをブロックします。
2018年8月25日更新
Adblock plusは、リストの検索方法と広告のブロック方法を変更しました。ブロックに使用されるサブスクリプションと呼ばれるリストの束があります。例えば、これはデフォルトのものです:
https://easylist-downloads.adblockplus.org/easylist.txt
このファイルのルールを使用して、使用するファイル名を見つけることができます。たとえば、seo-ads.jsを使用できます
開発者向けPS:何らかの理由で、ABPにローカル環境でこれらのファイルをブロックさせることができませんでした。
P.S:ABPは私のお気に入りの広告ブロッカーです:-D
プラグイン「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/
私が現場で見たのは、広告の背景に背景画像を使用していることです。 adblockがアクティブでない場合、広告は背景画像の上に表示されます(これにより、背景画像が表示されなくなります)。 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;
}
AdBlockがアクティブであっても、広告を表示したい場合は、AdBlockの機能を理解する必要があります。
AdBlockもCSSを変更できると言われていますが、要素の非表示と折りたたみ以外のドキュメントは見つかりません。
それでは、AdBlockよりも「賢く」なるために正確にできることは何でしょうか?
「一致」しないようにリクエストを隠すことができます(例:_http://domain.com/ae9a70e0a.png
_、画像名は毎回、共通のプレフィックスなしでランダムになります)。私の知る限り、AdBlockのルールに正規表現を含めることはできません。ルールは、広告に一致しないか、リソースが多すぎます。サーバー上のそのようなURLを書き換えて、広告を指すようにすることができます。
ただし、AdBlockは広告の読み込みをブロックできない場合がありますが、それでも広告を非表示にできる場合があります。これを回避する実際の方法はありません。要素を選択するだけのスマートなCSSセレクターが常に存在します。ただし、背景画像にコンテンツを追加することはできます。これは広告(クリック不可)には役立ちませんが、他のメッセージの表示に役立つ場合があります。欠点は、誰かがその迷惑な背景画像をブロックすることに決めた場合、コンテンツも隠してしまうことです。
スクリプトに関する限り、ajaxリクエストで広告をロードできる場合があります。リソースがロードできなかった場合(ブロックされたため)、エラーが発生すると想定しています(ただし、テストできません)。 (jQueryの$.ajax( request ).error( function() { ... } );
または通常のjavascriptの同等のもの)。それを使って他のことをすることができます。外部リソースの代わりにドキュメント自体にそれを含めて、常に実行されるようにすることができます(javascriptが有効な場合)。それでも、「他に何をするにしても」が目に見える形で表示されるかどうかはわかりません。最後の手段として、window.alert( ... )
を作成できます。あなたがそれを使用する場合、3ページ以内に、あなたの訪問者が戻ってくることはないと仮定します。
私が考えることができる別の方法は、サーバーへのWebSocketを作成することです(これはAdBlockによってブロックすることはできません)。サーバー側では、特定のページが読み込まれたときに広告ページが読み込まれていないかどうかを調べる必要があります。この情報はソケットを介して送信できます。これは、スクリプトで「何か」を行うために使用できます。ただし、これは非常に複雑に聞こえますが、AdBlockを検出する「単なる」スクリプトにとっては大きなオーバーヘッドです。
単純な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 = ' ';
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);
Adblockを検出するコードは次のとおりです。コードの仕組みを学ぶことができます こちら
function detect()
{
//create a iframe. Append the iframe to the body. And then after 100ms check if their offsetHeight, display or visibility is set such a way that user cannot see them.
//In the URL use the words specific to advertising so that Adblock can do string matching.
var iframe = document.createElement("iframe");
iframe.height = "1px";
iframe.width = "1px";
iframe.id = "ads-text-iframe";
iframe.src = "http://domain.com/ads.html";
document.body.appendChild(iframe);
setTimeout(function()
{
var iframe = document.getElementById("ads-text-iframe");
if(iframe.style.display == "none" || iframe.style.display == "hidden" || iframe.style.visibility == "hidden" || iframe.offsetHeight == 0)
{
alert("Adblock is blocking ads on this page");
iframe.remove();
}
else
{
alert("Adblock is not detecting ads on this page");
iframe.remove();
}
}, 100);
}
次のスニペットは、ほとんどすべての広告ブロッカーを検出します。 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()
メソッドは両方とも必須ですが、どちらか一方のみが呼び出されます。
Do n'tは、コードを_adblocker.js
_などに入れます。これらの種類のファイル名自体はロードがブロックされるためです。インラインにするか、ランダム/任意のファイル名に含めるか、メインサイトのJSファイルに結合します。
私にとっては、どのトリックもうまくいきませんでした。ただし、これはGoogle広告に実装する非常に具体的な方法です。
window.onload = function() {
if (document.getElementsByClassName('google-auto-placed').length == 0){
// Adblock Detected
}
}
Amazonのような他の広告システムがある場合は、ページを調べて一般的なクラス名/ IDを探してください。
このコードを別の.jsファイルに配置する場合は、ファイル名を確認してください「Ad」Wordが含まれていない。名前を付けてくださいmagic.js
Googleがdiv名の変更を決定した場合、このメソッドは失敗します。しかし、そうは思えない。
うまく機能するシンプルな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();
私の場合、ADBは広告がなくてもコンテンツを隠していました。(ad
Wordが多くのURLに存在していたからです。これは投稿タイプのスラッグであったためです。
しかし、コンテンツを削除するのではなく、表示を適用するだけであることに気付きました。
追加のソリューションとして、
ディスプレイの適用に気づいたばかりです:block!important;ボディをデ、アドブロックプラスによってコンテンツを隠すことを防ぎます
<body style="display: block !important;">
<img src="url-containg-ad-ads-Word.jpg" alt="you should see this anyway" >
</body>
Smartestと私が見つけた最も簡単な方法は:
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");
}
スクリプトは、「ベイト」IDを徹底的にチェックすることで、そのマークアップが現在のhtml
に存在するかどうかを検出します。
これはAdblock
、AdBlock-Plus
&uBlock Origin
すべてのブラウザのすべてのサイト。
これを処理する最も簡単な方法を次に示します(iframeなし、jqueryなし):
var elem = document.createElement('div');
elem.className = 'adclass';
document.body.appendChild(elem);
window.setTimeout(function () {
var isAdblockEnabled = !(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
if (isAdblockEnabled) {
// Adblock is enabled
}
}, 0);
それは確かに軍拡競争であり、広告をブロックするすべての人の権利をサポートしますが、広告収益に依存するウェブサイトもサポートします。 。ユーザーに広告を強制的に表示させようとするサイトは承認しませんが、丁寧なメッセージは問題ありません。
とにかく、現時点では多くのアドブロッキング拡張機能/プラグインがあり、それらはすべて異なる方法を使用でき、OSとブラウザ間でも異なる場合があることに注意する価値があります。現時点では、このjQueryセレクタは、少なくともChromeとFirefoxでクロスプラットフォームでAdBlockまたはAdBlockplusが使用されているかどうかを確認するには十分です。
if($("div[id^=google_ads_iframe_] iframe:visible").length == 0) {
// pop up a message or whatever
}