動的読込みの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-statusdoneが設定されているかで判定しています。正常に読み込まれればadsbygoogle.jsによって設定されるはずです。外部から設定された場合、無力です。

以前は、iframeの有無で判定していましたが、GoogleAdSense側の仕様変更でload/errorタイミングにifarameが生成されなくなったようです。(2020年4月17日頃確認)

Adblock

EasyPrivacyフィルターリストが導入されている場合、GoogleAdSenseだけでなくGoogleAnalyticsもブロックされます。そのため、GoogleAnalyticsでブロック数を収集する場合、ブロックイベントを収集できないため、ブロック数が実際より少なく表示されます。(ただし、元々のPV数も少なくなているのであまり実害はありません。)

※GoogleAnalyticsとの通信がブロックされるため、別サーバ経由で回避できます。
※GoogleAnalytics以外のAnalytics系も同様だと思われます。

関連記事