だるろぐ

だるいぶろぐです

Net::Google::Analytics::OAuth2 で google analytics api を叩こうとしたら refresh token が取得できなかった

google analytics には api*1 がある。
認証・認可には oauth2 を使う。authsub というのもあるみたいだけどどうやらこれから使うなら oauth2 使っとく方がいいらしい。


api を叩くための各種ライブラリ*2もある。
おいおい perl 無いじゃねーか、と思うと、載ってないだけで cpan にある*3
認証部分は Net::Google::Analytics::OAuth2 を使う。


よしこれを使おう、まずは pod に従い interactive メソッドで access_token / refresh_token を入手しよう、とすると中途半端に失敗するはず。access_token しか取れない。
実は最近 google 側の仕様変更があった*4ようで、 refresh token を受け取るにはパラメータを追加する必要がある。それにモジュールが追随してない。


というわけで。

--- a/lib/Net/Google/Analytics/OAuth2.pm
+++ b/lib/Net/Google/Analytics/OAuth2.pm
@@ -70,8 +70,9 @@ sub refresh_access_token {

 sub interactive {
     my $self = shift;
+    my $extra_params = @_ == 1 ? $_[0] : { @_ };

-    my $url = $self->authorize_url;
+    my $url = $self->authorize_url($extra_params);

とでもしてやって、

$oauth->interactive(
    approval_prompt => "force",
    access_type     => "offline",
);

とすると refresh token も取れる。
このモジュールは最近までメンテナンスされてるし github にあるので誰か pull req 送ったら世界が平和になる気がする。

叩く

たとえば

  • /you/want/page/path という uri に前方一致する
  • 2013/01/01-31 間の
  • pvの累計

が欲しいと思ったら

my $req = $analytics->new_request(
    ids         => "ga:$profile_id",
    dimensions  => "ga:pagePath",
    metrics     => "ga:Pageviews",
    filters     => "ga:pagePath=~/you/want/page/path",
    sort        => "-ga:Pageviews",
    start_date  => "2013-01-01",
    end_date    => "2013-01-31",
);

my $res = $analytics->retrieve($req);
$res->is_success or do {
    warn json->decode($res->content)->{error}->{message};
    exit;
};

my $pv = 0;
for my $row ( @{$res->rows} ) {
    $pv += $row->get_pageviews;
}
say $pv;

とかすると取れる。