とあるサイトのページビューを日別で出さなくてはいけなくなった。 Google Analytics でアクセス解析してるんだけど、いちいち管理画面でPVを見て書き出すのがめんどくさいので、 API 経由で指定したサイトの過去10日間のそれぞれPVをプリントしてくれる Perl のスクリプトを書いた。 さくっと終わらすはずが、認証のところで少々時間を食ってしまった。
その仕組みは
- Client Login で Auth キーを取得、具体的にはアカウント情報をとあるエンドポイントへPOSTする
- リクエストする時に「Authorization」ヘッダを加えてその Auth キーを値とする
- GETリクエスト発行
- 結果がXMLで返ってくるのでパース
という具合。で、パースした結果を最低限シンプルにYAMLモジュールでDumpしてる。
以下がそのおれおれスクリプトになっているので、ご参考までに。
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
use DateTime::Duration;
use HTTP::Request::Common ();
use LWP::UserAgent;
use XML::Simple;
use YAML;
my $email = $ENV{GOOGLE_EMAIL};
my $password = $ENV{GOOGLE_PASSWORD};
my $source = 'yusukebe-GoogleAnalyticsCommand-001';
my ( $req, $res, $auth_key );
my $ua = LWP::UserAgent->new();
my $xs = XML::Simple->new( KeyAttr => [''], ForceArray => ['entry'] );
auth();
if ( defined $ARGV[0] ) {
if ( defined $ARGV[1] ) {
analytic( { profile_id => $ARGV[0], date_string => $ARGV[1] } );
}
else {
my $now = DateTime->now( time_zone => 'Asia/Tokyo' );
for ( 1 .. 10 ) {
$now = $now - DateTime::Duration->new( days => 1 );
analytic(
{ profile_id => $ARGV[0], date_string => $now->ymd('-') } );
}
}
}
else {
ls();
}
sub auth {
my $auth_url = 'https://www.google.com/accounts/ClientLogin';
my $service = 'analytics';
$req = HTTP::Request::Common::POST(
$auth_url,
[
accountType => 'GOOGLE',
Email => $email,
Passwd => $password,
service => $service,
source => $source
]
);
$res = $ua->request($req);
die $res->status_line if $res->is_error;
my $content = $res->content;
if ( $res->content =~ /Auth=([^\s]+)/ ) {
$auth_key = $1;
}
else {
die "can't find auth key!";
}
}
sub analytic {
my $args = shift;
my $feed_url = 'https://www.google.com/analytics/feeds/data';
my $profile_id = $args->{profile_id};
my $date_string = $args->{date_string};
$feed_url =
"$feed_url?ids=$args->{profile_id}&metrics=ga:pageviews&start-date=$args->{date_string}&end-date=$args->{date_string}&prettyprint=true"; #xxx
$res = $ua->request(
HTTP::Request::Common::GET(
$feed_url, 'Authorization' => "GoogleLogin Auth=$auth_key"
)
);
my $ref = $xs->XMLin( $res->content );
my $info = {
date => $date_string,
$ref->{entry}->[0]->{'dxp:metric'}->{name} =>
$ref->{entry}->[0]->{'dxp:metric'}->{value}
};
print Dump $info;
}
sub ls {
$res = $ua->request(
HTTP::Request::Common::GET(
'https://www.google.com/analytics/feeds/accounts/default?prettyprint=true',
'Authorization' => "GoogleLogin Auth=$auth_key"
)
);
my $ref = $xs->XMLin( $res->content );
my @entries;
for my $entry ( @{ $ref->{entry} } ) {
push(
@entries,
{
title => $entry->{title}->{content},
profile_id => $entry->{'dxp:tableId'}
}
);
}
print Dump @entries;
}