rubyでgoogleカレンダーのイベントを取得を試してみていたのでメモ
参照サイト
- rubyにてgoogleカレンダーの情報を取得する - Qiita
- google-api-client gemではgoogle-apiコマンドの提供を止めているようだった
- GoogleアナリティクスAPIの承認を初回のみにする - さかなチキンぱん。
- Heroku上からService Account認証でGoogle APIにアクセスする - すぎゃーんメモ
アプリケーションの種類
google apiを利用するために登録するアプリケーションの種類としては以下の3つとなる。
- ウェブアプリケーション
- 今回さわってみてない
- サービスアカウント
- 秘密鍵で管理アカウントとは別アカウントとして認証、定期実行スクリプト向きかな
- インストールされているアプリケーション
- ブラウザでOauth認証、ユーザ操作のクライアント向きかな
事前準備
共通の事前準備
- https://cloud.google.com/consoleにアクセスする
- プロジェクトを作成する
- プロジェクトの設定をする
- 「APIと認証」の「API」でCalendar APIを有効にする
- カレンダーIDの確認
- イベントを取得したいカレンダーのIDをメモしておく(カレンダーの設定から確認可能)
サービスアカウントの事前準備
- プロジェクトの設定をする
- 「APIと認証」の「認証情報」で新しいクライアントIDを作成する
- 新しいクライアントIDの作成ではアプリケーションの種類でサービスアカウントを選択する
- 新しい公開キー/秘密キーのペアが作成されるので表示される秘密キーのパスワードをメモする
- キーペア作成と同時に秘密キーをダウンロードがされるので保管する
- カレンダーの設定をする
- googleカレンダー にアクセスする
- イベントを取得したいカレンダーの共有設定において、作成したサービスアカウントのメールアドレスでユーザを追加する
インストールされているアプリケーションの事前準備
- プロジェクトの設定をする
- 「APIと認証」の「認証情報」で新しいクライアントIDを作成する
- 新しいクライアントIDの作成ではアプリケーションの種類でインストールされているアプリケーションを選択する
- 新しいクライアントIDの作成ではインストールされているアプリケーションの種類でその他を選択する
- 作成したネイティブアプリケーションから情報を取得しておく
- JSONをダウンロードでJSONファイルをダウンロードしておく
サービスアカウントで取得
スクリプト
- Gemfile
# A sample Gemfile
source "https://rubygems.org"
# gem "rails"
gem 'google-api-client'
- サンプルスクリプト
# coding: utf-8
require 'google/api_client'
client = Google::APIClient.new(:application_name => '')
# 認証
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 => '[サービスアカウントのEmail address]',
:signing_key => key)
client.authorization.fetch_access_token!
# イベント取得
cal = client.discovered_api('calendar', 'v3')
time_min = Time.utc(2014, 3, 1, 0).iso8601
time_max = Time.utc(2014, 3, 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\n",event.start.date,event.summary)
end
インストールされているアプリケーションで取得
スクリプト
- Gemfile
# A sample Gemfile
source "https://rubygems.org"
# gem "rails"
gem 'google-api-client'
- サンプルスクリプト
# coding: utf-8
require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/installed_app'
require 'google/api_client/auth/file_storage'
client = Google::APIClient.new(:application_name => '')
# 認証
authfile = Google::APIClient::FileStorage.new('.authfile')
unless authfile.authorization.nil?
client.authorization = authfile.authorization
else
client_secrets = Google::APIClient::ClientSecrets.load("[ダウンロードしておいたjsonファイルのパス]")
flow = Google::APIClient::InstalledAppFlow.new(
:client_id => client_secrets.client_id,
:client_secret => client_secrets.client_secret,
:scope => ['https://www.googleapis.com/auth/calendar.readonly']
)
client.authorization = flow.authorize(authfile)
end
# イベント取得
cal = client.discovered_api('calendar', 'v3')
time_min = Time.utc(2014, 3, 1, 0).iso8601
time_max = Time.utc(2014, 3, 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\n",event.start.date,event.summary)
end
終日と時間指定のイベントについて
終日と時間指定のイベントの開始と終了の取得
取り方が違うので面倒くさい
- 終日のイベントの開始日と終了日の取得(時間指定のイベントの場合はnil)
event.start.date # => Stringクラス
event.end.date # => Stringクラス
- 時間指定のイベントの開始日時と終了日時の取得(nil)
event.start.date_time # => Timeクラス
event.end.date_time # => Timeクラス
終日と時間指定のイベントの検索について
終日イベントの開始/終了時刻はUTC扱い、
時間指定イベントの開始/終了時刻はローカル時刻で検索にひっかかるらしくややこしい。
-
例えば2014年5月23日終日イベントは以下の検索期間にひっかかる
-
開始 2014/05/23 00:00:00 UTC (2014/05/23 9:00:00 +9:00)
-
終了 2014/05/24 00:00:00 UTC (2014/05/23 9:00:00 +9:00)
-
時間指定だと指定したローカル時間内の検索でひっかかる