なか日記

一度きりの人生、楽しく生きよう。

C#とAzureでPVをつぶやくBotを作ってみよう -第2回 Google AnalyticsからPVを取得する-

連載第2回目はGoogle Analyticsを使ってPVを取得してみましょう。

連載目次

はじめに
第1回 Google Analytics APIの利用準備
第2回 Google AnalyticsからPVを取得する
第3回 Twitter APIの利用準備
第4回 Twitterに投稿する
第5回 Webアプリケーションにまとめる
最終回 Azureへのデプロイ

Visual Studioでプロジェクトを作成

「TweetPV」という名前でクラスライブラリを作成します。ソリューション名は「TweetPVApps」にしておきます。

Google.Apis.Analytics.v3 Client Libraryのインストール

パッケージマネージャコンソールでGoogle.Apis.Analytics.v3 Client Libraryをインストールします。

PM> Install-Package Google.Apis.Analytics.v3

app.configにAnalytic API関連の設定を追加

app.configに前回行った際に取得した以下の設定を追加します。

  • 作成したP12キーのファイル名(フルパス)
  • メールアドレス
  • ビューID
<configuration>
  <appSettings>
    <add key="analyticsKeyFile" value="xxxxx.p12"/>
    <add key="analyticsCredentialId" value="xxxxx@developer.gserviceaccount.com"/>
    <add key="analyticsViewId" value="99999999"/>
  </appSettings>

AnalyticsHelperクラスの作成

プロジェクトにAnalyticsHelperクラスを追加します。

コードは「Google Analytics API を使って前日の PV を取得するコードを C# で書いてみた - しばやん雑記」の内容まるパクリです。しばやんありがとう。

※P12キーファイルのパスをコンストラクタで指定するようにしてます。

public class AnalyticsHelper
{
    private AnalyticsService _service;
    public AnalyticsHelper(string analyticsKeyFile)
    {
        // Azure Web サイトで動かす場合には WEBSITE_LOAD_USER_PROFILE = 1 必須
        var certificate = new X509Certificate2(analyticsKeyFile, "notasecret", X509KeyStorageFlags.Exportable);

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

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

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

        // ビューのIDを指定してデータを取得する
        var analyticsViewId = ConfigurationManager.AppSettings["analyticsViewId"];
        var data = await _service.Data.Ga.Get("ga:" + analyticsViewId, date, date, "ga:pageviews").ExecuteAsync();

        return int.Parse(data.Rows[0][0]);
    }
}

動作確認

動作確認ですが、コンソールアプリケーションもしくは単体テストプロジェクトを作成して、以下の様なコードで動作確認できます。

var file = ConfigurationManager.AppSettings["analyticsKeyFile"];
var sut = new AnalyticsHelper(file);
var pv = sut.GetPvAsync().Result;

私はどちらかというと単体テストプロジェクトで確認する派ですね。

おわり

これでGoogle AnalyticsからPV取得できるようになりました。次はTwitterに呟く為の準備を行います。