RubyでGoogle Calendar APIを使えるようにするための設定

# はじめに

GoogleCalendarの情報を取得してRubyで何かプログラムを作りたいと思い、その時のGoogle側の設定が少しややこしかったので記録します。

# 前提

- Googleアカウントを持っている
- macOS
- Ruby 2.0以上が実行できる環境 ([公式ページより](https://developers.google.com/calendar/api/quickstart/ruby))


# 設定手順

大まかな流れは以下の通りです。

- GCPのコンソールを使えるようにする
- GCP内でプロジェクトを作成
- Google Calendar APIの有効化
- OAuth 同意画面の設定
- OAuth 2.0 クライアント IDの作成
- Ruby quickstart で動作確認

# GCPのコンソールを使えるようにする

以下画面にアクセスしてトップ画面を開きます。

https://console.cloud.google.com/getting-started


# GCP内でプロジェクトを作成

トップページの`プロジェクトの選択`を選び任意の名前でプロジェクトを作成します。
例）`GoogleCalendarAPI`
場所はデフォルトで`組織なし`にします。

![スクリーンショット 2022-02-21 20.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/01518caa-90cc-69ce-6b8a-47e9560ec7be.png)


![スクリーンショット 2022-02-21 20.18.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/5a25eb0c-dde5-d6e0-02bc-7f7fef084b3e.png)


# Google Calendar APIの有効化

コンソールのトップページに戻り、`APIとサービス` -> `有効なAPI とサービス`を選択します。

![スクリーンショット 2022-02-22 22.13.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/7a1526aa-5304-68f4-a4ba-50c15d72d726.png)


作成したプロジェクトを選択して`＋APIとサービスの有効化`を選択します。

![スクリーンショット 2022-02-22 22.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/a91a0a2d-9988-84f6-6fc6-50126d071193.png)

`Google Calendar API`を検索して選択し、有効化します。
(GoogleCalendarなどで検索すると表示します。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/49bdf5e7-320f-23a5-589d-2513e6dc550e.png)



# OAuth 同意画面の設定

`APIとサービス` -> `OAuth 同意画面の設定`を選択します。

![スクリーンショット 2022-02-22 17.24.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/7249c016-2ac0-6aaf-5dd3-4f4be66d94b6.png)

User Typeを外部に選択して`作成`を選択します。

![スクリーンショット 2022-02-22 17.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/eb33f14e-be95-2505-975b-817aabfbf42d.png)

`アプリ名`、`ユーザーサポートメール`、`デベロッパーの連絡先情報`を入力して`保存して次へ`を選択してください。
例）`アプリ名` : `google-calendar-api-app`
(`GoogleCalendarAPIApp`のようなパスカルケースはエラーになり先に進めなかったので注意してください。)

![スクリーンショット 2022-02-22 17.39.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/be4164eb-224c-56f3-3be2-963dc2493441.png)


![スクリーンショット 2022-02-22 17.34.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/cfd91f29-55af-c49d-0b87-96ccbb27392d.png)

②スコープは特に設定せず`保存して先へ進む`を選択します。
![スクリーンショット 2022-02-22 17.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/9b4e22f8-67c8-e08f-1850-7c5d8c635209.png)

![スクリーンショット 2022-02-22 18.11.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/4561ccc9-2f21-ae71-5e9f-8e2119773cd4.png)


③テストユーザは自分のメールアドレスを設定して`保存して先へ進む`を選択します。

![スクリーンショット 2022-02-22 19.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/176affc6-3749-6802-4d43-3ca924a6fd25.png)


④概要まできたら設定終了、`ダッシュボードに戻る`を選択します。

![スクリーンショット 2022-02-22 18.18.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/862f2c1d-dbbf-c10a-a65d-b961607fcc97.png)

公開ステータスを`テスト`に設定します（手順通り行えばデフォルトでテストになっているはずです。）
`テスト`ステータスにすると登録したテストユーザのみ使用できる状態になります。
自分しか使わない場合はこの設定で十分だと思います。


![スクリーンショット 2022-02-22 19.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/1a1d8925-e6da-5b45-2258-2ccf99bfc5a1.png)


# OAuth 2.0 クライアント IDの作成

左メニューの`認証情報`を選択します。

![スクリーンショット 2022-02-22 18.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/ba13439a-8b25-81cc-b45e-b37465f6e9cc.png)

`＋認証情報を作成`-> `OAuthクライアントID`を選択します。

![スクリーンショット 2022-02-22 18.22.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/719f0c85-ad1e-673b-9ab7-30fa504f3bbf.png)


アプリケーションの種類を`デスクトップアプリ`を選択します。
任意の名前を入力して`作成`を選択します。（例：`GoogleCalendarAPI_Client`）

![スクリーンショット 2022-02-22 18.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/b916c752-eb17-f852-9659-44817ef71c80.png)

OAuthクライアントが作成されます。
ここでクライアントの情報を取得するため`JSONをダウンロード`を選択します。
（後に使います。）

![スクリーンショット 2022-02-22 18.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/65437bec-5768-0624-28ec-497490ebcc1c.png)

# Ruby quickstart で動作確認

以下を参考にします。
https://developers.google.com/calendar/api/quickstart/ruby

適当に作業用フォルダを作ります。

```terminal
mkdir google-cal
```


GoogleCalendarAPIが使われているか確認するために`quickstart.rb`を作成します。
`quickstart.rb`の内容は公式ページを引用します。

```terminal
cd google-cal
touch quickstart.rb
```


```ruby:quickstart.rb
require "google/apis/calendar_v3"
require "googleauth"
require "googleauth/stores/file_token_store"
require "date"
require "fileutils"

OOB_URI = "urn:ietf:wg:oauth:2.0:oob".freeze
APPLICATION_NAME = "Google Calendar API Ruby Quickstart".freeze
CREDENTIALS_PATH = "credentials.json".freeze
# The file token.yaml stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
TOKEN_PATH = "token.yaml".freeze
SCOPE = Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY

##
# Ensure valid credentials, either by restoring from the saved credentials
# files or intitiating an OAuth2 authorization. If authorization is required,
# the user's default browser will be launched to approve the request.
#
# @return [Google::Auth::UserRefreshCredentials] OAuth2 credentials
def authorize
  client_id = Google::Auth::ClientId.from_file CREDENTIALS_PATH
  token_store = Google::Auth::Stores::FileTokenStore.new file: TOKEN_PATH
  authorizer = Google::Auth::UserAuthorizer.new client_id, SCOPE, token_store
  user_id = "default"
  credentials = authorizer.get_credentials user_id
  if credentials.nil?
    url = authorizer.get_authorization_url base_url: OOB_URI
    puts "Open the following URL in the browser and enter the " \
         "resulting code after authorization:\n" + url
    code = gets
    credentials = authorizer.get_and_store_credentials_from_code(
      user_id: user_id, code: code, base_url: OOB_URI
    )
  end
  credentials
end

# Initialize the API
service = Google::Apis::CalendarV3::CalendarService.new
service.client_options.application_name = APPLICATION_NAME
service.authorization = authorize

# Fetch the next 10 events for the user
calendar_id = "primary"
response = service.list_events(calendar_id,
                               max_results:   10,
                               single_events: true,
                               order_by:      "startTime",
                               time_min:      DateTime.now.rfc3339)
puts "Upcoming events:"
puts "No upcoming events found" if response.items.empty?
response.items.each do |event|
  start = event.start.date || event.start.date_time
  puts "- #{event.summary} (#{start})"
end
```

前述でダウンロードしたjsonファイルを`credentials.json`に名前を変えて`quickstart.rb`と同じディレクトリに置きます。

```:google-calディレクトリ
google-cal
├── credentials.json
└── quickstart.rb
```

`ruby quickstart.rb`を実行すると認証用のURLが表示されれますのでブラウザで開くきます。

```terminal
ruby quickstart.rb                                                                                                                                                                             
Open the following URL in the browser and enter the resulting code after authorization:
https://accounts.google.com/o/oauth2/auth?XXXXXXXXXXXXXX
```

自分のGoogleアカウントでログインをします。

![スクリーンショット 2022-02-22 22.26.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/709a41fb-e1f2-d652-6c03-76a875127745.png)

以下の画面が表示されますので、`続行`を選択します。

![スクリーンショット 2022-02-22 22.28.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/863d0174-8237-2bd5-af0c-98ebc61b6d38.png)

さらに以下の画面が表示されますので、`続行`を選択します。

![スクリーンショット 2022-02-22 22.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/4c840e56-6b00-1625-b569-f303f525521c.png)

するとコードが表示されますのでコピーしておきます。

![スクリーンショット 2022-02-22 22.30.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/82038da0-4a0d-6b2c-dd8c-57d154ebd895.png)


ターミナに戻りコードを入力すると以下のような形式でGoogleCalendarに予定された情報が出力されます。

```
Open the following URL in the browser and enter the resulting code after authorization:
https://accounts.google.com/o/oauth2/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
[コードを入力する]
Upcoming events:
- XXXXXXXXX (2022-03-11T19:00:00+09:00)
- XXXXXXXXX (2022-03-15T18:00:00+09:00)
```

予定がない場合は以下のような表示になります。

```
Upcoming events:
No upcoming events found
```

これでRubyでGoogleCalendarAPIが使える環境が整いました:grin:
あとはquickstart.rbを変更すれば自分の好きなプログラムが作れると思います。

色々と改造したい場合は以下のリファレンスが参考になります。

https://googleapis.dev/ruby/google-api-client/latest/Google/Apis/CalendarV3.html