SlackとTodoistは連携機能がありますが、できることはタスクの追加くらいであまり多くありません。
より使い勝手のよいタスク管理をするためにTodoistのAPIを使って操作する必要があります。
そこで今回は、Slackbot+TodoistのAPIでタスク管理する方法を紹介します。
※PythonでのSlackbotの使い方については「SlackbotをPythonで作成しよう」
Python版のTodoistのAPIの使い方についてはTodoistの情報をPythonで取得する
※API v8に対応したコードに修正中です。
API v8については「Todoist API v8の主な変更点と対応方法」をお読みください。
【Python+Todoist】APIの基本的な使い方
TodoistのAPIから取得できるタスクの内容
TodoistのAPIから取得できる情報は以下のものがあります。
id | タスクのid |
---|---|
project_id | プロジェクトのID |
utc_date_time | 時差を決めるための世界標準時間。日本時間に補正が必要 |
date_string | 日本時間だが年がないのが欠点。たまに英語時間になる |
content | タスク名 |
Todositの今日のタスクをSlackbotから取得する方法
今日の予定を確認する方法については「SlackbotでTodoistの予定を確認する」にて詳しく説明しています。
Todositのタスクを完了済みにする方法
タスク名と日付から対象のタスクを見つけて完了済みにします。
同じ日に同じタスク名を使うことはないという前提です。
タスクの時間はUTC時間で保存されているため、日本時間に補正してから比較する必要があります。
複数ヒットした場合は最初の予定のみを完了済みにします。
◆使用するファイル
・bot.py(起動ファイル)
・slackbot_settings.py(設定ファイル)
・todoistmodules.py(今回修正するファイル)
・botmodules.py(今回修正するファイル)
タスクを完了するコードの実装例は以下の通りです。
◆Todoistコードの修正(todoistmodules.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | from todoist.api import TodoistAPI import os from pytz import timezone from datetime import datetime, timedelta import re class TodoistItems: # タスクを完了済みにするメソッド def completed(self, content, date): result = 'ng' # タスク名比較のマッチング処理 content_pattern = re.compile("^%s$" % content) # タスク分ループ for k, item in enumerate(self.api['items']): # ラベルと日付が一致したら完了済みにする if content_pattern.match(item['content']) and date == self.utc_to_ja(item['due_date_utc']): # 対象のタスクを完了する self.api.items.complete([(item['id'])]) # Todoistに反映する self.api.commit() result = 'ok' # 最初に見つけたタスクを完了済みにしたら終了 break return result # 日付からタスクを取得するメソッド def find_by_date(self, date): return [item for item in self.api['items'] if date == self.utc_to_ja(item['due_date_utc'])] # UTC時間を日本時間に変更する def utc_to_ja(self, utc_date): # 時間が入っていない時は何もしない if utc_date is None: return '' date_time = datetime.strptime(str(utc_date), '%a %d %b %Y %H:%M:%S +0000') + timedelta(hours=9) return date_time.strftime('%Y/%m/%d') |
◆Slackコードの修正(botmodules.py)
Todoistの完了メソッドを呼び出して完了済みにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | from slackbot.bot import respond_to from todoistmodules import TodoistItems from datetime import datetime from pytz import timezone @respond_to('^予定の完了s(.*)$') def todoist_today_completed(message, label): t = TodoistItems() now = datetime.now().astimezone(timezone('Asia/Tokyo')).strftime('%Y/%m/%d') # 予定を完了済みにする action = t.completed(label, now) # 結果をリアクションで返す message.react(action) # 正規表現を使えば日付も指定可能です @respond_to('^(.*)の予定の完了s(.*)$') def todoist_task_completed(message, date, label): t = TodoistItems() date = datetime.strptime(date, '%Y/%m/%d').astimezone(timezone('Asia/Tokyo')).strftime('%Y/%m/%d') # 予定を完了済みにする action = t.completed(label, now) # 結果をリアクションで返す message.react(action) # 予定の確認 @respond_to('^(.*)の予定$') def todoist_task_list(message, date): t = TodoistItems() # 文字列型からdate型に変換 date = datetime.strptime(date, '%Y/%m/%d').astimezone(timezone('Asia/Tokyo')).strftime('%Y/%m/%d') output = "%sの予定n" % date texts = {} # 指定した日付のタスクを取得する items = t.find_by_date(date) for k, item in enumerate(items): # 取得したタスクを表示 if item['checked']: mark = ':white_check_mark:' else: mark = ':white_square:' # date_langが「ja」かどうかチェック if item['date_lang'] == 'ja': date, time = item['date_string'].replace('月', '/').replace(' ', '').split('日') # 「en」になってしまうケースがある else: date, time = item['date_string'].replace('-', '/').split(' ') if time == '': index = '_' + str(k) else: index = time + '_' + str(k) print(index) param = {index: { 'mark': mark, 'time': time, 'subject': item['content'] }} texts.update(param) for k, v in enumerate(sorted(texts)): output += "%s %s %sn" % (texts[v]['mark'], texts[v]['time'], texts[v]['subject']) message.send(output) |
タスク一覧から対象のタスクをコピーします。
以上、SlackbotでTodoistのタスクを管理する方法でした。
Slackbot+PythonまとめTOP>>Slackbotの作り方マニュアル〜Python編〜