LoginSignup
21
21

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-16

目的

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

21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21