gapiでエラー発生!「GAPI: Failed to authenticate user.」

1181

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 からダウンロードしておく必要があります。

1189

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点。

  1. gapiインスタンスを取得するまでのプロセス
  2. 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