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上で以下の画面が起動する。
google accountでログインを実行すると、slack上にカレンダー情報がpostされる