Google AnalyticsのデータをNet::Google::Analyticsで取得する。認証方法はOAuth 2.0を使う。

  • perlGoogle Analyticsのデータを取得するために、Net::Google::Analytics モジュールを利用する。
  • 認証はOAuthを選択し、 Net::Google::Analytics::OAuth2 モジュールを利用する。
  • モジュールのインストールはcpanm で。
まずは、Google APIs Console にログインして、「Services」の「Analytics API」をONにする。

ss1

 そして、「API Access」の「Create another client ID」からID作成する。 Application type は、「Web application」、hostname は、「localhost」とした。ss3
次にNet::Google::Analyticsの使い方を参考にrefresh_tokenの取得」部分のコードを実行したが。。
use strict;
use warnings;
use Net::Google::Analytics::OAuth2;

my $client_id = "***";
my $client_secret = "***";

my $oauth = Net::Google::Analytics::OAuth2->new(
    client_id => $client_id,
    client_secret => $client_secret,
);
$oauth->interactive;

$client_id には Google APIs Console に表示される「Client ID」、$client_secret には「Client secret」を入力。

実行後に表示されたURLにブラウザでアクセスすると以下のエラーが表示された。
ss4
エラー redirect_uri_mismatch
The redirect URI in the request: urn:ietf:wg:oauth:2.0:oob did not match a registered redirect URI
いろいろ調べていると、このサイトの情報が参考になりました。
スクリプトで生成されたURLは何が違うのか確認してみたら、 redirect_uri だった。
redirect_uri が指定されていないとモジュールでデフォルト値を使用したため、Google APIs Console で指定した内容と異なっていたためと思われる。
なので、スクリプトの一部を変更して実行すると。。
use strict;
use warnings;
use Net::Google::Analytics::OAuth2;

my $client_id = "***";
my $client_secret = "***";
my $redirect_uri = "http://localhost/oauth2callback";

my $oauth = Net::Google::Analytics::OAuth2->new(
    client_id => $client_id,
    client_secret => $client_secret,
    redirect_uri => $redirect_uri,
);
$oauth->interactive;

※$client_id には Google APIs Console に表示される「Client ID」、$client_secret には「Client secret」、$redirect_uri には「Redirect URIs」を入力。

前と異なるURLが表示された。表示された URL にブラウザでアクセスするとコールバックされた URL が localhost だからアクセスできないと表示される。ビックリするけど、そのまま。
ss5
URL には、 http://localhost/oauth2callback?code=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy と表示されているので引数 code の値を先の実行したスクリプトEnter code: の後に貼り付ける。
そうすると以下の結果が返ってくる。
Using code: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Access token:  zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Refresh token:
でも、 Refresh token  が空白で何も表示されない。また、はまった。なかなか進まない。。 またまた、いろいろ調べているとこのサイトの情報が参考になりました。 refresh_token 取得手順を最初からやり直す必要があるみたい。 Net::Google::Analytics::OAuth2 '3.01' では approval_prompt、access_type のパラメータは考慮されていないようなので refresh_token の取得スクリプト実行後に表示されたURLに &approval_prompt=force&access_type=offline を追記してブラウザでアクセスし、引数 code の値をURLに表示された処理を実行。スクリプトEnter code: の後に貼り付けすると Refresh token が表示されるようになりました(取得できました)。
URLは以下のような感じになります。
Using code: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Access token:  zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Refresh token: oooooooooooooooooooooooooooooooooooooooo
あとは、すんなり参考にさせてもらったコードでデータ取得できました。
use strict;
use warnings;
use utf8;

use DateTime;
use Net::Google::Analytics;
use Net::Google::Analytics::OAuth2;

my $profile_id = "***";
my $client_id = "***";
my $client_secret = "***";
my $refresh_token = "***";

my $analytics = Net::Google::Analytics->new;
my $oauth = Net::Google::Analytics::OAuth2->new(
    client_id => $client_id,
    client_secret => $client_secret,
);
my $token = $oauth->refresh_access_token($refresh_token);
$analytics->token($token);

my $today = DateTime->today;
my $req = $analytics->new_request(
    ids         => "ga:$profile_id",
    dimensions  => "ga:pagePath",
    metrics     => "ga:pageviews",
    sort        => "-ga:pageviews",
    start_date  => $today->clone->subtract( days => 30 )->ymd,
    end_date    => $today->ymd,
    max_results => 10,
);

my $res = $analytics->retrieve($req);
die if !$res->is_success;

for my $row ( @{$res->rows} ) {
    print $row->get_page_path,"\t",$row->get_pageviews,"\n";
}
※ $profile_id は、 Google Analytics のアカウントの管理で該当の項目を選択、プロパティで該当の項目を選択、プロファイルの項目で該当の項目を選択、「プロファイルの選択」タブをクリックし、表示される「プロファイル ID」の内容です。
ss8