RaspberryPiでGoogle Calendar APIを呼んでみた

みなさん、こんにちは。KEYチームの矢納です。

技術ネタ第3弾!!「RaspberryPiでGoogle Calendar APIを呼んでみた」です。
過去記事の目次はこちらに移動しました。

なぜやろうとしたのか

弊社では会議室の予約にGoogle Caldendarを使用しています。皆さんスケジュール管理をほぼGoogle Calendarを使用しているので、同時に見る事ができて便利です。

さて、弊社には1〜3人しか入れない部屋があります。電話ボックスなどと言われています。もちろんこの部屋も予約可能です。ですが、多くの人が予約をせずにこの部屋を使います。そうすると実際に使おうと思っていた人が使えなくなってしまいます。

ですので、その部屋に入った際にその部屋の予定を表示してあげて、いきなり入った人にお知らせするモノを作ろうと思いました。部屋は小さいのでできればコンパクトに予定を表示したいです。最近、Raspberry Pi公式のディスプレイが発売されたのでそちらに表示させます。

表示の前にGoogle Calendar APIを利用してその部屋の予定を取得する必要が有ります。Raspberry PiでどのようにGoogle APIの呼ぶのかが気になったので、実際にやってみました。

OAuthのやり方

Google APIを使用するには認証をする必要が有ります。パソコンであるのならブラウザでID/PASSを入力するのですが、RaspberryPiには標準ではディスプレイがありません。ではどうすれば良いのでしょうか?

今回はこちらを参考にしました。

OAuthのやり方は右図を見ると分かり易いですね。

  1. Androidですか?iOSか? → いいえ、違います
  2. ブラウザがありますか? → いいえ、ありません

つまり、「Using OAuth 2.0 for Devices」となるのです。


Step1. Client ID と Client secret の作成

ここから、実際にGoogleAPIを呼ぶための準備等を行っていきます。

  1. Google Developers Consoleにアクセス。
  2. Create Project
    • Project Nameは任意に決めてください
  3. 左のメニューから APIs & auth -> credential 選択
  4. Create new Client ID ボタンクリック
    1. Installed Application -> Other -> Create Client ID 選択
    2. 作る際にConsent screenの入力を求められるかもしれません。その際は適当に入力してください。
  5. Client ID と Client secret の出来上がり

Step2. ユーザコードの取得

  1. https://accounts.google.com/o/oauth2/device/code に対してPOSTリクエスト

    • Hedaer: 'Content-Type: application/x-www-form-urlencoded'
    • Parameter: client_id={Step1で取得したClientID}
    • Parameter: scope={こちらを参照} $ curl -d "client_id={Client ID}&scope={scope}" https://accounts.google.com/o/oauth2/device/code

※scopeが複数ある場合は空白でつなげる

レスポンス

{
  "device_code" : "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
  "user_code" : "GQVQ-JKEC",
  "verification_url" : "https://www.google.com/device",
  "expires_in" : 1800,
  "interval" : 5
}

Step3. デバイスの承認

このステップはご自身のパソコンで行ってください。

  1. Step2でのレスポンス内のverification_urlの内容にブラウザでアクセス
  2. 「Enter the code displayed by your device:」と表示されますので、Step2でのレスポンスのdevice_codeではなく user_code を入力してください。
  3. あとは指示の通りに進んでください

Step4. アクセストークンの取得

  1. https://www.googleapis.com/oauth2/v3/token に対してPOSTリクエスト

    • Header: 'Content-Type: application/x-www-form-urlencoded'
    • Parameter: client_id={Step1で取得したClientID}
    • Parameter: client_secret={Step1で取得したClient secret}
    • Parameter: code={Step2でのレスポンスのdevice_code}
    • Parameter: granttype='http://oauth.net/granttype/device/1.0' $ curl -d "clientid={Client ID}&clientsecret={Client secret}&code={devicecode}&granttype=http://oauth.net/grant_type/device/1.0" https://www.googleapis.com/oauth2/v3/token`

レスポンス

{
  "access_token" : "ya29.AHES6ZSuY8f6WFLswSv0HELP2J4cCvFSj-8GiZM0Pr6cgXU",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "1/551G1yXUqgkDGnkfFk6ZbjMLMDIMxo3JFc8lY8CAR-Q"
}

Step5. Google Calender API呼び出し

アクセストークンをパラメータに設定してリクエストを出せば結果が返ってきます。

例) ある特定の日のイベントを取得する。

https://www.googleapis.com/calendar/v3/calendars/{CalendarID}/events?singleEvents=true&orderBy=startTime&timeMin=2015-07-14T00%3A00%3A00.000Z&timeMax=2015-07-15T00%3A00%3A00.000Z&key={access_token}

Calendar APIに関してはこちらのリファレンスページをご参照下さい

さいごに

これでブラウザを持たないデバイスでのGoogle APIの呼び出しができました。アクセストークンには有効期限が有りますので、期限が切れてしまったらリフレッシュトークンを使って更新を行ってください。

Google Calendar APIで予定は取得できるようになったのですが、まだディスプレイが届いていないので実際のモノは作れていません(ToT)。またモノができましたら記事を書くかもしれませんのでお待ちください。

Email: yanou at atware.co.jp