Calendar APIでGoogleカレンダーから情報を取得する

2021-03-07

プロジェクト作成

Google の API を利用するためには事前にプロジェクトの登録が必要です,

GCP Console からの操作も可能ですが,Python Quickstart | Calendar API | Google Developers のページで Step1 の Enable the Google Calendar API を押すと簡単に作成できます.

プロジェクトを作成したら,認証用のファイルである credentials.json をダウンロードしてルートディレクトリに置いておきます.

実装方法

Google Calendar API を用いて Python でカレンダーのイベントを取得します.カレンダーはいくつかあるので,全てのカレンダーのイベントをまとめて一つのリストにします.

Google カレンダーに接続するためには予め認証しておく必要があります.初めて実行するとブラウザで認証画面が表示されます.

セキュリティの問題でページが遷移できずに表示されない場合,詳細 をクリックすることで表示できます.どうしても開けない場合はターミナル上に表示されている URL で開くことも可能です.

from __future__ import print_function
from datetime import datetime
import os
import pickle
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scope, 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(port=0)
        # 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
    # 'Z' indicates UTC time
    now = datetime.utcnow().isoformat()+'Z'
    print('Getting the upcoming 10 events')

    res = service.calendarList().list().execute()
    calendars = [item['id'] for item in res['items']]
    events = []
    for calendar_id in calendars:
        events_res = service.events().list(
            calendarId=calendar_id,
            timeMin=now,
            maxResults=10,
            singleEvents=True,
            orderBy='startTime'
        ).execute()
        events += events_res['items']

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


if __name__ == '__main__':
    main()

実行するとイベントの日付と名前が表示されます.それ以外の情報が欲しい場合は JSON を出力して中身を見ればわかります,

また,些細な注意点ですが,Google Calendar APIに関連するファイルで calendar.py のような名前をつけると内部でエラーが発生するので,その他の適当な名前をつけてください.

参考