JavaScriptで広告ブロッカーを検出しPHPでログ記録する方法
画面いっぱいに表示される広告や、チカチカ光ったり、誤クリックを狙うような広告、凄まじくウザいですよね。
個人的には読みづらいページだったら単に閉じて別のサイトへ行くだけなので、広告ブロッカーを導入してまでコンテンツを読もうとする人なんているのだろうか、くらいに考えていたのですが、先日「半分以上の方が広告ブロックを使用されているため、収入も半分以下になりました」的なつぶやきがRTされてきて、はぁ、そんなに広告ブロッカーの利用者が多いのか~、と驚きました。
広告ブロッカーの良し悪し
広告ブロッカーの良し悪しについてはとても一言では言えません。
当ブログでは100記事ごとにアクセス数がいくつだよー、広告収益はこのくらいあったよー、などと公開していますし、AdSense広告もばんばん出てきますから、広告配信側の肩を持つだろう、と思われるでしょうし、まぁ、事実そういう面もあるかも知れません。
まず大前提として、当ブログは実験目的で開設したサイトではあれど、ある程度の広告収益が見込めなければ運営を続けるつもりはありません。労力はもちろんのこと、ドメインやレンタルサーバーの実費用も発生しているわけですし。
じゃあ、広告を見ないヤツは客じゃねえ!コンテンツをかすめ取ってる盗人だ!タダ乗りだ!フリーライダーだ!広告ブロッカーなんぞ使っているやつには1ページも読ません!!…などと主張するかというとそれも違います。
いやー、だって、広告ブロッカーまで使っている方が、強制的に広告を見せられたところで、その広告をクリックするだなんてとても思えません。ならむしろ、どうぞ快適に読んで頂いて、役立つコンテンツだと感じられたなら、ご友人にも拡散してもらうとか、そっちの方向性へ進んだほうがまだ有益じゃないですかね~。
しかし、一方で、訪問者の半数以上が広告ブロッカーを使うような事態になってくるとそれはさすがに困ります。当ブログだけの収益を集計するのが面倒くさい難しいので、全部の運営サイトを合算した値になりますが、ぼくは広告収入だけで年間150万円くらいは稼いでいます。(確定申告もしています)
自慢できるほどの金額ではありませんが、かといって無視できるほど大金持ちでもありません。この収入が半分以下になったとしたら、さすがに運営コストに見合わないので全サイト閉鎖すると思います。
多くの運営者はAdSenseの自動広告任せ
統計を取ったわけでも何でもないので、単なる想像に過ぎませんが、多くのブロガーはAdSense広告を利用していても、その配置についてはGoogle任せなんじゃないかなって思うんです。少なくとも、うちはそう。
具体例を出しますが、これが当ブログのAdSenseの設定です。
ページ内広告を出すよー、画面端広告を出すよー、というだけ。
そしてモバイル用の全画面はウザいから出すなよ、と設定しています。
それから、広告掲載数の量はデフォルトより減らしています。
たしか、初期値は真ん中へんだったと思いますが、記事投稿した後に自分で読み返すとき、すっげー広告ばんばん現れてウザいなと思ったので減らしました。
ちなみにここの「ページ除外」というのは特定の広告を除外する、という意味ではなく、自分のサイト内で広告を表示したくないページがあれば設定する項目です。
昔は特定のキーワードやURLに合致する広告を出さない設定があったと思うのですが、ちょっと見た限りでは見当たりませんでした。
MMORPG全盛期に攻略サイトを運営していたのですが、AdSenseでは勝手にRMT関連の広告が頻繁に表示されていました。RMTなんて規約違反だし、RMT広告を見かけただけで文句言ってくるユーザーもいるし、過激派に至ってはRMT広告があるという理由だけでDoS攻撃をしかけてきてサイト落とされたりしたので、必死に除外してました。最終的にはGoogleからも異常なアクセス数ってことで垢バンされ、プールされていた20万円以上の広告費まで没収される始末。義憤に駆られるのは結構だけれど違法行為をしているのはどちらだっつー話です。
ネット上ではアフィカス vs ユーザーみたいな構図で語られますが、実際にどんな広告を配信するのか選んでいるのはGoogleですからね。サイト運営者は板挟みになっているだけのことが多いです。(Amazonのような成功報酬型の広告やスポンサーが付いた固定広告の話はまた別)
人のコンテンツパクって集めてるだけのキュレーションサイト(笑)≒まとめサイトや「おすすめの〇〇 10選!」みたいな使ってもいないのにネットでひろったレビューだけ集めて勝手にランキング作ってるクソサイトが検索結果の上位を占める昨今、Googleの根幹をなす検索エンジンすらおかしな状況なので、そろそろ個人ブロガーもAdSense離れしたほうが良い時期なのかも知れません。
JavaScriptで広告ブロッカーの検出処理を実装する
前振りくらいのつもりが、語りたいことが多すぎてだいぶ長くなってしまいました。
あらためてJavaScriptで広告ブロッカーを検出する方法です。先述したとおり、検出したからといってページを非表示にするのが目的ではありません。統計を取るのが目的です。
JavaScriptのソース
<script>
window.addEventListener('load', function () {
let elms = document.getElementsByClassName('adsbygoogle');
if (elms.length == 0) return;
if (!elms[0].getElementsByTagName('IFRAME').length){
console.log("広告ブロッカー使われてるっぽいYO");
}
});
</script>
参考記事:https://freefielder.jp/acb/
最初は自前で作ってたんですけど、adsbygoogleのオブジェクトが消されるわけでもなく、どこを消してるのかわからんなぁ…と思ってググったらそのままズバリのコードが出てきたので、がっつり参考にさせてもらいました。iframeの有無を見れば良かったのね。
広告ブロッカーを検出したらPHPでログに記録する
JavaScriptによる検出部分
<script>
window.addEventListener('load', function () {
let elms = document.getElementsByClassName('adsbygoogle');
if (elms.length == 0) return;
if (!elms[0].getElementsByTagName('IFRAME').length){
//広告ブロッカーを検出したので記録用のPHPを呼び出す
let xhr = new XMLHttpRequest();
let postData = new FormData();
postData.append('key', 'hogehoge');
xhr.open('POST', 'adblocklog.php', true);
xhr.send(postData);
}
});
</script>
広告ブロッカーを検出したら別の広告を表示する、なんて笑える…ごほん…ダイナミックなコードを書いている方もいましたが、そうじゃない、そうじゃないんだ。広告ブロッカーを使っている人がどのくらいいるのか確認し、その増減によって自分のサイトを見直すのがスマートだと思うんだ。
ということで、広告ブロッカーを検出したら、XMLHttpRequestを使って、adblocklog.phpを呼び出すようにしました。最近の検索エンジンのbotはGET処理を見かけると読みにきて勝手に起動されてしまうため、POSTにしています。ついでに、POSTデータとして key=hogehoge もセット。ここまでしておけば勝手にPOSTしちゃうbotはいないでしょう。…たぶん。
PHPによるログ記録部分
<?php
if (!isset($_SERVER['HTTP_REFERER']) ||
!isset($_POST['key']) ||
$_POST['key'] != 'hogehoge') {
exit();
}
$data = implode(',', array(date("Y/m/d H:i:s"),
@$_SERVER['HTTP_REFERER'],
@$_SERVER['REMOTE_ADDR'],
@gethostbyaddr($_SERVER['REMOTE_ADDR']),
'"'.@$_SERVER['HTTP_USER_AGENT'].'"'))."\n";
file_put_contents(date('Ymd').'_adblock.log', $data, FILE_APPEND);
?>
■初期処理
- HTTP_REFERER(リファラー=呼び出し元)がセットされているか確認し、なければ何もしない。
- POSTデータのkeyを確認し、hogehogeでなければ何もしない。
初期処理を抜けてきたら、あとは日時/リファラ/IPアドレス/ホスト情報を1行にまとめて記録しています。
ファイル名の頭には年月日を付けているので、1日1ファイル、ログが出来ることになります。
これで広告ブロッカーを使ったアクセスがどのくらいあるのかざっくりとした統計が取れるかと。
まとめ
訪問者の半分以上が広告ブロッカー使用者のため困ってますぅ~的なつぶやきが流れてきたので広告ブロッカーに興味を持ちました。
今のところは特段収益が減っているわけでもないので、うちには影響なさそうですが、今後どのように状況が変わっていくかわからないため、広告ブロッカーを検出し、ログ記録するような仕組みを作ってみました。
今後は当ブログに設置して、ゆっくりと統計を取っていきたいと思っています。先述の例ではわかりやすいようにテキストファイルに記録していますが、実運用するときはSQLiteかなぁー。同一IPアドレスは一人としてカウントしたいだろうし。
今回、ぼくは生まれてはじめてAdBlockという広告ブロッカーを入れてみたのですが、軽く使った感じではブロックされるのはAdSenseだけっぽい?
例えば、以下のようなAmazonアフィリエイトの広告は消えないですよね。それも設定次第なのかなー。