2018.4.23
2020.1.7

.NET coreで「Google Analytics Reporting API」を利用する

.NET CoreでGoogle APIの「Google Analytics Reporting API」を利用して、URL毎のページビュー数を取得する方法です。

認証はサービスアカウントキーで行っていて、それ自体はRubyでやったことがあったので、.NET coreも似たようなものだろうと思っていましたが、Google APIの認証を行うのが久しぶり過ぎてちょっとハマりました。

目次

  • 認証情報(サービスアカウントキー)の作成
  • NuGetパッケージ管理でAPI用のライブラリをインストール
  • コード
  • 参考リンク

認証情報(サービスアカウントキー)の作成

以前、発行したものが手元にあるので不要でしたが、思い出すためにもGoogle API Consoleにアクセスして認証情報の発行の仕方をおさらいしました。

発行は場所さえ分かれば簡単で、選択肢からサービスアカウントキーを選択し、あとはいくつか必要な項目を選択したらOKです。

今回、キーのタイプは「JSON」を選択します。

作成後、JSONファイルをダウンロードします。(ダウンロードは一度のみなので注意)

ファイル名はデフォルトだと「project-1234567890ab.json」みたいな感じになります。

NuGetパッケージ管理でAPI用のライブラリをインストール

コードの前にNuGetパッケージ管理から「Google.Apis.AnalyticsReporting.v4」を対象のプロジェクトにインストールします。

インストールが終わったらダウンロードしておいた認証情報のキーファイル(JSON)をプロジェクト直下に配置します。

コード

Google Analytics Reporting APIでURL毎のページビュー数を取得するコードは以下の通りです。(プロジェクトはコンソールアプリケーションで作成)


public class Program
{
    public static void Main(string[] args)
    {
        var credential = GetCredential();

        // Create the service.
        var service = new AnalyticsReportingService(new AnalyticsReportingService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "app",
        });

        // Create a batch request.
        var request = new GetReportsRequest
        {
            ReportRequests = new[] {
                new ReportRequest
                {
                    ViewId = "123456789",                                                                       // Google AnalyticsのビューID
                    Metrics = new[] { new Metric { Expression = "ga:pageviews" } },
                    Dimensions = new[] { new Dimension { Name = "ga:pagePath" } },
                    DateRanges = new[] { new DateRange { StartDate = "7DaysAgo", EndDate = "today" } },         // 一週間分のページビュー数
                    OrderBys = new [] { new OrderBy { FieldName = "ga:pageviews", SortOrder = "DESCENDING" } }  // ページビュー数の降順でソート
                }
            }
        };

        var batchRequest = service.Reports.BatchGet(request);
        var response = batchRequest.Execute();

        foreach (var x in response.Reports.First().Data.Rows)
        {
            Console.WriteLine(string.Join(", ", x.Dimensions) + "   " + string.Join(", ", x.Metrics.First().Values));
        }
    }

    public static GoogleCredential GetCredential()
    {
        using (var stream = new FileStream("project-1234567890ab.json", FileMode.Open, FileAccess.Read))
        {
            return GoogleCredential.FromStream(stream)
                .CreateScoped(AnalyticsReportingService.Scope.AnalyticsReadonly);
        }
    }
}

最終的にはRubyでやっていた時と同じ感じになりましたが、最初はこちら(Send Batch Requests)にあったサンプルコードで試していました。

公式サイトにあるHOW TOなんだからこれでいいはず...そう思って、こちらの環境が悪いのかと色々確認しましたが、サンプルにあったのはそもそもOAuthクライアント用で、サービスアカウントキーを使った方法ではありませんでした。

じゃあ、サービスアカウントキーの場合は...と探しましたが、見当たらず、こちら(Add support for Service Account authentication with JSON Key File · Issue #533 · google/google-api-dotnet-client · GitHub)を参考にしました。

英語なのであまり理解せずに読み飛ばしてしまったのが悪いですが、おかげで半日潰れました。

その時に出ていたエラーは以下の通りです。

System.AggregateException: One or more errors occurred. (At least one client secrets (Installed or Web) should be set)

このエラーのおかげで時間がかかりましたが、結局、JSONファイルがOAuthクライアント用のフォーマットではなかったために出ていたエラーでした。そりゃOAuthクライアントとサービスアカウントのキーじゃあ、違いますよね。残念。

参考リンク

C#】関連記事