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プロジェクトを作成

<img width="751" alt="スクリーンショット 2017-09-16 15.31.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/197386/23ca2922-1c15-15a0-d297-1b5dbb2714f1.png">


- プロジェクト作成


![スクリーンショット 2017-09-16 15.32.09.png](https://qiita-image-store.s3.amazonaws.com/0/197386/2a242146-352f-a521-308d-c2aabcaa58fe.png)


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

<img width="703" alt="スクリーンショット 2017-09-16 15.41.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/197386/724940a4-3898-d83e-3241-fd87a9995238.png">


- 「有効にする」
<img width="869" alt="スクリーンショット 2017-09-16 15.43.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/197386/48e74fd9-bd1f-0233-1e9e-dc02fa4460ea.png">


- 「認証情報を作成」

<img width="867" alt="スクリーンショット 2017-09-16 15.44.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/197386/f42f4670-c8d1-53f7-c7b0-482aa7109880.png">


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

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

<img width="790" alt="スクリーンショット 2017-09-16 15.47.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/197386/62da1307-42ad-da26-0552-381e47def4ed.png">


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

![スクリーンショット 2017-09-16 15.49.03.png](https://qiita-image-store.s3.amazonaws.com/0/197386/d9dd5c8c-2a14-cce9-e5fd-508ac2bfebfe.png)


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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/c86822a3-4610-46b9-68d7-97f0101a7319.png)



- ダウンロードする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/783cf864-c6bf-1ae2-cbe8-9984509ae661.png)


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


![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/3019a18d-7dd1-0345-cbbc-98b222bd2aa5.png)


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

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

- 例：

URLの作り方：

```
https://accounts.google.com/o/oauth2/auth
?client_id=[4で取得したクライアントID]
&redirect_uri=[４で設定したリダイレクト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](https://qiita-image-store.s3.amazonaws.com/0/197386/85c210d3-c948-d767-3ccf-74cdf07f03f9.png)

- 画面自体は表示されないが、検索窓に返ってくる`code=`以下をコピー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/40b45887-88d2-7d49-039d-f7ec540fd1fb.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:

```ruby

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


``` ruby
# 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](https://qiita-image-store.s3.amazonaws.com/0/197386/a8907705-cbb1-84dc-75c6-e1e95bd4e9d0.png)


参考：

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