TL; DR
- Google Calendar のイベントを Ruby プログラムから読み出す方法を書きました。IoT ガジェットなどの自作に便利かと思います。
-
公式 Quick Start は人間が介在する OAuth2 のやり方だけど、ようはこれの無人版です。あと、この公式ドキュメントは
single_events
パラメタを指定してないので動かない(バグ持ちの)はずです。 - サービスアカウントというものを作って、それに必要な権限を与え、そのアカウントの秘密鍵を使ってアクセスします。
カレンダーの準備
既存のものもしくは新規作成した Google Calendar の ID をメモします。IDは設定 > マイカレンダーの設定 から確認できます。
プロジェクトとサービスアカウント
各種ドキュメントを操作するには当然権限が必要です。プログラムから操作する場合は、大雑把に言って2とおりの権限獲得の手法があります。
- 一時的に人間の許可を得て、その人間のアカウントで操作
- 権限を与えられた 機械ようのアカウント で操作
ざっくり言うと前者はインタラクティヴなソフトで使う方法で、後者は自動化システムで使う方法です。今回は後者の方法を使います。ここで「機械ようのアカウント」を サービスアカウントと言います。つまり、まずはサービスアカウントを作り、必要な権限を与える必要がります。だいたい以下の手順です。
- GCPのコンソール に行って、プロジェクトを作ります。
- GCPの左上のハンバーガーメニュー > IAMと管理 > サービスアカウント > サービスアカウントを作成
- 入力は必須項目だけで良いと思います。
name@project.iam.gserviceaccount.com
というアカウントができます。 - アカウントを作ると秘密鍵 (private key) をダウンロードできると思います。JSON形式でダウンロードしてください。
- このアカウントに対して、カレンダーの権限を与えてください(=共有してください)。与え方は通常の人間向けの権限操作といっしょです。
- ハンバーガーメニュー > APIとサービス > ライブラリ からカレンダーAPIを有効化してください。
パッケージのインストール
たぶんこれだけでいいはず。
$ gem install google-apis-calendar_v3
コード
直近の10個のイベントを取得して標準出力に開始時刻と概要を出力します。
# coding: utf-8
require 'google/apis/calendar_v3'
KEYFILE = "ダウンロードした鍵.json".freeze
CALENDAR_ID = "「マイカレンダーの設定」にあるID".freeze
service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open(KEYFILE),
scope: Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY,
)
resp = service.list_events(
CALENDAR_ID,
max_results: 10,
order_by: :startTime,
time_min: DateTime.now.rfc3339,
single_events: true, # これがないと order_by を "startTime" にできない
)
resp.items.each {|event|
# 全日の予定は DateTime じゃなくて Date になる
start = event.start.date_time || event.start.date
puts "%s %s" % [start, event.summary]
}