アレアレ

お役立ち情報、お悩み解決情報を発信!

visual studio code

Google Analytics Reporting API V4を.NET Coreアプリから利用する方法

Google Analytics Reporting API V4を.NET Coreアプリから利用する方法

今回は、.NET Coreアプリから、Google Analyticsのデータにアクセスするプログラムを作りたい人にお伝えしたいお役立ち情報です。

この記事を書いている現在、Googleが、Google Analyticsのデータ取得目的向けに公開しているAPIには、次の2つがあります。

  • Core Reporting API V3
  • Google Analytics Reporting API V4

で、Google公式のAPIの紹介ページによると、将来的に新しい機能は、全てV4向けに公開されるそうです。

なので、これからGoogle Analyticsのデータを取得するプログラミングをするのなら、Google Analytics Reporting API V4を利用しない手はないんですね。

一方で。この記事を書いている現在ですが、Google公式のAPI紹介ページでは、インストールするアプリ向けにGoogle Analytics Reporting API V4を利用するサンプルとしては、JavaとPython向けのものしか公開されていません。

そのため、C#で実装する方法がすぐにはわからないんですね。それを、「C#で実装してみました」というのが、この記事の趣旨です。

ちなみに、今現在、.NETの環境には、Windowsのみで動作する.NETと、Mac・Linux・Windowsで動作する.NET Coreがあります。で、今回のサンプルは、.NET Core向けのものです。

そのため、ご紹介するサンプルにおいて、普通の.NET向けにやれば、簡単にできる箇所が、ちょっと手間が増える状況にもなっています。一方、.NET Coreは実行環境を選びませんので、その良さはあります。

私は、普段Macを利用しており、仮想環境を使ったとしても、WindowsのVisual Studioを起動するのが面倒なんですね。一方、Visual Studio Codeは、Macでもサクサク動くため、C#の利用環境として、むしろ便利なわけです。

そんな理由から、実装がちょっと面倒になっても、.NET CoreからGoogle Analytics Reporting API V4を利用するサンプルを作ることにしました。

開発環境

では、まず、開発環境からご紹介します。

  • OS: macOS Sierra バージョン 10.12
  • .Net Core: 1.0.0-preview3-003612

繰り返しとなりますが、私の開発環境は、Macを利用しています。ですが、今回のサンプルは、クロスプラットフォームで動作する.Net Coreなので、Linuxでも、Windowsでも同様に動作します。

また、この記事では、Macでの.Net Core向けのコンソールアプリの作り方について、解説しません。その方法は、Microsoftが公開しているドキュメントに詳しく解説されているからです。

project.json

では、本題に入ります。まず、yoコマンドを利用して、.NET Coreのコンソールアプリのプロジェクトを生成してください。ここでは、「GoogleAnalyticsSample」というプロジェクト名で、生成したものとします。

プロジェクトを生成したら、まず、修正するのは、project.jsonです。このファイルに、Google AnalyticsのAPIを利用するためのライブラリを使えるようにするための設定を追加します。

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0"
    },
<strong>    "Google.Apis.Auth": "1.16.0",
    "Google.Apis.AnalyticsReporting.v4": "1.16.0.634"</strong>
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  },

  "tooling": {
    "defaultNamespace": "GoogleAnalyticsSample"
  }
}

上のコードにおいて、太字で示した、「Google.Apis.Auth」と「Google.Apis.AnalyticsReporting.v4」を追加しているのがポイントです。

Program.cs

続いて、プログラムのメイン処理となるProgram.csを編集します。先にそのコードを示しておくと、次の通りです。

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

using Google.Apis.AnalyticsReporting.v4;
using Google.Apis.AnalyticsReporting.v4.Data;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Services;
using Google.Apis.Util.Store;

namespace GoogleAnalyticsSample
{
    public class Program
    {
        private static readonly string CLIENT_SECRET_JSON_RESOURCE = &quot;client_secrets.json&quot;;

        private static readonly string USER = &quot;[REPLACE_YOUR_GOOGLE_ACCOUNT_NAME]&quot;;

        private static readonly string VIEW_ID = &quot;[REPLACE_YOUR_VIEW_ID]&quot;;

        private static readonly string DATA_STORE_DIR = &quot;store/hello_analytics&quot;;

        private static readonly string APPLICATION_NAME = &quot;Hello Analytics Reporting&quot;;

        public static void Main(string[] args)
        {
            MainAsync(args).Wait();
        }

        public static async Task MainAsync(string[] args)
        {
            var service = await InitializeAnalyticsReporting();
            var response = GetReport(service);
            PrintResponse(response);
        }

        private static async Task<AnalyticsReportingService> InitializeAnalyticsReporting()
        {
            var clientSecrets = GoogleClientSecrets.Load(File.OpenRead(CLIENT_SECRET_JSON_RESOURCE));

            var initializer = new GoogleAuthorizationCodeFlow.Initializer(){
                ClientSecrets = clientSecrets.Secrets,
                DataStore = new AppDataFileStore(DATA_STORE_DIR),
                Scopes = new string[]{AnalyticsReportingService.Scope.Analytics}
            };
            //AppDataFileStoreは後で追加する
            
            var flow = new GoogleAuthorizationCodeFlow(initializer);

            var auth = new AuthorizationCodeInstalledApp(flow, new PromptCodeReceiver());

            var credential = await auth.AuthorizeAsync(USER, new CancellationToken());

            return new AnalyticsReportingService(new BaseClientService.Initializer(){
                HttpClientInitializer = credential,
                ApplicationName = APPLICATION_NAME
            });
        }

        private static GetReportsResponse GetReport(AnalyticsReportingService service){
            var dateRange = new DateRange(){
                StartDate=&quot;7DaysAgo&quot;,
                EndDate=&quot;today&quot;
            };

            var sessions = new Metric(){
                Expression = &quot;ga:sessions&quot;,
                Alias = &quot;sessions&quot;
            };

            var browser = new Dimension(){
                Name = &quot;ga:browser&quot;
            };

            var request = new ReportRequest(){
                ViewId = VIEW_ID,
                DateRanges = new List<DateRange>{dateRange},
                Dimensions = new List<Dimension>{browser},
                Metrics = new List<Metric>{sessions}
            };

            var requests = new List<ReportRequest>{request};
            
            var getReport = new GetReportsRequest(){
                ReportRequests = requests
            };

            return service.Reports.BatchGet(getReport).Execute();
        }

        private static void PrintResponse(GetReportsResponse response) {

            foreach(var report in response.Reports){
                var header = report.ColumnHeader;
                var dimensionHeaders = header.Dimensions;
                var metricHeaders = header.MetricHeader.MetricHeaderEntries;
                var rows = report.Data.Rows;

                if (rows == null) {
                    Console.WriteLine($&quot;No data found for {VIEW_ID}&quot;);
                    return;
                }

                foreach(var row in rows){
                    var dimensions = row.Dimensions;
                    var metrics = row.Metrics;

                    for (int i = 0; i < dimensionHeaders.Count &amp;&amp; i < dimensions.Count; i++) {
                        Console.WriteLine($&quot;{dimensionHeaders[i]}: {dimensions[i]}&quot;);
                    }

                    for (int j = 0; j < metrics.Count; j++) {
                        Console.Write($&quot;Date Range ({j}): &quot;);
                        var values = metrics[j].Values;
                        for (int k = 0; k < values.Count &amp;&amp; k < metricHeaders.Count; k++) {
                            Console.WriteLine($&quot;{metricHeaders[k].Name}: {values[k]}&quot;);
                        }
                    }
                }
            }
        }
    }
}

以上が、Program.csの修正内容です。で、このプログラムですが、Googleが次のページで、Java向けにGoogle Analytics Reporting API V4のサンプルを紹介しているソースを、.NET CoreのC#向けに書き直したものです。

はじめてのアナリティクス Reporting API V4: インストール済みアプリケーション向け Java クイックスタート

なので、基本的なチュートリアルの進め方は、このJavaのものを参考にしてください。Javaチュートリアルの最初で、「client_secrets.json」を生成することになるのですが、このファイルは、今回のC#向けのサンプルでも必要になります。

visual-studio-code

「client_secrets.json」は、上の画像のように、プロジェクトのルートに配置するのがポイントです。ビルドしてできる「bin」配下ではない点にご注意ください。

また、今回のプログラムの処理ですが、MainAsyncの処理を見ると、シンプルなことをしていることがわかりますよね。Google Analyticsにアクセスするサービスを作り、そのサービスでレポートのデータを取得し、その結果を表示させているだけです。

ほか、今回のサンプルでは、Google Analyticsにアクセスするための認証情報を得るフローとして、PromptCodeReceiverというクラスを利用しています。

このPromptCodeReceiverを利用した場合は、認証情報がない場合は、コンソールに、認証情報を得るためのGoogleのURLが出力されます。

terminal1

そのURLをコピーして、ブラウザでアクセスすると、認証の許可を求める次の画面が表示されます。

request

許可すると次のように、認証用のコードが表示されます。

code

そして、この認証用のコードを入力待ちのコンソールに貼り付けます。

terminal2

以上で認証が無事成功すると、今回のコンソールアプリからGoogle Analyticsにアクセスできるようになります。

AppDataFileStore.csを追加する

最後に。この上でご紹介したProgram.csのメイン処理ですが、AppDataFileStoreのクラスが未定義のため、ビルドが通らないですよね。なので、このAppDataFileStore.csを追加する必要があります。

で、AppDataFileStore.csのソースですが、GitHubで公開されています。

Google API’s AppDataFileStore

ただ、このGitHubで公開されているAppDataFileStore.csを今回のサンプルで使うためには、ちょっと修正が必要になります。その修正方法をご紹介すると。

まず、TaskExとなっている箇所がビルドエラーとなるはずです。それを次のように修正します。

return Task.Delay(0); //Exを取る

次に、コンストラクタAppDataFileStoreを次のように修正します。

        public AppDataFileStore(string folder) {
            //folderPath = Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data/"), folder);
            folderPath = folder; //コンソールアプリなので、パスをそのまま使う
            if (!Directory.Exists(folderPath)) {
                Directory.CreateDirectory(folderPath);
            }
        }

以上のように修正したAppDataFileStoreクラスをAppDataFileStore.csとしてファイルにし、プロジェクトに追加してください。これで、準備が整いました。

実行すると、Google Analyticsからデータが取得できることが確認できるはずです。

Return Top