動的読込みのGoogleAdSense広告のブロックを判定する
Google AdSenseの遅延読込みでページ表示速度を改善の記事で書いたスクリプトの追加機能です。
当ブログでは、関連記事をGoogleアドセンスの関連コンテンツに依存しています。そのため、広告をブロックされると関連記事が表示されず、ユーザのサイト内周遊に大きな問題が発生します。広告ブロックした場合でも、関連記事を表示するための導入前段階です。(JavaScript無効対策で静的に関連記事配置したいけどBloggerじゃ無理だよね…)
コード
// GoogleAdSenseの読込み
var ad = document.createElement('script');
ad.type = 'text/javascript';
ad.async = true;
//ad.dataset.adClient = 'ca-pub-XXXXXXXX';
ad.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js';
function onLoadGoogleAdSense() {
var ads = document.getElementsByClassName('adsbygoogle');
if (ads && ads.length && ads[0].dataset.adsbygoogleStatus != 'done') {
// 広告ブロックあり
//console.log('adblock');
} else {
// 広告ブロックなし
//console.log('adsense');
}
}
ad.addEventListener('load', onLoadGoogleAdSense);
ad.addEventListener('error', onLoadGoogleAdSense);
var sc = document.getElementsByTagName('script')[0];
sc.parentNode.insertBefore(ad, sc);
//console.log('load');
補足
基本的には、adsbygoogle.js
のerrorイベントで動作しています。言い換えると、errorイベントすら発生しない広告ブロックでは無力です。その場合、広告ブロックなし判定すら行われない可能性が高いです。
動作は、ins.adsbygoogle
タグのdata-adsbygoogle-status
にdone
が設定されているかで判定しています。正常に読み込まれればadsbygoogle.js
によって設定されるはずです。外部から設定された場合、無力です。
以前は、iframeの有無で判定していましたが、GoogleAdSense側の仕様変更でload/errorタイミングにifarameが生成されなくなったようです。(2020年4月17日頃確認)
Adblock
EasyPrivacyフィルターリストが導入されている場合、GoogleAdSenseだけでなくGoogleAnalyticsもブロックされます。そのため、GoogleAnalyticsでブロック数を収集する場合、ブロックイベントを収集できないため、ブロック数が実際より少なく表示されます。(ただし、元々のPV数も少なくなているのであまり実害はありません。)
※GoogleAnalyticsとの通信がブロックされるため、別サーバ経由で回避できます。
※GoogleAnalytics以外のAnalytics系も同様だと思われます。