The jonki

呼ばれて飛び出てじょじょじょじょーんき

【Google Calendar API v3】C#でGoogleカレンダーの情報を取得する

Google CalendarC#からアクセスしてみました。最新版はv3というようですね。結構古い記事が多くAPIもだいぶ違うので手間取りました。OAuthも突破できます。

環境

Windows 7 Professional
Visual Studio 2013 Express

まずはじめに

Write your First App: Prerequisitesを読んでください。めんどいという方は下記を参考にカレンダーを読み取るための準備をしましょう。

  • Google Developers Console.
  • プロジェクトを選ぶ
  • 左メニューの「APIs & auth」を選び、Google Calendar APIがON担っていることを確認
  • 「Credentials」を選んで「Create Client ID」を押して、「Installed Application」を選択。クライアントID及びシークレットIDを作成
  • 元の画面に戻ったらクライアントIDなどが生成される。「Download json」ボタンでjsonファイルを落として置く。

NuGet

NuGetというVisual Studioのパッケージマネージャをインストールします。Visual Studio 2013用のパッケージをダウンロードしてインストールしましょう。インストール後、Visual Studioの【ツール】メニューにNuGetのパッケージマネージャが入っています。【パッケージマネージャコンソール】を押すとコンソールから色々とパッケージをインスコできます。

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

C#の空のコンソールアプリケーションを作成しましょう。そして先ほど入れたNuGetのパッケージマネージャコンソールを開いてライブラリをインストールしていきます。問題なければインストールされました、といったログがでます。

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

またダウンロードした.jsonファイルもbin/Debugなどに置いてパスを通しておきましょう。ビルドしないとこのフォルダはできないかも。

カレンダー取得のコード

ひとまず道通レベルのコードを書きました。ドキュメントを参考に色々とカレンダー情報を取得してみてください。正直あまり使いやすくなさそうです。
またクライアントシークレットは.jsonにして置いたほうがコードに秘密情報を書かなくてよいので安全ですね。カレンダーIDはわかりにくいですが、Google Calendarの【設定】-> 【カレンダータブ】-> カレンダーのリンク-> 【カレンダーのアドレス】のことです。デフォルトはGoogleアカウントだと思いますが、複数カレンダーがあると長いIDのアドレスが生成されているかと思います。

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

using Google;
using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Util.Store;

namespace Calendar.Sample
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("Calendar API Sample: ");
            Console.WriteLine("================================");  
            try
            {
                new Program().Run().Wait();
            }
            catch (AggregateException ex)
            {
                foreach (var e in ex.InnerExceptions)
                {
                    Console.WriteLine("ERROR: " + e.Message);
                }
            }
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }    

        private async Task Run()
        {
            UserCredential credential;
            using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
            {
                credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    //new ClientSecrets{
                    //    ClientId = s_ClientID,
                    //    ClientSecret = s_ClientSecret,
                    //},
                    new[] { CalendarService.Scope.Calendar },
                    "user", CancellationToken.None);
            }

            // Create the service.
            var service = new CalendarService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "Calendar API Sample",
            });

            // 取得出来たカレンダーをすべて表示
            CalendarList calendarList = service.CalendarList.List().Execute();
            foreach(CalendarListEntry entry in calendarList.Items){
                Console.WriteLine("Calendar Title: " + entry.Summary);// + ", " + entry.Description);
            }

            // 特定のCalendarIdを取得
            //Console.WriteLine(service.Calendars.Get("YOUR_CALENDAR_ID").Execute().Description);

            // 特定のCalendarIdの予定を表示 
            foreach (Event eventItem in service.Events.List("YOUR_CALENDAR_ID").Execute().Items)
            {
                Console.WriteLine(eventItem.Summary);
            }
        }
    }
}

動かない場合

自分の場合、下記のエラーに遭遇したのでコメントにあるリンクからMicrosoft Async 1.0.166-betaをパッケージマネージャで入れなおしたらエラーが取れました。参考にしてみてください。
http://stackoverflow.com/questions/21057052/asp-net-app-crashes-could-not-load-file-or-assembly-microsoft-threading-tasks

ASP.net app crashes - Could not load file or assembly 'Microsoft.Threading.Tasks.Extensions.Desktop'