目的
プロジェクトにGoogleの非公開カレンダーを使ってスケジュールを管理と検査できたら便利だと思います。
GoogleカレンダーのAPIを使って実装して、googleカレンダーの情報を取得する。
環境
- ruby 2.2.0
- jwt 1.5.6
- google-api-client 0.8.2
- Googleカレンダーを有効にしたGoogleアカウント
手順
- google-api-ruby-clientのインストール
- google APIの有効とAPIキーの取得
- OAuth認証を行い、アクセストークンを取得する
- いざ、rubyを実行
手順詳細
google-api-ruby-clientのインストール
$ sudo gem install google-api-client -v 0.8.2
$ gem install jwt
google APIの有効とAPIキーの取得
- google calendar API を有効にする
a.取得に使うGoogleアカウントでログイン
b.Google Developers Consoleにアクセス
- APIプロジェクトを作成
- プロジェクト作成
- ライブラリで「calendar API」を選択
- 「有効にする」
- 「認証情報を作成」
- API を呼び出す場所を選択して、アクセスするデータの種類を選択
「必要な認証情報」をクリック
- 承認済みのJavaScript生成と承認済みのリダイレクトURIに http://localhost と入力する
- ユーザーに表示するサービス名を入力
- ダウンロードする
- ダウンロードしたファイルを開く
- 以下のURLにクエリパラメータを追加してブラウザでアクセスする
- 例:
URLの作り方:
https://accounts.google.com/o/oauth2/auth
?client_id=[4で取得したクライアントID]
&redirect_uri=[4で設定したリダイレクトURI]
&scope=https://www.googleapis.com/auth/calendar (使用したいサービスのAPIにスコープする。今回はGoogle calendar)
&response_type=code (認証をコードとして出力)
&approval_prompt=force (認証をスキップしない)
&access_type=offline (オフラインでAPIを使用=リフレッシュキーを発行)
実際に送る値:
https://accounts.google.com/o/oauth2/auth
?
client_id=XXXXXX667179oih33og92nlceas12ml8fj3ind908pqo.apps.googleusercontent.com
&redirect_uri=http://localhost
&scope=https://www.googleapis.com/auth/calendar
&response_type=code
&approval_prompt=force
&access_type=offline
- このURLをブラウザで開いて、許可をクッリク
curl -d client_id=[クライアントID] -d client_secret=[クライアントシークレット] -d redirect_uri=[リダイレクトURI] -d grant_type=authorization_code -d code=[認証コード] https://accounts.google.com/o/oauth2/token
実際の値
curl -d client_id=873318XXXXXX-oih33og92nlceas12ml8fj3ind908pqo.apps.googleusercontent.com -d client_secret=Cmnivu7p0n0Eu-Vh9hXXXXXX -d redirect_uri=http://localhost -d grant_type=authorization_code -d code=4/CunxpeI-4a0m4DbzzHXB3p6KqrgZ1LadJxqXXXXXX# https://accounts.google.com/o/oauth2/token
- 最後はタミナールで結果が出る:
saikaba-no-MacBook-Pro:~ saika$ curl -d client_id=24623609xxxx-0imbk0qddki4vbrgeatc4ajbrusm3qpq.apps.googleusercontent.com -d client_secret=pibyRurb-g5A481CgECJ6S7I -d redirect_uri=http://localhost -d grant_type=authorization_code -d code=4/wNpZAUqMvxHH-lz6yXzNuK8Zrjju8vGvhDs-XXXXXXX# https://accounts.google.com/o/oauth2/token
{
"access_token" : "ya29.GlueBFADQXRYB7u_Dd5Zc7bDaLzCImsJNRP2lmWzKzvLM2LA2MaDQQyIzPInAC4AnFHANKxXwkkaOM93JQvgzQ-drFY-07wc2pQ8BzZ3Q-ANHRG0QXXXXXXXXX",
"expires_in" : 3600,
"refresh_token" : "XXXXXXRqVbNNuJRCP34MLr2U9RV7U91zpY6DlXXXXXX",
"token_type" : "Bearer"
}saikaba-no-MacBook-Pro:~ saika$
ruby実装
- gemfile:
source 'https://rubygems.org'
gem 'google-api-client', '0.8.2'
gem 'googleauth'
gem 'dotenv'
- .env
CLIENT_ID=24623609xxxx-0imbk0qddki4vbrgeatc4ajbrusm3qpq.apps.googleusercontent.com
CLIENT_SECRET=pibyRurb-g5A481CgXXXXXX
SCOPE=https://www.googleapis.com/auth/calendar
REFRESH_TOKEN=1/IEmRqVbNNuJRCP34MLr2U9RV7U91zpY6DljgXXXXXX
ACCESS_TOKEN=ya29.GlueBFADQXRYB7u_Dd5Zc7bDaLzCImsXXXXXXXzKzvLM2LA2MaDQQyIzPInAC4AnFHANKxXwkkaOM93JQvgzQ-drFY-07wc2pQ8BzZ3Q-ANHRG0QXXXXXXXXX
- calendar.rb
# Initialize the client & Google+ API
require 'google/api_client'
require 'time'
require 'dotenv'
# Initialize OAuth 2.0 client
# authorization
client = Google::APIClient.new(application_name: '')
Dotenv.load
client.authorization.client_id = ENV['CLIENT_ID']
client.authorization.client_secret = ENV['CLIENT_SECRET']
client.authorization.scope = ENV['SCOPE']
client.authorization.refresh_token = ENV['REFRESH_TOKEN']
client.authorization.access_token = ENV['ACCESS_TOKEN']
cal = client.discovered_api('calendar', 'v3')
# comfirm the time from user
printf('カレンダーを表示する年(20XX):')
year = gets.strip.to_i
printf('カレンダーを表示する月(1-12):')
month = gets.strip.to_i
# place the time from user
time_min = Time.utc(year, month, 1, 0).iso8601
time_max = Time.utc(year, month, 31, 0).iso8601
# get the event
params = { 'calendarId' => 'primary',
'orderBy' => 'startTime',
'timeMax' => time_max,
'timeMin' => time_min,
'singleEvents' => 'True' }
result = client.execute(api_method: cal.events.list,
parameters: params)
# place the event
events = result.data.items
# puts
events.each do |event|
printf("%s,%s,%s\n", event.start.dateTime, event.end.dateTime, event.summary)
end
実装:
参考: