Ruby
OAuth
GoogleCalendarAPI

MacでRuby+Googleカレンダーの情報を取得する

目的

プロジェクトに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にアクセス

https://console.developers.google.com

  • APIプロジェクトを作成

スクリーンショット 2017-09-16 15.31.09.png

  • プロジェクト作成

スクリーンショット 2017-09-16 15.32.09.png

  • ライブラリで「calendar API」を選択

スクリーンショット 2017-09-16 15.41.53.png

  • 「有効にする」
    スクリーンショット 2017-09-16 15.43.07.png

  • 「認証情報を作成」

スクリーンショット 2017-09-16 15.44.53.png

  • API を呼び出す場所を選択して、アクセスするデータの種類を選択

「必要な認証情報」をクリック

スクリーンショット 2017-09-16 15.47.19.png

  • 承認済みのJavaScript生成と承認済みのリダイレクトURIに http://localhost と入力する

スクリーンショット 2017-09-16 15.49.03.png

  • ユーザーに表示するサービス名を入力

image.png

  • ダウンロードする

image.png

  • ダウンロードしたファイルを開く

image.png

  • 以下のURLにクエリパラメータを追加してブラウザでアクセスする

https://accounts.google.com/o/oauth2/auth

  • 例:

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をブラウザで開いて、許可をクッリク

image.png

  • 画面自体は表示されないが、検索窓に返ってくるcode=以下をコピー
    image.png

  • ターミナル上でIDとURIやキー等を用いて以下のようなコマンドを実行する

  • 例:

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

実装:

image.png

参考:

http://qiita.com/iwaseasahi/items/2363dc1d246bc06baeae