なか日記

一度きりの人生、楽しく生きよう。

Googleカレンダーに予定を登録する

ちょっとWebアプリからGoogleカレンダーに予定を追加したいなと思ったのでその手順をメモっておきます。

準備

Goolge Cloud Consoleにてプロジェクト及びアプリケーションを登録する。

以下、ポイント

  • プロジェクトの作成
    • 何のAPIを使用するか指定する
    • アプリケーションの登録
      => client_id,client_secretが発行される
    • REDIRECT URIの指定
      テストの間はlocalhostでも可。コードを取得する際のパラメータと一致する必要あり。

公式ドキュメントはこの辺にまとめてある=> Google Calendar API

コードの取得

以下のURLにアクセス(Get)する

https://accounts.google.com/o/oauth2/auth?client_id={0}&response_type=code&redirect_uri={1}&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar

すると、Googleの認証画面が表示されるので認証する。

認証が終わると、redirect_uriで指定したURLへリダイレクトするが、この時URLにcodeがパラメータとして渡されてくる。

access_tokenの取得

取得したコードと事前に発行された client_id,client_secret を使用して access_token を取得する。

以下の様に https://accounts.google.com/o/oauth2/token 宛にPOSTを行う。

    var cl = new WebClient();
    cl.Encoding = Encoding.UTF8;
    cl.Headers["content-type"] = "application/x-www-form-urlencoded";
    var query = String.Format(
        "code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type={4}",
        code,
        client_id,
        client_secret,
        "http://localhost:50808/",
        "authorization_code"
        );
    result = cl.UploadString("https://accounts.google.com/o/oauth2/token", "POST", query);

    var account = DynamicJson.Parse(result);

    Session.Add("access_token", account.access_token);

予定の登録

access_tokenを使用して予定を登録する。

    var cl = new WebClient();
    cl.Encoding = Encoding.UTF8;
    cl.Headers.Add("Authorization", "Bearer " + accessToken);
    cl.Headers.Add("content-type", "application/json");
    var query = DynamicJson.Serialize(
        new { start = new { date = "2013-10-22" },
              end = new { date = "2013-10-22" },
              summary = "TEST" });

    var result = cl.UploadString("https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events", "POST", query);

細かい仕様は下記公式ドキュメントを参照

ちょろっとJsonを扱いたいときにDynamicJsonがあると便利ですね。