おぼえがき

おぼえがき

googleAnalyticsリアルタイムAPIとiftttを使ってトレンドのtweetをやってみる

2015-07-29 | googleanalytics






■要件:
やりたいことは、リアルタイムに、今はやっている記事をtwitterで拡散してあげたい。
googleAnalyticsのカスタムアラートは1日後?で遅いんだよね。
Core Reporting APIも即時じゃない。
1から作るの面倒だから、なるべく楽したい

■処理の流れ:
Analytics Real Time Reporting APIの利用許可申請を行って、
このAPIを利用して、定期的に現在人気のある記事をリアルタイムで取得。
取得した内容をgmailに送ると、iftttが食べにきて、勝手につぶやいてくれる


■必要な技術:
googleAnalyticsのリアルタイムAPI
 APIの利用申請は事前に済ませる必要があるので、ここを参照
ifttt(gmailに送って、それをiftttが捕まえてtweetする)
※oauth認証作るのが面倒くさいから、iftttにお願いする

■ifttt(これ、イフトって呼ぶの?アイフティティティって言ってた)の設定


こんな感じで、「buzz_entry:」ってサブジェクトのメールが届いたら、自動で
本文の内容をつぶやくようにする。

■googleアナリティクスAnalytics Real Time Reporting APIの利用申請

ここに行って、




申請を書く。







申請でよくわからなかったのは、
Developer Console Project Number
ってところ、これは、https://console.developers.google.comに行って、下記の番号を登録すりゃいい



許可してもらえる(30分くらいで許可下りた)

許可が下りたかどうかわからないから、こちらで定期的に試してみる
下記の通りデータが取れたか確認。



さて、コーディング
ちなみに、使える、ディメンションと、メトリック(指標)は下記の通り
https://developers.google.com/analytics/devguides/reporting/realtime/dimsmets/

ソースコードはこんな感じ

require_once 'google-api-php-client/src/Google/autoload.php';

define('CLIENT_ID', 'xxxxx');
define('SERVICE_ACCOUNT_NAME', 'xxxx');
define('KEY_FILE', 'xxxx');
define('PROFILE_ID', 'ga:xxxxx');

class gaBaseController
{
public $profile_id = null;

function __construct($profile_id)
{ /* {{{ */
$this->profile_id = $profile_id;
} /* }}} */
}

class ga_test extends gaBaseController
{

function __construct($argv = null)
{ /* {{{ */
parent::__construct(PROFILE_ID);
} /* }}} */

public function main()
{ /* {{{*/
$client = new Google_Client();
$client->setApplicationName("analytics api");
$client->setClientId(CLIENT_ID);
$client->setAssertionCredentials(new Google_Auth_AssertionCredentials(
SERVICE_ACCOUNT_NAME,
array('https://www.googleapis.com/auth/analytics'),
file_get_contents(KEY_FILE)
));

$service = new Google_Service_Analytics($client);

// リアルタイムデータを取得する
$results = $service->data_realtime->get(
PROFILE_ID,
'rt:activeUsers', // リアルタイムアクティブユーザー数を取得
//ソーシャルではやっているとか、そういう制限つけたかったら、オプションもっとつけないとね(rt:medium )とか
array('dimensions' => 'rt:PageTitle')
);


print_r($results->getRows());

この辺で、一定数のアクティブユーザーの敷居が超えていたら、メールを送る処理
メールのタイトルは、iftttのレシピと同じ、「buzz_entry:」
メールの本文は、○○って、記事が今見られてますよーー!!って感じかな

}
}

$obj = new ga_test();
$obj->main();


※このソースだと、同じ記事を何度もtweetすることになっちゃうから、その辺の
キャッシュは考えないとだめだね。

一応、このロジックでいける。


ちなみに、、、、

getRowsでデータ取得しているけど、使えるメソッドは、下記の通り、あんまりヘルプないなぁ
[0] => setColumnHeaders
[1] => getColumnHeaders
[2] => setId
[3] => getId
[4] => setKind
[5] => getKind
[6] => setProfileInfo
[7] => getProfileInfo
[8] => setQuery
[9] => getQuery
[10] => setRows
[11] => getRows
[12] => setSelfLink
[13] => getSelfLink
[14] => setTotalResults
[15] => getTotalResults
[16] => setTotalsForAllResults
[17] => getTotalsForAllResults
[18] => rewind
[19] => current
[20] => key
[21] => next
[22] => valid
[23] => count
[24] => offsetExists
[25] => offsetGet
[26] => offsetSet
[27] => offsetUnset
[28] => __construct
[29] => __get
[30] => toSimpleObject
[31] => assertIsArray
[32] => __isset
[33] => __unset

■注意事項
Analytics Real Time Reporting APIは、利用制限が存在している。
ここに
書いてあって、あふれるようなら、キャッシュしろって書いてある


これで、開発工数を少なくして、リアルタイムではやっている情報を拡散することできるね。
アナリティクスのリアルタイムAPIこういうところで使えるかもね

twitterアカウントです

■そのほかのアナリティクスねた
たぶんこれが一番簡単!googleAnalyticsでスクロール率を計測する方法
ビーコン(BLE)とgoogleAnalyticsで交通量の測定をやってみる
google analyticsでtagmanagerのルックアップテーブルを使ってみる
アナリティクスでカスタムディメンションとデータインポートとタグマネージャとAPIでデータ分析をしてみる
php5.2でもgoogleanalyticsAPIを利用したい
Google Analytics Individual Qualification(GAIQ)を取ってみた

ビーコン(BLE)とgoogleAnalyticsで交通量の測定をやってみる

2015-04-17 | googleanalytics


googleアナリティクスでPVの計測だけではなく、
いろんなところに応用が効く。

Google アナリティクスの Measurement Protocol を使用すると、いろんなことできちゃう。

BLEのbeaconとスマホアプリを利用して、交通量を測定してみた。

イメージこんな感じ





おーー。beaconの周りに人が通っているのが可視化できてる!
満足!

ページ名をBeaconの識別子としているので、どのビーコンの近辺にどのくらいの人が通っているのかもわかる。

仕組みは、ものすごく簡単で、beaconが検知したものをサーバーに
データを送って、それをサーバーが受信したら、analyticsの
measurement protocolを叩けばいいだけ。

http://www.google-analytics.com/collect?v=1
&tid=UA-XXXX-XX
&cid=下記参照
&uid=ユーザー識別キー
&t=pageview
&dp=${beaconの名前:urlエンコード}

cidに関しては、なんか難しいので、生成は別メソッドに切り出してる。
正直よく分からん...
function _get_cid()
{/*{{{*/
 return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
 mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
 mt_rand( 0, 0xffff ),
 mt_rand( 0, 0x0fff ) | 0x4000,
 mt_rand( 0, 0x3fff ) | 0x8000,
 mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
);
}/*}}}*/

上記で生成されたURLをgetで投げちゃえばいいだけ。
ブラウザで、上記URLを入れるだけでも、計測は可能

詳細は、
https://developers.google.com/analytics/devguides/collection/protocol/v1/?hl=ja


こんなことやっている中、海外でハッカソンがあったみたいで、
Periscopix wins 2015 Google Analytics Hackathon
なるものがあったみたい。

いろいろ、アイデアがあるみたいだけど、まぁ、measurement protocolが
わかっていれば、結構簡単にできちゃう。アイデア次第やね。

他にも、RaspberryPiにセンサーつけて、部屋の入退室を可視化できる例

とかもあるみたい。

実際の現場では、
携帯(ガラケー/フィーチャーフォン)のPVをanalyticsに突っ込んでみたり
APIのリクエスト数をカウントしてみたり
ほかに、どんな使い方あるかなぁ

さて、交通量は測定してみたが、これ何に使うんだろう。自己満足だな。

twitterアカウントです


analyticsネタ
たぶんこれが一番簡単!googleAnalyticsでスクロール率を計測する方法
googleAnalyticsリアルタイムAPIとiftttを使ってトレンドのtweetをやってみる
google analyticsでtagmanagerのルックアップテーブルを使ってみる
アナリティクスでカスタムディメンションとデータインポートとタグマネージャとAPIでデータ分析をしてみる
php5.2でもgoogleanalyticsAPIを利用したい
Google Analytics Individual Qualification(GAIQ)を取ってみた







google analyticsでtagmanagerのルックアップテーブルを使ってみる

2014-05-21 | googleanalytics


アナリティクスのイベントトラッキングと、タグマネージャーのルックアップテーブルを利用して、レポートをみやすくする

他のアナリティクス関連
アナリティクスでカスタムディメンションとデータインポートとタグマネージャとAPIでデータ分析をしてみる
php5.2でもgoogleanalyticsAPIを利用したい

■現状
イベントトラッキングはアナリティクスを使っていて、アナリティクスのレポート上にはクリックされたid属性がレポートに出るようになっている

■課題
レポート上視認性が悪い
Idだと、どこのことを指してるのか分からなくなる

■解決方法
タグマネージャーのルックアップテーブルを使って、和名に変換してレポートに表示するようにする。

■クリックイベントの取得方法

javascriptの中に、onclickが発生した時にjavascript上に下記を入れる

dataLayer.push({
'ClickCategory': クリック領域id名,
'ClickAction': 'click',
'ClickLabel' : 'a hrefの中身',
'event':'CCevent'
});

タグマネージャーで使用できるようになっている、自動イベントトラッキングは仕込んでいない。

古いブラウザとかjsとの相性の兼ね合いで、動かなかった。

クリックが取れないならまだいいけど、提供してるサービスの方が動かなくなったから、これは使わない。
便利そうだからって、簡単に採用する前に、しっかりテストした方がいい。
特にie。
今後もテストしなくちゃいけないコストを考えると面倒になって来たので不採用



■タグマネージャーでマクロを作る

ClickCategory
ClickAction
ClickLabel
それぞれ、データレイヤー変数を定義

あとは、こんな感じで設定


-------------------------




■タグマネージャーでタグを作る

タグ名:適当
タグの種類:ユニバーサルアナリティクス
トラッキングID:アナリティクスのID
トラッキングタイプ:
 イベントをプルダウンから選択
カテゴリ:{{ClickCategory}}
操作:{{ClickAction}}
ラベル:{{ClickLabel}}
 配信のルール
  {{event}}含むCCevent

ってtagmanagerのタグで定義してあげれば、イベントトラッキングはできるんだけど、タグマネージャーのルックアップテーブルを使って、
ClickCategoryを和名に変換するようにする


■ルックアップテーブルの定義

マクロで下記のように新しいマクロを定義する
マクロ名を:『ClickCategoryの和名』
にする



こんなかんじで定義してあげる
で、タグの定義を下記のように変更


■タグの再定義

さっきのタグを修正

タグ名:適当
 タグの種類:ユニバーサルアナリティクス
 トラッキングID:
 トラッキングタイプ:
  イベントをプルダウンから選択
  カテゴリ:{{ClickCategoryの和名}}
  操作:{{ClickAction}}
  ラベル:{{ClickLabel}}
 配信のルール
  {{event}}含むCCevent

これで、googleanalytics上の、行動->イベント->上位のイベント
のところで和名が出るようになってわかりやすくなった

ここまで、かいといてなんだが、
ClickCategoryの和名は、今はラベルに移動してある。

twitterアカウントです

アナリティクス関連
googleAnalyticsリアルタイムAPIとiftttを使ってトレンドのtweetをやってみる
ビーコン(BLE)とgoogleAnalyticsで交通量の測定をやってみる
google analyticsでtagmanagerのルックアップテーブルを使ってみる
アナリティクスでカスタムディメンションとデータインポートとタグマネージャとAPIでデータ分析をしてみる
php5.2でもgoogleanalyticsAPIを利用したい
Google Analytics Individual Qualification(GAIQ)を取ってみた


アナリティクスでカスタムディメンションとデータインポートとタグマネージャとAPIでデータ分析をしてみる

2014-05-14 | googleanalytics


googleanalyticsのデータインポートについてまとめてみる。

googleアナリティクスと、カスタムディメンションと、データインポートを使って、

カスタムディメンションに定義された情報の視認性を高めるために、和名にマッピングをする

これが終わったら、アナリティクスAPIを利用してデータを引っ張ってくるところまでやる

■概要


http://xxxx.com/fdsapfokasdf
このページは、実はテニスというカテゴリーのページで、カスタムディメンションには、category:1234と定義している

http://xxxx.com/dfkasodfapsf 和名は:野球
このページは、実は野球というカテゴリーのページで、カスタムディメンションには、category:1235と定義している

下記のような感じでカスタムディメンションを定義している状態
</head>
<body>
<script>dataLayer=[{"category":"12345","yyyy":"xxxx"}];</script>

<noscript><iframe src="//www.googleta
これだと、アナリティクス上だと視認性が悪いというか、なんのカテゴリーかわからないから12345は野球みたいな感じで
マッピングテーブルを用意するといい。


<font size="5">■カスタムディメンションの定義

カスタムディメンションに
categoryとcateogry_jaの2つのディメンションを用意する。



上記のような感じで、カスタムディメンションとして、categoryとcategory_jaの2つを用意する。ここで大事なのが保存したあとのディメンションのID




上記の「11」というのが大事。後ほど、タグマネージャーで利用する定義となる。



■タグマネージャーにてカスタムディメンションの定義の追加


categoryというカスタムディメンションをタグマネージャーに認識させる必要があるため、



tagmanagerのマクロで、カスタムディメンションを定義する



タグマネージャーで、マクロの定義を行ったら、次は、タグの定義を行う


これでカスタムディメンションの定義は行えた。


■カスタムディメンションをページのソースに埋め込む

ページが表示される度に下記のように、カスタムディメンションのcategoryにページ応じたカテゴリーIDをセットする

</head>
<body>
<script>dataLayer=[{"category":"12345","yyyy":"xxxx"}];</script>

<noscript><iframe src="//www.googleta

こんな感じで、タグマネージャーで定義したカスタムディメンションに対する値がセットされるようになったら、

アナリティクス上で、

ユーザー > カスタム > ユーザー定義 に行く

セカンダリディメンションのプロダウンを選択して、先ほど定義した、cateogryというセカンダリディメンションを
選択して、データが正しく表示されていればOK

※おそらく反映には、最大30分位かかる。(気長に待つ)
※サンプリング量が多いなら、日付を今日に絞り込んでみる
※それでもダメなら、セグメントで時間を指定してみる

■データインポート処理

categoryをcategory_jaにマッピングする
アナリティクスの設定のデータインポート->「新しいデータのセット」に遷移して下記の流れで情報を登録していく

一般的なディメンションの拡張を選択





名前は、わかりやすい名前
有効なビューはマッピング対象のビューを選択
次のステップを押下




で、画面下部にある、保存を選択する。

ここで何をしてるかって言うと、
categoryというカスタムディメンションをcategory_jaというカスタムディメンションにマッピングするという定義を行ったわけ
重要なのは、ga:dimension11とgadimension4。
じゃあ、categoryとcategory_jaのマッピングテーブルをアップロードしてみる

下記のような感じ
-------------------------------------------
ga:dimension11,ga:dimension4
1234,野球
1235,テニス
1236,ダイビング
1237,マラソン
-------------------------------------------

ようは、csv形式で対応表をアップロードすればいい。
必ず、UTF-8形式で保存すること。

これで、カスタムディメンションに対する和名がセットされるようになった。
うまく行けば、

ユーザー > カスタム > ユーザー定義 に行く

セカンダリディメンションのプロダウンを選択して、先ほど定義した、cateogry_jaというセカンダリディメンションを
選択すると和名にマッピングされたデータが表示されるようになるはず。

これだけだと、なんの意味もなさないので、カスタムレポートをちゃんと作ってあげることが大事。

次は、このカスタムディメンションを利用したデータをAPI経由で取得してみる

今回は、カスタムディメンションをカスタムディメンションにマッピングしたけど、
他にも、URLの体系をカスタムディメンションにマッピングすることもできるし
使い道は様々だったりする

twitterアカウントです

たぶんこれが一番簡単!googleAnalyticsでスクロール率を計測する方法

googleAnalyticsリアルタイムAPIとiftttを使ってトレンドのtweetをやってみる

ビーコン(BLE)とgoogleAnalyticsで交通量の測定をやってみる

google analyticsでtagmanagerのルックアップテーブルを使ってみる
アナリティクスでカスタムディメンションとデータインポートとタグマネージャとAPIでデータ分析をしてみる
php5.2でもgoogleanalyticsAPIを利用したい

Google Analytics Individual Qualification(GAIQ)を取ってみた


php5.2でもgoogleanalyticsAPIを利用したい

2014-05-14 | googleanalytics


googleanalyticsAPI(Management API(v3))を利用して、データを取得するんだけど、
PHP 5.3.0 or higher is required to use service accounts.
このエラーが出で、いろいろ面倒だったのでその対応方法も含めて記載
っていうか、phpのバージョンあげないとまずいね

■analyticsAPIを利用できるようにする
https://console.developers.google.com

アカウント:XXXXXXXXXXXX

■1日のリクエスト上限
50,000 requests/day


■analyticsAPIの利用許可設定


■認証設定




■上記画面のクライアントIDを作成をクリックすると・・・



こんな感じで、ファイルがダウンロードされる。
ファイルの中身は秘密鍵のファイル
添付の通り 16.....c42という秘密鍵のバイナリ?ファイル
秘密鍵のパスワードは、上記にあるとおり、XXXXXXXXXXX




「OK」を押下すると




クライアント / メール アドレス / 公開キー フィンガープリントこの辺めもっておく


■googleanalytics側の設定




先ほど発行されたメールアドレスを追加
これでとりあえず、設定は完了


■対象viewIDの取得


APIリクエスト対象のviewIDを取得する






■APIには利用制限が存在する

https://console.developers.google.com
ここで確認できる




■APIを叩くソースをこれより記述していく


apiを取得するためのライブラリを取得
git clone https://github.com/google/google-api-php-client.git


このディレクトリ配下のrequire_onceのパスをすべて書き換える


define("HOGE", 'google-api-php-client/src/');

require_once HOGE .'Google/Auth/AssertionCredentials.php';
require_once HOGE .'Google/Cache/File.php';
require_once HOGE .'Google/Cache/Memcache.php';
require_once HOGE .'Google/Config.php';
require_once HOGE .'Google/Collection.php';
require_once HOGE .'Google/Exception.php';
require_once HOGE .'Google/IO/Curl.php';
require_once HOGE .'Google/IO/Stream.php';
require_once HOGE .'Google/Model.php';
require_once HOGE .'Google/Service.php';
require_once HOGE .'Google/Service/Resource.php';



./Auth/Abstract.php
./Auth/AssertionCredentials.php
./Auth/Exception.php
./Auth/LoginTicket.php
./Auth/OAuth2.php
./Auth/Simple.php
./Cache/Apc.php
./Cache/Exception.php
./Cache/File.php
./Cache/Memcache.php
./Cache/Null.php
./Client.php
./Collection.php
./Http/Batch.php
./Http/CacheParser.php
./Http/MediaFileUpload.php
./Http/REST.php
./Http/Request.php
./IO/Abstract.php
./IO/Curl.php
./IO/Exception.php
./IO/Stream.php
./Service/Exception.php
./Service/Resource.php
./Signer/P12.php
./Verifier/Pem.php


上記ファイルのrequire_onceをすべて書き換えた

■php5.2対応


このままだと、Oauth2系の認証でこける
php5.3用に作られている部分もあるので、一部ライブラリの書き換えが必要
./Signer/P12.php


これがオリジナルのソースコードのメソッド
-----------------------------------------

public function sign($data)
{
if (version_compare(PHP_VERSION, '5.3.0') < 0) {
throw new Google_Auth_Exception(
"PHP 5.3.0 or higher is required to use service accounts."
);
}

$hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
if (!openssl_sign($data, $signature, $this->privateKey, $hash)) {
throw new Google_Auth_Exception("Unable to sign data");
}

これの、openssl_signのところがphp5.2だとちゃんとうごかん


これを下記のように修正する
-----------------------------------------

public function sign($data)
{
/*
if (version_compare(PHP_VERSION, '5.3.0') < 0) {
throw new Google_Auth_Exception(
"PHP 5.3.0 or higher is required to use service accounts."
);
}

$hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256";
if (!openssl_sign($data, $signature, $this->privateKey, $hash)) {
throw new Google_Auth_Exception("Unable to sign data");
}
*/
if (!$this->my_openssl_sign($data, $signature, $this->privateKey, "sha256")) {
throw new Google_AuthException("Unable to sign data");
}
return $signature;
}

private function my_openssl_sign($data, &$signature, $priv_key_id, $signature_alg = 'sha256WithRSAEncryption') {
$pinfo = openssl_pkey_get_details($priv_key_id);
$hash = hash('sha256', $data);
$t = '3031300d060960864801650304020105000420'; # sha256
$t .= $hash;
$pslen = $pinfo['bits']/8 - (strlen($t)/2 + 3);

$eb = '0001' . str_repeat('FF', $pslen) . '00' . $t;
$eb = pack('H*', $eb);

return openssl_private_encrypt($eb, $signature, $priv_key_id, OPENSSL_NO_PADDING);
}

-----------------------------------------
ここまで



■データ取得を試してみる

#!/usr/bin/php

require_once('google-api-php-client/src/Google/Client.php');
require_once('google-api-php-client/src/Google/Service/Analytics.php');

//クライアントID
define('CLIENT_ID', 'XXXXXXXXXXXXXXX');
//メールアドレス
define('SERVICE_ACCOUNT_NAME', 'XXXXXXXXXXXXXXX');
//秘密鍵(アップロードした場所)
define('KEY_FILE', 'gaapi.ppk');

//ビューIDの定義
define('PROFILE_ID', 'XXXXXXXXXXXXXXX');

class gaBaseController
{
//--- analyticsのビューIDのセット
public $profile_id = null;

function __construct($profile_id)
{ /* {{{ */
$this->profile_id = $profile_id;
} /* }}} */
}

class ga_aaaaaa extends gaBaseController
{

function __construct($argv = null)
{ /* {{{ */
parent::__construct(PROFILE_ID);
} /* }}} */

public function main()
{ /* {{{*/
$client = new Google_Client();
$client->setApplicationName("analytics api");
$client->setClientId(CLIENT_ID);
$client->setAssertionCredentials(new Google_Auth_AssertionCredentials(
SERVICE_ACCOUNT_NAME,
array('https://www.googleapis.com/auth/analytics'),
file_get_contents(KEY_FILE)
));

$service = new Google_Service_Analytics($client);
// ビュー ID
$ids = 'ga:' . $this->profile_id;
// 期間(スタート)
$start_date = '2014-05-09';
// 期間(エンド)
//$end_date = 'today';
$end_date = '2014-05-11';
// メトリクス
$metrics = 'ga:sessions,ga:pageviews';
// ディメンション
$dimensions = 'ga:dimension11';
// ソート
$sort = 'ga:pageviews';

// 最大取得数
$max_results = 10;
$optParams = array('dimensions' => $dimensions, 'sort' => $sort, 'max-results' => $max_results);
$data = $service->data_ga->get($ids, $start_date, $end_date, $metrics, $optParams);
print_r($data);
}
}

$obj = new ga_aaaaaa ();
$obj->main();



■カスタムディメンションの指定方法




$dimensions = 'ga:dimension11';APIでカスタムディメンションをリクエストするときにはまった

twitterアカウントです

たぶんこれが一番簡単!googleAnalyticsでスクロール率を計測する方法
googleAnalyticsリアルタイムAPIとiftttを使ってトレンドのtweetをやってみる
ビーコン(BLE)とgoogleAnalyticsで交通量の測定をやってみる
google analyticsでtagmanagerのルックアップテーブルを使ってみる
アナリティクスでカスタムディメンションとデータインポートとタグマネージャとAPIでデータ分析をしてみる
php5.2でもgoogleanalyticsAPIを利用したい
Google Analytics Individual Qualification(GAIQ)を取ってみた