gapiでエラー発生!「GAPI: Failed to authenticate user.」
Google Analytics API も OAuth2.0への対応が必須に…
調査の結果、gapi.class.php で利用されているclientloginタイプの認証方法がすでに終了していることが判明…
以前から言われていたOAuth2.0へ移行する時が来てしまったようです。うわぁああまたあの「アクセストークン」とかそういうのを扱わないといけないのか~!
参考:ClientLogin から OAuth 2.0 への移行
とりあえずWEBシステムをOAuth2.0認証できるようにする
gapi.class.php を使う使わないに関係なく、あなたのWebシステムとGoogleのAPI側との接続にはOAuth2.0が使われることになったので、認証情報を作成しておく必要があります。
これについては、こちらに詳しい解説があるので、参考にしてとりあえず作成までやっておきましょう。
ちょっと引っかかるところとしては、p12キーファイルのダウンロードは自動で取得できるわけではなく「新しいP12キーを生成」ボタンを押さないとダウンロードできない点と、生成されたメールアドレスをあなたのGoogle Analyticsの閲覧許可リストに加える点。
gapi.class.php をOAuth2.0対応に改造
OAuth2.0の認証を作成したところで、gapi.class.phpはOAuth2.0には対応していません。
なんとかならんか…と探しまわってみたところ、こちらで gapi.class.php を改造して「gapioauth.class.php」として置いてあるのを発見!ウヒョー♪
Facadeなクラスに変化
この新しいgapiクラスですが、実はこれ単体で動作するものではありません。
Googleが用意しているAPIアクセス用の純正のAPIクライアントクラスがあり、そのクラスを覆い隠して今までどおりのgapiインスタンスで扱うことができるような振る舞いになります。 そのため、google-api-php-client からダウンロードしておく必要があります。
gapioauth.class.phpにはバグがあるので、さらにちょっと改造
それに加えて、今回リニューアルされたgapiクラスですが、主に利用するrequestReportData()関数において、引数「$start_index」が無視されるというバグがあります。このバグを以下のようにして修正してください。
$parameters['start-index'] = $start_index; <--- この行を追加 $parameters['max-results'] = $max_results;
Google-api-php-client の設定ファイルもちょっと修正
Google純正のAPIクライアントの方ですが、gapiでうまく扱うには、取得したデータに対してgetterメソッドでアクセスできるように/google-api-php-client/src/config.php ファイルを以下のように修正します。
global $apiConfig; $apiConfig = array( // True if objects should be returned by the service classes. // False if associative arrays should be returned (default behavior). 'use_objects' => true, <--- false を true に変更
OAuth2.0方式でgapiクラスを利用するサンプル
ここまで準備できたら、あとちょっとです。実際にデータを取得してみましょう。
これまでのアクセス方法と異なる所は以下の2点。
- gapiインスタンスを取得するまでのプロセス
- requestReportData()に渡す引数の追加
サンプルコード
require_once '/path/to/google-api-php-client/src/config.php'; require_once '/path/to/google-api-php-client/src/Google_Client.php'; require_once '/path/to/gapi/gapioauth.class.php'; require_once '/path/to/google-api-php-client/src/contrib/Google_AnalyticsService.php'; //プロファイルID define('MY_PROF', 'UA-XXXXXX-X'); //クライアントID define('GAPI_CLIENT_ID', '......apps.googleusercontent.com'); //メールアドレス define('GAPI_SERVICE_ACCOUNT_NAME', '......@developer.gserviceaccount.com'); //秘密鍵 define('GAPI_KEY_FILE', '/path/to/hoge.p12'); $client = new Google_Client(); $client->setApplicationName("myapp"); $client->setClientId(GAPI_CLIENT_ID); $client->setAssertionCredentials(new Google_AssertionCredentials( GAPI_SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/analytics'), file_get_contents(GAPI_KEY_FILE) )); //analyticsサービスインスタンス生成 $analytics = new Google_AnalyticsService($client); $ga = new gapi($analytics); $filter = 'pagePath =~ ^/hoge/\d+/'; $ga->requestReportData(MY_PROF, array('pagePath'),array('uniquePageViews'),'-uniquePageViews',$filter,null,$startDate,$endDate,1,100);
まず、これまでの$gaインスタンスを取得するまでにOAuth2.0用の各種処理を行う所が異なっています。
引っかかりやすいところとしては、$ga->requestReportData()のところの6番目の引数 $segment が追加になっているので、これまでの引数のままだと足りないため、6番目にnullを指定するところです。
これで、新しくOAuth2.0方式でAnalyticsのデータが参照できるようになります。
参考になりましたでしょうか?
2015-06-04