先日、業務効率化のためにGoogle APIでデータを取得してcsv保存し、cronで毎日バッチ処理をする作業を行った。
GoogleのAPIまわりが少し分かりずらかったのと、phpを使ったcsv保存にもブラウザでアクセスした場合とコマンドラインからアクセスした場合とで違ったのでAPI連携からcsvで保存、cronで自動処理までの一連の流れをメモ。
やりたいことは以下の通り。
(1) 日別URL別のページビュー数、ページ別訪問数、閲覧開始数を取得したい
(2) phpでコマンドラインでファイルの実行をした際にcsvファイルを出力したい
(3) csvファイル出力の際、日付を指定したい
(4) 毎日6:30amに、バッチ処理を走らせて所定のフォルダにcsvファイルを格納したい 参考になるGoogleの公式サイト
※日本語マニュアルは最新でない場合があるので英語版を確認してください。(自分も日本語版で見ていて内容が違って少しはまりましたのでご注意ください。) PHPクイックスタート ウェブアプリ PHPクイックスタート サービスアカウント アカウント概要のlist API リファレンス ディメンションと指標のリファレンス
目次
Google Developers Consoleの設定
まずはAPIを使えるようにするため、Googleが提供しているGoogle Developers Consoleを使って設定をしていきます。
今回はGoogle Analyticsのデータ連携です。Analyticsで使っているGoogleアカウントでログインしてください。
https://console.developers.google.com
まず最初に、プロジェクトを作成してください。プロジェクト名は何でも構いません。
次にPermissionsにいき、service accountを作成します。
Service accountsでCreates service accountを押します。
Name欄は何でもいいので、とりあえずgoogle-api-testとしました。 Private KeyはP12ファイルとしCreateします。するとP.12ファイルが作成されるので保存しておきましょう。
次に、API Managerへ行きAnalytics APIを許可します。
続いてCredentials画面でOAuth client IDを作成します。
OAuth consent screenを事前に登録してください。
今回はCentosにphpファイルを配置し、phpコマンドで実行するためApplication typeはWeb applicationとします。
制限事項は一応、MAMP用とVagrant用を両方登録しておきました。こちらは適宜変更してください。
http://localhost MAMP用 http://192.168.33.10 Vagrant用
http://localhost/oauth2callback MAMP用
※http://192.168.33.10/oauth2callbackはなぜか登録できなかったのでMAMP用だけ登録しました。
最後に、以下の2つをメモしておきます
- Client ID:API Manager –> Credentials –> から確認できます。(形式:***********-********************************.apps.googleusercontent.com)
- Email address:Permissions –> Service accountsから確認できます。(形式:service-account@grooving-earth-****.iam.gserviceaccount.com)
Google Developers Consoleの設定は以上です。
Google Analyticsにユーザー登録
次に、先ほど生成したメールアドレスのユーザーにGoogle Analyticsにアクセスできるように権限を与えます。
Google Analyticsを開いてアナリティクス設定に移動します。
先ほどメモしておいたメールアドレスを登録します。
アカウントのアクセス許可は表示と分析とします。
次にビューのビュー画面よりビューIDを確認しておきます。
以上で、Google Analyticsの設定は終了です。
phpでcsv出力
準備が整ったところでphpを書いていきましょう。
実装にはGoogleが提供しているgoogle-api-php-clientを使います。
ファイルはgitに公開されているので一式をダウンロードして所定のフォルダに入れましょう。
https://github.com/google/google-api-php-client
※2016/3/12現在、masterブランチとv1-masterブランチがありますが、v1-masterブランチをダウンロードしてください。
同じ階層に、Service accountsで保存したP12ファイルを保存します。
階層は以下の通りになります。
google-api-test |google-api-php-client <– gitからダウンロードしたフォルダ |********.p12 <– P12ファイル |googleanalytics.php <– ここにcsvを出力するプログラムを書き込みます。
では早速プログラムを書いていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
<?php require_once 'google-api-php-client/src/Google/autoload.php'; // サービスアカウント名(Client ID) $service_account_name = '***********-********************************.apps.googleusercontent.com'; // P12キーファイルのパス $key_file_location = '********.p12'; // アナリティクスのビューID 例)'ga:1234567' $analytics_view_id = 'アナリティクスのビューID'; session_start(); if (!strlen($service_account_name) || !strlen($key_file_location)) { echo missingServiceAccountDetailsWarning(); } $client = new Google_Client(); if (isset($_SESSION['service_token'])) { $client->setAccessToken($_SESSION['service_token']); } $key = file_get_contents($key_file_location); $cred = new Google_Auth_AssertionCredentials( $service_account_name, array('https://www.googleapis.com/auth/analytics'), $key ); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $_SESSION['service_token'] = $client->getAccessToken(); // アナリティクスクライアントを生成 $analytics = new Google_Service_Analytics($client); // 引数から対対象日付を取得 $targetDate = $argv[1]; $startDate = @date("Y-m-d", strtotime($targetDate)); $endDate = @date("Y-m-d", strtotime($targetDate)); $results = $analytics->data_ga->get( 'ga:' . $analytics_view_id, $startDate, $endDate, 'ga:pageviews,ga:uniquePageviews,ga:entrances', [ 'sort' => '-ga:pageviews', 'max-results' => 10000, 'dimensions' => 'ga:pagePath, ga:date' ] ); $json = json_encode($results, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); $obj = json_decode($json, true); // $linesにオブジェクトをセット $lines = []; // 前日の日付を取得 $yesterday = @date("Y-m-d", strtotime($targetDate)); // CSVファイル名の設定 $csvdata = "$yesterday.csv"; $csv = ""; // タイトル設定 $data_title = array('Date', 'URL', 'Pageview', 'Unique Pageviews','Session'); foreach ($data_title as $i => $value) { $value = mb_convert_encoding($value, 'sjis-win', 'utf-8'); $csv .= ($i ? ',' : ''). $value; } $csv .= "\n"; // 改行コード // コンテンツ設定 foreach ($obj['rows'] as $value) { $csv .= $value[1]. ",". $value[0]. ",". $value[2]. ",". $value[3]. ",". $value[4]. "\n"; } // CSVファイルを追記モードで開く $fp = fopen($csvdata, 'ab'); // CSVファイルを排他ロックする flock($fp, LOCK_EX); // CSVデータ$csvの内容をファイルに書き込む fwrite($fp, $csv); // CSVファイルを閉じる fclose($fp); |
3行目で、autoload.phpを読み込みます。
6行目で、サービスアカウント名を入力します。ここにはClient IDが入ります。
8行目で、P.12ファイルを読み込みます。
10行目で、アナリティクスのビューIDを入力します。
51行目で、取得するディメンションと指標を指定しています。
59行目で、jsonに変換しています。
60行目で、jsonをデコードしています。
73 – 77行目で、タイトルを指定しています。
81 – 83行目で、$objの連想配列から値を取得しています。
85 – 95行目で、csvに保存しています。
86行目で、ファイル名を指定しています。
取得するディメンションは自由に変えることができます。
取得できるディメンションと指標は公式サイトを確認してください。
ディメンションと指標のリファレンス
※Google APIで取得できるデータは、1回のリクエストあたり1万行です。 上記のphpフィアルをコマンドラインから実行するとcsvファイルが生成されます。
1 |
$ php googleanalytics.php |
-> 2016-03-12.csv csv形式なのでカンマ(,)区切りです。 なお、以下のソースだとブラウザからアクセスした場合にcsvファイルが生成されます。今回は使いませんが参考までに。 ※違うのは最後の3行です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<?php require_once 'google-api-php-client/src/Google/autoload.php'; // サービスアカウント名(Client ID) $service_account_name = '***********-********************************.apps.googleusercontent.com'; // P12キーファイルのパス $key_file_location = '********.p12'; // アナリティクスのビューID 例)'ga:1234567' $analytics_view_id = 'アナリティクスのビューID'; session_start(); if (!strlen($service_account_name) || !strlen($key_file_location)) { echo missingServiceAccountDetailsWarning(); } $client = new Google_Client(); if (isset($_SESSION['service_token'])) { $client->setAccessToken($_SESSION['service_token']); } $key = file_get_contents($key_file_location); $cred = new Google_Auth_AssertionCredentials( $service_account_name, array('https://www.googleapis.com/auth/analytics'), $key ); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $_SESSION['service_token'] = $client->getAccessToken(); // アナリティクスクライアントを生成 $analytics = new Google_Service_Analytics($client); // 引数から対対象日付を取得 $targetDate = $argv[1]; $startDate = @date("Y-m-d", strtotime($targetDate)); $endDate = @date("Y-m-d", strtotime($targetDate)); $results = $analytics->data_ga->get( 'ga:' . $analytics_view_id, $startDate, $endDate, 'ga:pageviews,ga:uniquePageviews,ga:entrances', [ 'sort' => '-ga:pageviews', 'max-results' => 50000, 'dimensions' => 'ga:pagePath, ga:date' ] ); $json = json_encode($results, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); $obj = json_decode($json, true); // var_dump($obj); // $linesにオブジェクトをセット $lines = []; // 前日の日付を取得 $yesterday = @date("Y-m-d", strtotime($targetDate)); // CSVファイル名の設定 $csvdata = "$yesterday.csv"; $csv = ""; // タイトル設定 $data_title = array('Date', 'URL', 'Pageview', 'Unique Pageviews','Session'); foreach ($data_title as $i => $value) { $value = mb_convert_encoding($value, 'sjis-win', 'utf-8'); $csv .= ($i ? ',' : ''). $value; } $csv .= "\n"; // 改行コード // コンテンツ設定 foreach ($obj['rows'] as $value) { $csv .= $value[1]. ",". $value[0]. ",". $value[2]. ",". $value[3]. ",". $value[4]. "\n"; } header("Content-Type: application/octet-stream; charset=sjis-win"); header("Content-Disposition: attachment; filename=$yesterday.csv"); echo $csv; |
crontabの設定
どこでもいいのでフォルダを作成して配置します。
今回はroot直下にgoogle-api-testフォルダを配置しました。
google-api-testフォルダの中身はこんな感じです。
google-api-test |google-api-php-client |********.p12 |googleanalytics.php |google-analytics-api-to-kintone.sh <–phpファイルを実行してフォルダを移動するコマンドです。 |Analytics-csv <–バッチで作成したcsvファイルはここに格納します。
google-analytics-test.sh の中身
1 2 3 4 5 6 |
#!/bin/sh php /root/google-api-test/googleanalytics.php `date --date="1 days ago" +"%Y-%m-%d"` mv /root/google-api-test/*.csv /root/google-api-test/Analytics-csv exit 0 |
3行目で、phpファイルを実行しています。
4行目で、/root/google-api-test/配下にある拡張子がcsvのファイルを全てAnalytics-csvに移動します。
crontab の中身
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO="" HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed #1 3 * * * root run-parts /etc/cron.daily 30 06 * * * root /root/google-api-test/google-analytics-api-test.sh |
以上で全て完成です。
今回は業務効率化として最終的にcsvまで保存してバッチで実行させる処理としましたが、GoogleのAPIはリアルに表示できたりAnalyticsで定期的に作業している工程を自動化したりと、いろいろと応用が利きます。
ぜひ試してみてください。
もし内容に誤りがありましたらコメント欄でお知らせください。
LEAVE A REPLY