Google Calendarの予定をPython3から取得する

#はじめに
先日ラズパイでキオスク端末つくったので，そこに予定を表示してみたい．というわけでGoogleカレンダーの予定をPythonから取得してみる．

#環境

* Python3.6
* Windows (Anaconda) →開発とログイン・認証用
* Raspberry Pi3 (Raspbian) →キオスク端末
* ブラウザとGoogleアカウント

#手順
ラズパイのブラウザでは上手く認証ができなかったので，後述する***4．ブラウザでの認証（初回限定）***まではWindowsで作業を行った．
##1. Google API Consoleの設定
[Python Quickstart](https://developers.google.com/calendar/quickstart/python?hl=ja)を見ながら進めていく．

[Google API Console](https://console.cloud.google.com)にアクセスすると下の画面が出てくる．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/1261fcd9-da59-5516-5e4c-8c7284c161d0.png)
画面の左上のほうにある「プロジェクトの選択」→「新しいプロジェクト」の順にクリックする．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/b50b8ef6-b220-cd71-edc0-1c1bc3d33efa.png)![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/bd969595-39d2-718e-e4c0-69c61f918d8d.png)
プロジェクト名は必須なので適当につけておく．組織と場所は選択しなくてもいい．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/3dbd7a68-d4c4-ace5-426c-013d8bd2dba9.png)
こんな感じの画面が出てきたら「APIとサービスを有効化」をクリックする．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/a9d65ce7-8de8-4886-4cbf-bc176abf8eee.png)
Google Calendar APIを選択して有効化する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/7caa2c06-8dd9-d25f-f292-fc1ba0480db3.png)

最後に認証用のファイルを用意する．
「認証情報」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/909e13a5-0fa1-073e-bdd9-5e98f83f6239.png)
続いて「認証情報を作成」の下矢印クリックで出てくる「OAuthクライアントID」を選択する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/54df92f3-2dbc-6d5a-a7db-411f8fb0c5bf.png)
次は「その他」を選択し適当に名前を付ける．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/e90676a9-f747-50c8-5409-fa4f38b3810c.png)
これで認証情報の作成は完了．認証用のjsonを右端のボタンからダウンロードする．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/382909/35acd104-a27b-a1b8-b535-95500fe86762.png)
ここでダウンロードしたjsonファイルの名前を`credentials.json`に変更しておく．

##2．必要なライブラリの準備
準備と言ってもpip一発で終わる．

```
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
```

##3．サンプルコードの実行
さっき用意した`credentials.json`と同じディレクトリに以下のコードを置く．

```python:quickstart.py
from __future__ import print_function
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']

def main():
    """Shows basic usage of the Google Calendar API.
    Prints the start and name of the next 10 events on the user's calendar.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('calendar', 'v3', credentials=creds)

    # Call the Calendar API
    now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
    print('Getting the upcoming 10 events')
    events_result = service.events().list(calendarId='primary', timeMin=now,
                                        maxResults=10, singleEvents=True,
                                        orderBy='startTime').execute()
    events = events_result.get('items', [])

    if not events:
        print('No upcoming events found.')
    for event in events:
        start = event['start'].get('dateTime', event['start'].get('date'))
        print(start, event['summary'])

if __name__ == '__main__':
    main()
```

で，実行する．

```
python quickstart.py
```

##4．ブラウザでの認証（初回限定）
実行するとブラウザの画面が開くはず．そこでログインして認証が完了する．次回以降は`quickstart.py`と同じ場所に生成される`token.pickle`というファイルが`credentials.json`とともに認証に利用され，ログインを求められることはない．

これでカレンダーを利用したプログラムは書けるようになっているはず．次の項目ではキオスク本体(Raspberry Pi3)への配置について記述していますが，必要ない場合は無視してください．

##5．Raspberry Pi3へコピー（必要な人向け）
ここまでに使った２つの認証ファイル`credentials.json`と`token.pickle`を丸ごとコピーするだけ．他の環境にコピーする際もこれでいけるはず．

#最後に
次はキオスクに天気APIも連携させてみたい。

#参考
[Python Quickstart](https://developers.google.com/calendar/quickstart/python?hl=ja)
[OAuth認証でGoogle Calendar APIに接続する（python編）](https://dev.classmethod.jp/cloud/google-calendar-api-get-start/)