.NET coreで「Google Analytics Reporting API」を利用する
.NET CoreでGoogle APIの「Google Analytics Reporting API」を利用して、URL毎のページビュー数を取得する方法です。
認証はサービスアカウントキーで行っていて、それ自体はRubyでやったことがあったので、.NET coreも似たようなものだろうと思っていましたが、Google APIの認証を行うのが久しぶり過ぎてちょっとハマりました。
目次
- 認証情報(サービスアカウントキー)の作成
- NuGetパッケージ管理でAPI用のライブラリをインストール
- コード
- 参考リンク
認証情報(サービスアカウントキー)の作成
NuGetパッケージ管理でAPI用のライブラリをインストール
コード
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クライアントとサービスアカウントのキーじゃあ、違いますよね。残念。