🗓️

Google Calendar APIのセットアップと簡単なリクエスト操作

2022/01/24に公開

はじめに

Google Calendar APIを使用する機会があったのですが、GCP自体自分で触ることが初めてだったために有効化に時間がかかったのでメモとして記事を残します。

概要

言語 - Python
API - Google Calendar API

使用ライブラリ

本篇

  • APIの有効化
  • サービスアカウント作成
  • カレンダー作成
  • リクエスト操作

APIの有効化

プロジェクト作成後、画面左上ナビゲーションより[APIとサービス]>[ダッシュボード]>[APIとサービス]にアクセス。必要なAPIを選択して有効化。(今回は
Google Calendar APIを有効化)

サービスアカウント作成

予定の操作を行うためのサービスアカウントを作成する。

サービスアカウントとは

Google APIのデータを参照するための人間以外のアカウントのこと。
詳しくは公式ドキュメントを参照。

サービスアカウント作成

  1. ナビゲーション>[IAM と管理]>[サービスアカウント]>[サービスアカウントを作成]へアクセス。
  2. サービスアカウントに任意の名前をつけてアカウントを作成。(作成画面2,3は省略)
    serviceaccount

アカウントキー作成

デスクトップアプリケーションからのサービスアカウントの認証に必要なアカウントキーを作成する。

  1. ナビゲーション>[IAM と管理]>[サービスアカウント]>作成したサービスアカウントを選択
  2. [キー]>[鍵を追加]
  3. キーのタイプ[JSON]
  4. ファイル名を[credentials.json]に変更
    ※キーファイルの名前はプログラムと合わせられればなんでも良い

カレンダー作成

Google Calendarでリクエストを受ける用のカレンダーを準備します。

  1. [他のカレンダー]>[新しいカレンダーを作成]からカレンダーを作成
  2. [設定]>[特定のユーザーとの共有]に先ほど作成したサービスアカウントを追加する

以上でセットアップが完了。


リクエスト操作

リクエスト操作を試す。クイックスタートを参考にし、少し汎用性を持たせた。


config作成

先ほど作成したカレンダーの[設定]>[カレンダーの統合]からカレンダーIDをコピーし、CALENDAR IDと置換する。

config.json
{
    "scopes":"https://www.googleapis.com/auth/calendar",
    "id": "CALENDAR ID"
}

init設定

汎用的なパラメータは再利用するためにinitで設定。

calendarApi.py
class CalendarApi():
    def __init__(self):
        with open('config.json', 'r') as f:
            config = json.load(f)
            self.__calendarId = config["id"]

        SCOPES = [config["scopes"]]
        gapi_creds = load_credentials_from_file('credentials.json', SCOPES)[0]
        self.__service = build('calendar', 'v3', credentials=gapi_creds)

INSERT

新規予定挿入時に必要な最低限のパラメータは

  • 開始時刻
  • 終了時刻
  • 予定タイトル
    の3点。JSONの形式でリクエストを行う。
    ここでは省略するが、calendarDataとしてパラメータ用のインスタンスを設定。
calendarData.py
class CalendarBody():
    def createInsertData(self, data):
        body = {
            'summary':data.summary,
            'description': data.description,
            'start':{
                'dateTime': datetime.datetime(data.year, data.month, data.day, data.hour, data.minute).isoformat(),
                'timeZone': 'Japan'
            },
            'end': {
                'dateTime': datetime.datetime(data.year, data.month, data.day, data.hour+1, data.minute).isoformat(),
                'timeZone': 'Japan'
            },
        }
        return body

bodyを引数として受け取り、リクエストを実行。

calendarApi.py
def insert(self, body):
    result = self.service.events().insert(calendarId=self.calendarId, body=body).execute()
    return result

GET

指定の開始時刻・終了時刻・最大件数で情報を取得できる。
今回は現在時刻から一週間分・5件の予定を取得。

calendarApi.py
def get(self):
    # タイムゾーンAsia/Tokyoの生成
    JST = datetime.timezone(datetime.timedelta(hours=+9), 'JST')
    
    now = datetime.datetime.now(JST)
    period = now + datetime.timedelta(days=7)
    timeMax = datetime.datetime(period.year, period.month, period.day, 23, 59, tzinfo=JST)

    events_result = self.service.events().list(
        calendarId=self.calendarId, 
        timeMin=now.isoformat(),
        timeMax=timeMax.isoformat(),
        maxResults=5,
        singleEvents=True,
        orderBy='startTime'
    ).execute()
    
    events = events_result.get('items', [])
    print(events)

DELETE

deleteに必要なパラメータはCalendarIdEventIdのみ。あらかじめEventIdを控えておくと便利。

calendarApi.py
def insert(self, body):
    result = self.service.events().delete(calendarId=self.calendarId, eventId=eventId).execute()

以上。


おわりに

今回使ったコードを上げました。
https://github.com/Kahra029/sample-google-calendar-api
次はこれを使用してdiscord経由で予定の追加・確認ができるbotを作ろうと思います。

Discussion