概要
会社ではサイボウズとかOutlookを使っていて、個人のスケジュールはGoogleカレンダーを使っている、ってケースは多いんじゃないでしょうか。
2つのツールを統合していきたいと思っているんですが、手頃なツールを見つけることができなかったので、自作に挑戦する前の、まず第一ステップとして、GoogleカレンダーのAPIを使って登録イベントを取得してみます。
Googleカレンダーの連携方法としては3つあって
- APIキー
- OAuth2.0 クライアントID
- サービスアカウント キー
そのうち、APIキーは、公開スケジュールのみの取得する際の利用方法になるようです。
OAuth2.0 での連携は、ブラウザーを使った連携を想定している方法のようです。こちらも試しているのですが、説明についてはまた別の機会に。
ここでは、「3. サービスアカウント キー」を使った連携方法を説明します。
環境
- OS X El Capitan
- ruby 2.1.6p336 (2015-04-13 revision 50298)
- gem 2.6.6
手順
-
google api clientのモジュールをインストール(gem でインストールできるので省略します。)
-
Google API Console にアクセス
-
「新しいサービスアカウント」を作成 > キーのタイプは「P12」で作成 (参考となるJSONでやろうとしたら、実現できなかったので「P12」に逃げました。。)
-
「P12」ファイルはrubyスクリプトがアクセスできるところに保存し、サービスアカウントを作成する過程で作成された「サービスアカウントID」をメモっておきます。
ここまで終われば、いよいよ、スクリプトの準備です。
スクリプトの実行
サンプルコードとしては下記の通りです。
# coding: utf-8
require 'google/api_client'
client = Google::APIClient.new(:application_name => 'test')
# 認証
key = Google::APIClient::KeyUtils.load_from_pkcs12('[秘密キーのファイル]', '[秘密キーのパスワード]')
client.authorization = Signet::OAuth2::Client.new(
token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
audience: 'https://accounts.google.com/o/oauth2/token',
scope: 'https://www.googleapis.com/auth/calendar.readonly',
issuer: '[サービスアカウント ID(メールアドレス形式)]',
signing_key: key
)
client.authorization.fetch_access_token!
# イベント取得
cal = client.discovered_api('calendar', 'v3')
time_min = Time.utc(2016, 1, 1, 0).iso8601
time_max = Time.utc(2016, 12, 31, 0).iso8601
params = {'calendarId' => '[カレンダーID]',
'orderBy' => 'startTime',
'timeMax' => time_max,
'timeMin' => time_min,
'singleEvents' => 'True'}
result = client.execute(:api_method => cal.events.list,
:parameters => params)
# イベント格納
events = []
result.data.items.each do |item|
events << item
end
# 出力
events.each do |event|
printf("%s, %s, %s, %s, %s\n",
event.start.dateTime.strftime("%Y-%m-%d %H:%M:%S"), event.end.date_time, event.summary, event.description, event.id)
end
・[秘密キーのファイル][秘密キーのパスワード]
・[サービスアカウントID]
・[カレンダーID]
を変更しましょう。
スクリプトの実行結果は、
boku-no-MacBook:ruby boku$ ruby gcal_s4.rb
2016-07-08 12:30:00, 2016-07-08 13:30:00 +0900, 旅行の準備, 説明書き, p4hq**********etqrg834ueo
となり、イベントを取得できました。
補足
日付の結果出力については、startとendで、2種類を試してみました。
event.end.date_timeについては、Google Calenader APIのページには出てこないので、古いフォーマットなのかもしれません。