ここ最近は日付が変わったタイミングで、このブログの PV を Twitter に手動で流しています。
昨日のしばやん雑記の PV は 758 でした。
— しばやん (@shibayan) 2014, 8月 2
しかし、手動でやるのもめんどくさくなったので、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 にします。
これで API の有効化が出来たので、次は認証周りを設定していきます。Google Maps API では API キーだけで良かったですが、今回は OAuth 2.0 を使う必要があります。
といっても、今回はサーバーから叩きたいだけなのでサービスアカウントを追加して、証明書を使って認証する方法を選びました。
サービスアカウントの追加が完了すると p12 ファイルを生成できるようになるので、ローカルにダウンロードしておきます。パスワードも表示されますが、基本的に notasecret で固定っぽいです。
これで API 周りの設定は完了なので、次は Analytics 側で今追加したアカウントが情報を読めるようにユーザーとして追加します。
ユーザー管理からサービスアカウントとして表示されているメールアドレスを追加するだけです。
あと、ついでに API から取得したいビューの ID をメモしておきます。
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 が格納されてますね。
実際に Azure Web サイトにデプロイ済みのサービスでは、この後にツイートを投げる処理を追加しているだけです。Azure スケジューラーと組み合わせて、0:30 に自動的にツイートされるようにしてあります。