.NETからGoogle Analytics APIを呼び出し、データを取得する

CodeZine / 2014年2月13日 14時0分

APIで取得した内容が、Google Analyticsの管理画面と同じことを確認

 この記事では、C#とASP.NET MVCからGoogle Analytics APIを呼び出す方法について紹介します。APIを呼び出すことでGoogleのサービスの情報を.NETのプログラムから利用することができます。前編では、Google Cloud Consoleでの設定、Visual Studioでのプロジェクト作成といった準備を行いました。後編に当たる本稿では、コードを記述し、実際に動かしてみるところまでを紹介します。

 以下のステップで解説していきます。

●コードの記述

FlowMetadata継承クラスの追加AuthCallbackController継承クラスの追加HomeControllerの修正ビューAbout.cshtmlの変更●動作確認(アプリケーションの実行)

アプリケーションを実行 Google Analyticsデータを表示するページへ移動 Googleのログイン画面へリダイレクト ログインしたアカウントのGoogle Analyticsデータを使用してよいかを確認 Google Analyticsデータの表示 ■コーディングの実施

 それでは、コーディングを始めていきましょう。今回のサンプルでは主に3つのクラスと2つのビューを追加/変更します。

●FlowMetadata継承クラスの追加

 まず、認証用のメタデータを格納するFlowMetadataクラス(Google.Apis.Auth.OAuth2.Mvc名前空間)を継承するクラス「MyFlowMetadata」を作成します。

FlowMetadataクラスのコード(MyFlowMetadata.cs)
using Google.Apis.Analytics.v3; using Google.Apis.Auth.OAuth2; using Google.Apis.Auth.OAuth2.Flows; using Google.Apis.Auth.OAuth2.Mvc; using Google.Apis.Util.Store; using System; using System.Web.Mvc; namespace GaMvcSample.Infra { // OAuth認証に関するメタデータを設定するクラス public class MyFlowMetadata : FlowMetadata { // (1)認証情報を保持するフィールド private static readonly IAuthorizationCodeFlow myFlow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = new ClientSecrets { // 「クライアントID」を設定 ClientId = "649539766830-r9ficnl9gan9i43j0jlf76kvn9enp4f0.apps.googleusercontent.com", // 「クライアントシークレット」を設定 ClientSecret = "bQyK0tIvzi9-TuBFCnSoYX1s" }, // 今回の接続で許可を求めるGoogleサービスの機能と権限を指定 Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly }, // トークンレスポンスのファイル格納場所。 DataStore = new FileDataStore("DotNetOAuthSample") }); // (2)設定した認証情報を渡すプロパティ public override IAuthorizationCodeFlow Flow { get { return myFlow; } } // (3)ユーザーIDを返すメソッド public override string GetUserId(Controller controller) { var user = controller.Session["UserId"]; if (user == null) { // ここでは毎回新しいGUIDを発行しているが、同一ユーザーとみなせるIDでも良い user = Guid.NewGuid(); controller.Session["UserId"] = user; } return user.ToString(); } // (4)認証後に呼び出すパスを返すプロパティ public override string AuthCallback { get { return @"/MyAuthCallback/IndexAsync"; } } } }
 このクラスでは、認証に関する情報や挙動を設定します。(1)と(2)の部分では、Google Cloud Consoleに表示されるクライアントIDとクライアントシークレットを設定しています。

 そして、認可対象にしたい処理をScopesプロパティに設定します。ここでは、「Google Analyticsの読み取り権限」として、AnalyticsService.Scope.AnalyticsReadonlyを設定しています。

 DataStoreプロパティには、OAuthのトークンレスポンスを格納するフォルダ名を指定します。「Google.Apis.Auth.OAuth2.Responses.TokenResponse-<GetUserIdメソッドの戻り値>」というファイルが、「C:\Users\<ユーザー名>\AppData\Roaming\<DataStoreに指定した値>」に作成されます。作成されるファイルの中身は「{"access_token":"ya29.1.AADtN_WtGFU4bXkXe3dZrFRDNAfDKShzN-CpFu8giXJStU_tmCKIQvQrXt75zg1i92PexQ","token_type":"Bearer","expires_in":3599,"Issued":"2013-12-08T18:25:27.4802329+09:00"}」のような内容となり、アクセストークンなどが格納されます。

 (3)では、認証ユーザーを識別するユーザーIDの文字列を返します。同一の単位で扱いたいユーザー別にIDを用意します。このユーザーIDは、フレームワーク側「AuthCallbackController」などから呼び出されます。

 (4)は、認証後のコールバックで呼び出すパスを返すプロパティです。コントローラ名とメソッド名の組み合わせです。現時点ではメソッド名は変更できません。デフォルト値の"AuthCallback/IndexAsync"のままで問題なければ、オーバーライドする必要はありません。

クライアント情報をJSONファイルから読み込む
 今回のサンプルでは、クライアントIDとクライアントシークレットを直接コードに記述しました。しかし、環境情報をハードコーディングしたくない場合は、資格情報が記載されたJsonファイルを読み込ませることも可能です。手順としては、Cloud ConsoleからダウンロードできるJSONファイルをサーバーの任意の場所に配置します(ここではC:\CodeZine\client_secret.jsonに配置)。そして、myFlowフィールドの部分を以下のように書き換えることで実現できます。

認証情報をJSONファイルから読み込み(MyFlowMetadata.cs改変して抜粋)
private static readonly IAuthorizationCodeFlow myFlow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = GoogleClientSecrets.Load(new FileStream( @"C:\CodeZine\client_secret.json", FileMode.Open, FileAccess.Read)).Secrets , Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly },




CodeZine

トピックスRSS

ランキング