しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Google Analytics API を使って前日の PV を取得するコードを C# で書いてみた

ここ最近は日付が変わったタイミングで、このブログの PV を Twitter に手動で流しています。

しかし、手動でやるのもめんどくさくなったので、Google Analytics から PV を取得して、自動的にツイートするようなサービスを作って Azure Web サイトで動かすようにしました。

当然ながら Google Analytics の API を叩いて、前日の PV を取得する必要があるのですが、Analytics の API は NuGet でクライアントライブラリが提供されているので、これを使うことで簡単に実装が行えました。

NuGet Gallery | Google.Apis.Analytics.v3 Client Library 1.8.1.980

Analytics API を使うためには、他の API と同様に Developers Console から有効化する必要があります。

https://console.developers.google.com/

一覧の中に Analytics API があるので、右側にあるボタンをクリックして On にします。

f:id:shiba-yan:20140803182156p:plain

これで API の有効化が出来たので、次は認証周りを設定していきます。Google Maps API では API キーだけで良かったですが、今回は OAuth 2.0 を使う必要があります。

f:id:shiba-yan:20140803182845p:plain

といっても、今回はサーバーから叩きたいだけなのでサービスアカウントを追加して、証明書を使って認証する方法を選びました。

f:id:shiba-yan:20140803182500p:plain

サービスアカウントの追加が完了すると p12 ファイルを生成できるようになるので、ローカルにダウンロードしておきます。パスワードも表示されますが、基本的に notasecret で固定っぽいです。

これで API 周りの設定は完了なので、次は Analytics 側で今追加したアカウントが情報を読めるようにユーザーとして追加します。

f:id:shiba-yan:20140803183450p:plain

ユーザー管理からサービスアカウントとして表示されているメールアドレスを追加するだけです。

あと、ついでに API から取得したいビューの ID をメモしておきます。

f:id:shiba-yan:20140803183258p:plain

Management API を使えばビューの一覧とか表示できそうですが、今回は Data API だけ使います。

そろそろ疲れてきたので、実際に PV を取得する C# のサンプルコードを上げておきます。当然ですが NuGet から Google.Apis.Analytics.v3 のインストールが必要です。

// Azure Web サイトで動かす場合には WEBSITE_LOAD_USER_PROFILE = 1 必須
var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable);

// Scopes は指定しないとエラーになる
var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer("*******@developer.gserviceaccount.com")
{
    Scopes = new[] { AnalyticsService.Scope.Analytics, AnalyticsService.Scope.AnalyticsReadonly }
}.FromCertificate(certificate));

// HttpClientInitializer に credential 入れるのは違和感あるけど正しいらしい
var service = new AnalyticsService(new BaseClientService.Initializer
{
    HttpClientInitializer = credential,
    ApplicationName = "sample app",
});

// Azure は UTC なので +9 時間して -1 日
var date = DateTime.UtcNow.AddHours(9).AddDays(-1).ToString("yyyy-MM-dd");

// ****** はメモしたビューの ID
var data = await service.Data.Ga.Get("ga:******", date, date, "ga:pageviews").ExecuteAsync();

Google APIs の C# ライブラリは Task に対応してるので、async / await が使えてとても便利です。

そして、実際に実行してみた結果は以下の通り。Rows の中に指定した日付の PV が格納されてますね。

f:id:shiba-yan:20140803184203p:plain

実際に Azure Web サイトにデプロイ済みのサービスでは、この後にツイートを投げる処理を追加しているだけです。Azure スケジューラーと組み合わせて、0:30 に自動的にツイートされるようにしてあります。