質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2189閲覧

GoogleCalendarAPIを用いてDiscordからカレンダーを操作するBotの作成

Arisa.Sunagawa

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/05/10 19:26

PythonによるGoogleカレンダーの削除

目的:discordにて何らかの投稿があったときに、投稿内の日付を取得しカレンダーを操作する。
現在の目標:固定の日付、名前のカレンダーイベントを追加/削除する
状態:service.events().delete(calendarId=self.__CARENDAR_ID,eventId=eventid.execute()にてカレンダーの削除に失敗する。

発生している問題・エラーメッセージ

Ignoring exception in on_message Traceback (most recent call last): File "C:\Users[User名]\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\client.py", line 255, in _run_event await coro(*args, **kwargs) File "C:\Users[User名]\Desktop\Bot\2\main.py", line 111, in on_message calendar.del_calendar_event('test2', '2019-05-11T21:00:00+09:00', '2019-05-11T23:00:00+09:00') File "C:\Users[User名]\Desktop\Bot\2\google_calendar.py", line 98, in del_calendar_event eventId=eventid File "C:\Users[User名]\AppData\Local\Programs\Python\Python37-32\lib\site-packages\googleapiclient\_helpers.py", line 130, in positional_wrapper return wrapped(*args, **kwargs) File "C:\Users[User名]\AppData\Local\Programs\Python\Python37-32\lib\site-packages\googleapiclient\http.py", line 851, in execute raise HttpError(resp, content, uri=self.uri) googleapiclient.errors.HttpError: <HttpError 404 when requesting https://www.googleapis.com/calendar/v3/calendars/[GoogleID]%40gmail.com/events/MmFjbXMwZWVrbnFxMXNiZm0yMzRkdjlxMWsgZGlnaXRhbGxpYnJhcnlmb3JtZUBt? returned "Not Found">

該当のソースコード

カレンダー操作クラス

Python

1import datetime 2import pickle 3import re 4import os.path 5from googleapiclient.discovery import build 6from google_auth_oauthlib.flow import InstalledAppFlow 7from google.auth.transport.requests import Request 8 9class google_calendar: 10 # カレンダーへのRW権限(スコープ)を変更する 11 # 変更する際はtoken.pickleを削除すること 12 __SCOPES = ['https://www.googleapis.com/auth/calendar'] 13 14 # 変更する対象のカレンダー 15 __CARENDAR_ID = '[カレンダーID]' 16 17 # 東京でのUTCとの誤差 18 __ERR_UTC_TOKYO = 9 19 20 # 時間の出力フォーマット 21 __FORMAT_TIME = '%Y-%m-%dT%H:%M:%S%z' 22 23 def __init__(self):#インスタンス変数管理 24 pass 25 26 def connect(self): 27 ''' # token.pickleを初期作成する際は外すこと。 28 creds = None 29 # token.pickleファイルには、ユーザーのアクセストークンと更新トークンが格納されています。 30 # 許可フローが最初に完了したときに自動的に作成されます。 31 32 # token.pickleの読み込み 33 if os.path.exists('token.pickle'): 34 with open('token.pickle', 'rb') as token: 35 creds = pickle.load(token) 36 37 # token.pickleの読み込み失敗時 38 # 利用可能な(有効な)認証情報がない場合は、ユーザーにログインさせます。 39 if not creds or not creds.valid: 40 ## ここ何の処理? 41 if creds and creds.expired and creds.refresh_token: 42 # ブラウザのリフレッシュ 43 creds.refresh(Request()) 44 45 # ブラウザで認証URLを開く 46 else: 47 flow = InstalledAppFlow.from_client_secrets_file( 48 'credentials.json', SCOPES) 49 creds = flow.run_local_server() 50 51 # 次回の実行のために資格情報を保存します 52 with open('token.pickle', 'wb') as token: 53 pickle.dump(creds, token) 54 ''' 55 56 # token.pickleの読み込み'(token.pickleを作成する際はコメントアウトすること) 57 with open('token.pickle', 'rb') as token: 58 creds = pickle.load(token) 59 60 # カレンダーAPIとの接続 61 service = build('calendar', 'v3', credentials=creds) 62 63 return service 64 65 def add_calendar_event(self, summary, start_time, end_time): 66 # APIとの接続 67 service = self.connect() 68 69 # カレンダ情報の格納 70 body = {'summary': summary, 71 'start': { 'dateTime': start_time, 72 'timeZone': 'Asia/Tokyo', 73 }, 74 'end': { 'dateTime': end_time, 75 'timeZone': 'Asia/Tokyo', 76 }, 77 'attendees': '', 78 } 79 80 # カレンダへイベントの追加 81 event = service.events().insert( 82 calendarId=google_calendar.__CARENDAR_ID, 83 body=body 84 ).execute() 85 86 def del_calendar_event(self, summary, start_time, end_time): 87 # APIとの接続 88 service = self.connect() 89 90 # イベントIDの取得 91 eventid = self.get_calendar_event(summary, start_time, end_time) 92 93 print(eventid) 94 95 # カレンダのイベントを削除 96 service.events().delete( 97 calendarId=self.__CARENDAR_ID, 98 eventId=eventid 99 ).execute() 100 101 def get_calendar_event(self, summary, start_time, end_time): 102 # APIとの接続 103 service = self.connect() 104 105 eventid = 0 106 page_token = None 107 108 # カレンダーの取得 109 while True: 110 events = service.events().list( 111 calendarId=google_calendar.__CARENDAR_ID, 112 pageToken=page_token 113 ).execute() 114 115 # 日付データ文字(引数)を置換 116 startTime = datetime.datetime.strptime(start_time,self.__FORMAT_TIME) 117 endTime = datetime.datetime.strptime(end_time,self.__FORMAT_TIME) 118 119 # イベントの検索 120 for event in events['items']: 121 start = event['start'] 122 end = event['end'] 123 124 # 日付と卓名が一致したら、それを返却 125 if event['summary'] == summary and datetime.datetime.strptime(start['dateTime'],self.__FORMAT_TIME) == startTime and datetime.datetime.strptime(end['dateTime'],self.__FORMAT_TIME) == endTime: 126 temp = event['htmlLink'].split('eid=') 127 eventid = temp[1] 128 break 129 130 # 次イベントの取得 131 page_token = events.get('nextPageToken') 132 133 # 読むイベントがなくなったら終了 134 if not page_token: 135 break 136 137 # idの返却 138 return eventid 139

メイン関数

python

1import discord 2import re 3import dicebot 4 5### 自作サブルーチンファイル ### 6import google_calendar 7 8### 定数宣言 ### 9# BOTのトークン 10TOKEN = '[BOTトークン]' 11 12if __name__ == '__main__': 13 14 # クラスの呼び出し 15 calendar = google_calendar.google_calendar() 16 client = discord.Client() 17 18 # 起動時のイベントハンドラ 19 @client.event 20 async def on_ready(): 21 print('Logged in as') 22 print(client.user.name) 23 print(client.user.id) 24 print('------') 25 26 ### Botへのコマンド送信時の動作 ### 27 @client.event 28 async def on_message(message): 29 com = message.content 30 31 # カレンダー系(試験用) 32 elif re.match('$cadd1', com): 33 calendar.add_calendar_event('test', '2019-05-11T21:00:00', '2019-05-11T23:00:00') 34 send_ms = 'カレンダーを追加' 35 await message.channel.send(send_ms) 36 37 elif re.match('$cadd2', com): 38 calendar.add_calendar_event('test2', '2019-05-11T21:00:00', '2019-05-11T23:00:00') 39 send_ms = 'カレンダーを追加' 40 await message.channel.send(send_ms) 41 42 elif re.match('$cdel', com): 43 calendar.del_calendar_event('test2', '2019-05-11T21:00:00+09:00', '2019-05-11T23:00:00+09:00') 44 send_ms = 'カレンダーを削除' 45 await message.channel.send(send_ms) 46 47 elif re.match('$csearch', com): 48 send_ms = calendar.get_calendar_event('test2', '2019-05-11T21:00:00+09:00', '2019-05-11T23:00:00+09:00') 49 await message.channel.send(send_ms) 50 51 client.run(TOKEN)

試したこと

1.discordにて$cadd1,$cadd2を入力し、カレンダーイベントを2つ追加する
2.$csearchを入力し、カレンダーイベントのIDを取得する。
3.$cdelを入力し、対象のカレンダーを削除する。

このとき追加/特定カレンダーイベントの取得までは行えたのですが、削除が行えなず困っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

delに渡すイベントIDはhyperlinkではなくidでした。

投稿2019/05/11 12:46

編集2019/05/11 12:46
Arisa.Sunagawa

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問