Google AnalyticsやTag Managerの ブロックを検出 する方法 | T&N リサーシャ
Now Loading...

Google AnalyticsやTag Managerの ブロックを検出 する方法

Google AnalyticsやTag Managerのブロックについて調べていたら, これらの ブロックを検出 する方法が海外のサイトで紹介されていました.

WordPressに実際に導入するのに色々と梃子摺ったので, 自分の備忘録を兼ねて導入方法を紹介しています.

この方法は, サイトの訪問者のGoogle AnalyticsやTag Managerの有効・無効を検出し, Google Analyticsに記録します.

スポンサーリンク

はじめに

Google AnalyticsやTag Managerを利用してサイトのアクセス解析を行っている人は多いと思います.

そして, WordPressを利用している人はSlimStatのようなプラグインと併用されているのではないかと思います.

しばらく使っていれば分かると思いますが, SlimStatでは記録されているのに, Google Analyticsでは記録されていない訪問者が出てきます.

このGoogle Analyticsで記録されない訪問者の情報を全てではなくとも, slim statとある程度合わせることができないかと考えました.

当サイトでは, 既にjavascriptでadblockを利用しているユーザーを検出してGoogle Analyticsに記録しています.

そこで, javascriptでGoogle AnalyticsやTag Managerのブロックを検出することが出来ないか調べてみると以下のサイトを見つけました.

ここでは, このサイトで紹介された方法を掻い摘んで紹介するので, 詳細に関しては上記の参考サイトを参照してください.

ブロックを検出photo by 写真AC

Measurement Protocol

 Google Analyticsでサイト訪問者のデータを取得する方法は, 基本的にはサイトにトラッキングコードを埋め込むことが挙げられます.

そして, もう一つの方法として, Measurement Protocolを利用することで, Google Analyticsのサーバーに訪問者のデータをリアルタイムで直接送信することが挙げられます.

Google Analyticsにデータを送る方法の詳細は, Measurement Protocolのデベロッパー ガイドを参照してください.

ここでは参考サイトに合わせて, まずイベントトラッキングの送信方法について説明します.

イベントトラッキングとページトラッキングのパラメータを見れば分かると思いますが, 基本的にv・tid・cid・tの4つのパラメータが共通に必要です.

イベントトラッキングの送信方法

イベントトラッキングの送信に必要なパラメータは以下の通りです.

v=1              // Version.
&tid=UA-XXXXX-Y  // Tracking ID / Property ID.
&cid=555         // Anonymous Client ID.

&t=event         // Event hit type
&ec=video        // Event Category. Required.
&ea=play         // Event Action. Required.
&el=holiday      // Event label.
&ev=300          // Event value.

このパラメータをMeasurement Protocol Hit Builderで確認すると, 以下のようになります.

v=1&t=event&tid=UA-XXXXX-Y&cid=555&ec=video&ea=play&el=holiday&ev=300&hl=ja

上記のパラメータに, 次のURL(https://www.google-analytics.com/collect?)を追加して, ブラウザのアドレスバーに入力して実行するとGoogle Analyticsに記録されます.

https://www.google-analytics.com/collect?v=1&t=event&tid=UA-xxxxxxxx-x&cid=555&ec=video&ea=play&el=holiday&ev=300

試しに, UA-xxxxxxxx-xを自分のトラッキングIDに変換して実行してみると, 以下のようにGoogle Analyticsの「リアルタイム」→「イベント」に記録されていることが確認できます.

record_event_example

上の図のように, イベントカテゴリ(ec)がvideo, イベントアクション(ea)がplayと記録されていることが分かります.

ページトラッキングの送信方法

ページトラッキングの送信に必要なパラメータは, 以下の通りです.

v=1              // Version.
&tid=UA-XXXXX-Y  // Tracking ID / Property ID.
&cid=555         // Anonymous Client ID.

&t=pageview      // Pageview hit type.
&dh=mydemo.com   // Document hostname.
&dp=/home        // Page.
&dt=homepage     // Title.

このパラメータをMeasurement Protocol Hit Builderで確認すると, 以下のようになります.

v=1&t=pageview&tid=UA-XXXXX-Y&cid=555&dh=mydemo.com&dp=%2Fhome&dt=homepage

イベントトラッキングと同じようにGoogle AnalyticsのURLを追加して, ブラウザのアドレスバーに入力して実行するとGoogle Analyticsに記録されます.

https://www.google-analytics.com/collect?v=1&t=pageview&tid=UA-XXXXX-Y&cid=555&dh=mydemo.com&dp=%2Fhome&dt=homepage

イベントトラッキングの時と同様に, UA-xxxxxxxx-xを自分のトラッキングIDに変換して実行してみると, 以下のようにGoogle Analyticsの「リアルタイム」→「コンテンツ」に記録されていることが確認できます.

record_pageview_example

上の図のように, ドキュメントページ(dp)が/home, ドキュメントタイトル(dt)がhomepageと記録されていることが分かります.

ブロックを検出 する方法

 参考サイトでは, Google AnalyticsやTag Managerの ブロックを検出 するため, 以下のようなjavascriptを例として紹介しています.

<script type="text/javascript">
	window.addEventListener('load', function()
	{
		if(window.ga && ga.create) 
		{
			console.log('Google Analytics is loaded');
		} 
		else 
		{
			console.log('Google Analytics is not loaded');    
		}
      
		if(window.google_tag_manager)
		{
			console.log('Google Tag Manager is loaded');
		}
		else
		{
			console.log('Google Tag Manager is not loaded');
		}
	}, false);
</script>

この例では, if(window.ga && ga.create)でGoogle Analyticsの有効無効を判定し, if(window.google_tag_manager)でTag Managerの有効無効を判定します.

例えば, このscriptを<footer></footer>の以下に挿入し, Firefoxの要素やGoogle Chromeの検証でコンソールを確認してみてください.

Google AnalyticsやTag Managerの有効無効によって, コンソールに表示される内容が切り替わるはずです.

スパム対策?

 参考サイトの内容を読むと, どうやらリファラスパムは, Measurement Protocolを利用しているようです.

なので, 送信データのトラッキングIDが分かれば, パラメータの設定次第で色々なサイトから流入してきたというデータを捏造することが出来そうです.

実際に, 以前, リファラスパムによる海外サイトからの流入が激増したことがあり, Google AnalyticsのフィルタでトラッキングIDをフィルタリングすると, リファラスパムがめっきり減りました.

このリファラスパムの対策として, 参考サイトではPHPを利用しているようです.

PHPの内容は以下の通りです.

<?php
 
header('Content-Type: image/png');
echo base64_decode('R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs');	
 
if(isset($_GET['tid'])) { $tid = $_GET['tid']; } else { $tid = 'UA-XXXXXX-X';}
if(isset($_GET['ec'])) { $ec = $_GET['ec']; } else { $ec = 'Blocking';}
if(isset($_GET['ea'])) { $ea = $_GET['ea']; } else { $ea = 'Something';}
 
$params = array(
'v' => 1,
'tid' => $tid,
'cid' => rand(1000000,9999999),
't' => 'event',
'ec' => $ec,
'ea' => $ea,
'ni' => '0',
'z' => rand(1000000,9999999),
);
 
$url = 'https://www.google-analytics.com/collect';
$content = utf8_encode(http_build_query($params));
$user_agent = '';
 
$ch = curl_init();
curl_setopt($ch,CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-type: application/x-www-form-urlencoded'));
curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
curl_setopt($ch,CURLOPT_POST, TRUE);
curl_setopt($ch,CURLOPT_POSTFIELDS, $content);
curl_exec($ch);
curl_close($ch);
 
?>

上記の内容を保存したファイル名をcollect.phpとし, サーバーの任意の場所にアップロードします.

参考サイトではルートとしているので, ここでもルートにアップロードしておきます.

さくらインターネットの場合, アップロードしたcollect.phpのパーミッションを644にしておくこと忘れずに!

WordPressの場合, PHPで<?php echo home_url(); ?>/collect.phpとしてやると, ルートのcollect.phpを読み込みます.

このことに関する具体的な書き方は以下に説明します.

ブロック検出後の処理

次にブロックを検出する方法で紹介したスクリプトを以下のように修正します.

ただし, WordPressの場合, collect.phpをルートで指定しても読みこまないので, 赤文字のように修正する必要があります.

<script type="text/javascript">

	window.addEventListener('load', function()
	{
		if(window.ga && ga.create) 
		{
			console.log('Google Analytics is loaded');

			var img = document.createElement('img');
			img.setAttribute('style','display:none;');
			img.src = '<?php echo home_url(); ?>/collect.php?tid=UA-XXXXXX-X&ec=Allowing&ea=Google%20Analytics&el=%2F<?php echo get_post($wp_query->post->ID)->post_name; ?>%2F';
			document.body.appendChild(img);    
		}
		else 
		{
			console.log('Google Analytics is not loaded');

   			var img = document.createElement('img');
			img.setAttribute('style','display:none;');
			img.src = '<?php echo home_url(); ?>/collect.php?tid=UA-XXXXXX-X&ec=Blocking&ea=Google%20Analytics&el=%2F<?php echo get_post($wp_query->post->ID)->post_name; ?>%2F';
			document.body.appendChild(img);    
		}
      
		if(window.google_tag_manager)
		{
			console.log('Google Tag Manager is loaded');

			var img = document.createElement('img');
			img.setAttribute('style','display:none;');
			img.src = '<?php echo home_url(); ?>/collect.php?tid=UA-XXXXXX-X&ec=Allowing&ea=Google%20Tag%20Manager&el=%2F<?php echo get_post($wp_query->post->ID)->post_name; ?>%2F';
			document.body.appendChild(img);    
		}
		else
		{
			console.log('Google Tag Manager is not loaded');

			var img = document.createElement('img');
			img.setAttribute('style','display:none;');
			img.src = '<?php echo home_url(); ?>/collect.php?tid=UA-XXXXXX-X&ec=Blocking&ea=Google%20Tag%20Manager&el=%2F<?php echo get_post($wp_query->post->ID)->post_name; ?>%2F';
			document.body.appendChild(img);    
		}
	}, false);
</script>

参考サイトでは, イベントラベルがないので, イベントラベルにスラッグを入れるように上記のスクリプトでは以下の内容を追加しています.

&el=%2F<?php echo get_post($wp_query->post->ID)->post_name; ?>%2F

WordPressでスラッグを取得する方法は, 以下のサイトを参考にしました.

イベントラベルにスラッグを入れるようにする場合, collect.phpを修正する必要がありますが, ここでは割愛します.

 今回のこのスクリプトで最初によく分からなかったのは, 以下の部分でした.

img.src = '<?php echo home_url(); ?>/collect.php?tid=UA-XXXXXX-X

この部分では, まず<?php echo home_url(); ?>でサイトのURLを取得し, ?以降に記述した引数(tid=UA-XXXXXX-X)をcollect.phpに渡します.

次にcollect.phpでは, $_GET[‘tid’]でUA-XXXXXX-Xを取得します.

この一連の処理を理解することに以下のサイトが参考になりました.

最後に

 今回, このGoogle AnalyticsやTag Managerのブロックを検出し, Google Analyticsでその数を記録した結果, 想像以上にGoogle AnalyticsやTag Managerがブロックされていることが分かりました.

ただ, 上記で紹介したjavascriptによるGoogle AnalyticsやTag Managerの有効無効の条件分岐の場合, Google AnalyticsとTag Managerのイベントがそれぞれカウントされてしまうという問題が生じます.

なぜなら, 上記の条件分岐では有効でも無効でもイベントデータを送信し, その時にページビュー数もカウントされているからです.

このため, Google AnalyticsやTag Managerがダブルカウントとなり, ページビュー数がや実際の数値より多くなっていたようです.

この問題を解決するには, 自分のアクセス解析の方法に合わせて条件分岐を変えるしかありません.

例えば, Tag Managerを利用していない場合は, Tag Managerの条件分岐をなくすことが挙げられます.

また, Google AnalyticsやTag Managerが有効である場合, 必要なデータは記録されているはずなので, 有効のときに行う処理をなくすことも挙げられます.

私の場合は, Google AnalyticsかTag Managerのどちらかが無効, あるいはGoogle AnalyticsとTag Managerがどちらも無効のときにデータを送信するように条件分岐を修正しました.

この結果, 当サイトに訪れるアクセス解析のブロックユーザーは以下のように表示されます.

具体的な数値については利用規約に触れる可能性があるので, モザイクを掛けてあります.

number-of-blocking-ga-and-tm

現時点では, Google Analyticsのみをブロックしているユーザーが非常に多く, 次にGoogle Tagmanagerのみをブロックしている人が多いです.

予想外だったのは, Google AnalyticsとGoogle Tagmanagerのどちらもブロックしている人が少ないということでした.

Measurement Protocolの使い方によっては, Google AnalyticsやTag Managerのブロックは意味がなくなる場合がありますね.

 Measurement Protocolによるアクセス解析のブロックをしばらく記録した結果, Google Analyticsに以下のような見慣れないエラーメッセージが表示されるようになりました.

error-of-event-tracking-cod

今回紹介したイベントトラッキングの送信だけではまずいようで, ページトラッキングの送信もしなければならないようです.

ページトラッキングは今回紹介した方法を修正すれば送信可能になります.

修正方法に関しては, 内容が長くなったので, ここでは割愛させていただきます.

機会があれば, 別の記事で紹介したいと思います.

スポンサーリンク

フォローする