errbotからgoogle-calendar-apiを叩いて予定の一覧を取得する

はじめに

以下を参考にさせて頂いた

Python Quickstart  |  Calendar API  |  Google Developers

1. OAuth認証 JSONファイルのダウンロード

  • Google APIsにアクセスして「認証情報」を選択し、「OAuth同意画面」タブにて[「メールアドレス」、「ユーザに表示されるサービス名」を入力し、「保存」ボタンをクリック
  • 「認証情報」タブを選択し、「認証情報を作成」ボタンをクリックし、「OAuth クライアントID」を選択する
  • 「クライアントIDの作成」画面にて、「その他」を選択し、名前項目に適当な名前(今回はerrbotとした)を設定し、「作成」ボタンをクリックする
  • 「OAuth クライアント」画面が出力されるので、「OK」ボタンをクリック
  • 「認証情報」画面より、今回作成したkeyのfile_download (Download JSON)ボタンをクリックし、ファイルを保存する。ファイル名はclient_secret.jsonとする

2. Google Client Libraryのインストール

下記コマンドを実行する

$ pip install --upgrade google-api-python-client

3. errbot pluginを作成

pluginのフォルダ構成は以下。 また、client_secret.jsonをrootフォルダに配置する。

.
└── client_secret.json
└── plugins
    ├── GoogleCalendar
         ├── get_gcal.plug
         └── get_gcal.py

pluginファイルの作成

[get_gcal.plug]

[Core]
Name = Get_Gcal
Module = get_gcal

[Python]
Version = 2+

[Documentation]
Description = Example "get my GoogleCalendar" plugin

[get_gcal.py]

from __future__ import print_function
import httplib2
import os

from apiclient import discovery
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage

import datetime

from errbot import BotPlugin, botcmd

try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None

# If modifying these scopes, delete your previouly saved credenrials
# at ~/.credentials/calendar-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'errbot'


def get_credentials():
    """Gets valid user credentials from Storage

    If nothing has been stored, or if the stored credenrials are invalid
    the OAuth2 flow is completed to obtain the new credentials.

    Returns:
        Credenrials, the obtained credential.
    """
    home_dir = os.path.expanduser('~')
    credential_dir = os.path.join(home_dir, '.credenrials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir, 'calendar-python-quickstart.json')

    store = Storage(credential_path)
    credentials = store.get()
    if not credentials or credentials.invalid:
        flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
        flow.user_agent = APPLICATION_NAME
        if flags:
            credentials = tools.run_flow(flow, store, flags)
        else: # Need only for compatibolity with Python 2.6
            credentials = tools.run(flow, store)
        print('Storing credentials to ' + credential_path)
    return credentials


class get_gcal(BotPlugin):
    @botcmd
    def getGcal(self, msg, args):
        """Shows basic usage of the Google Calendar API

        Creates a Google Calendar API service object and outputs a list of next
        10 events on the user's a calendar
        """
        credentials = get_credentials()
        http = credentials.authorize(httplib2.Http())
        service = discovery.build('calendar', 'v3', http=http)

        now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
        eventsResult = service.events().list(
            # 下記calendaridは参照したいgoogle calendar idを設定
            calendarId='XXXXX', timeMin=now, maxResults=10, singleEvents=True,
            orderBy='startTime').execute()
        events = eventsResult.get('items', [])

        if not events:
            return 'No upcoming events found.'
        for event in events:
            #start = event['start'].get('dateime', event['start'].get('date'))
            try:
                event['start']['date']
            except KeyError:
                start = "{} {}".format(event['start']['dateTime'][:10], event['start']['dateTime'][11:16])
            else:
                start = event['start']['date']

            yield "{}: {}".format(start, event['summary'])

実行すると以下の認証画面が起動するので、googleアカウントでログインする

4. errbotの実行

slackで!getGcalを実行すると、Rasberry pi上で以下の画面が起動する。

f:id:yFujita:20180329230040p:plain

google accountでログインを実行すると、slack上にカレンダー情報がpostされる

f:id:yFujita:20180331104616p:plain