Slackbotを使ってTodoistの予定を取得する方法を紹介します。
SlackとTodoistについては既に連携機能が存在します。
しかし、できることはタスクやプロジェクトの追加など多くはありません。自作でAPIを実装することでより自分の用途に合った機能のBotを作成することができます。
まずはSlackbotとTodoistを連携してみて足りないと思った部分があれば自分でAPIを開発することも考えてみましょう。
SlackbotのPythonでの実装については「SlackbotをPythonで作成しよう」をお読みください。
TodoistのAPIについては「Todoistの情報をPythonで取得する」をお読みください。
関連記事>>SlackとTodoistを連携する
※2019/11/3 API v8に対応したコードに修正しました。
API v8については「Todoist API v8の主な変更点と対応方法」をお読みください。
※毎日や曜日の処理を追加したらかなり長くなってしまったので調整予定。
目次
SlackbotでTodoistの予定を確認するには?
Todoistの予定を確認するためにはAPIトークンと呼ばれるキーを使ってアクセスし、予定を取り出します。
取り出した予定の中から表示したい範囲のタスクを抽出します。
APIトークンの確認方法については「Todoistの情報をPythonで取得する」の「TodoistのAPIトークンを取得する」の章をお読みください。
取得の際は格納されている時間はUTC時間であるため、日本時間との差分は考慮する必要があります。
「TodoistのAPIを使って今日の予定を確認する」にて作成したコードを使用します。
長いので本記事では割愛します。上記リンク先のコードをご参照ください。
※2019/11/3 v8に対応したコードに修正
SlackbotでTodoistの予定を取得する処理の実装
Botの仕様は以下の通りです。
・絵文字で「完了」、「未完了」がわかるようにする
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | from slackbot.bot import respond_to from TodoistApiController import TodoistItems from datetime import datetime from pytz import timezone import os @respond_to('^(.*)の予定$') def todoist_task_list(message, param_date): t = TodoistItems(os.environ['TODOIST_API_TOKEN']) if param_date == '今日': target_date = datetime.now().astimezone(timezone('Asia/Tokyo')).strftime('%Y/%m/%d') else: # 文字列型からdate型に変換 target_date = datetime.strptime(param_date, '%Y/%m/%d').astimezone(timezone('Asia/Tokyo')).strftime('%Y/%m/%d') output = "%sの予定n" % target_date texts = {} # 指定した日付のタスクを取得する items = t.find_by_date(target_date, False) for i, item in enumerate(items): key_check_due = t.key_check(item, 'due') # 取得したタスクを表示 if item['checked']: mark = ':white_check_mark:' else: # 繰り返しのタスクをチェック if key_check_due: if item['due']['is_recurring'] and target_date.replace('/', '-') not in item['due']['date']: mark = ':white_check_mark:' else: mark = ':white_square:' else: mark = ':white_square:' # date_langが「ja」かどうかチェック if key_check_due: if item['due']['lang'] == 'ja': if '毎週' in item['due']['string']: date, time = item['due']['string'].replace(' ', '').split('曜日') else: date, time = item['due']['string'].replace('月', '/').replace(' ', '').split('日') else: if 'every' in item['due']['string']: if 'at' in item['due']['string']: date, time = item['due']['string'].replace(' ', '').replace('sat', 'sa').split('at') else: date = item['due']['string'].replace(' ', '') time = '12:00' else: date, time = item['date_string'].replace('-', '/').split(' ') else: if item['date_lang'] == 'ja': if '毎週' in item['date_string']: date, time = item['date_string'].replace(' ', '').split('曜日') else: date, time = item['date_string'].replace('月', '/').replace(' ', '').split('日') # 「en」になってしまうケースがある else: if 'every' in item['date_string']: if 'at' in item['date_string']: date, time = item['date_string'].replace(' ', '').replace('sat', 'sa').split('at') else: date = item['date_string'].replace(' ', '') time = '12:00' else: date, time = item['date_string'].replace('-', '/').split(' ') items[i]['date'] = date items[i]['time'] = time if time == '': index = '_' + str(i) else: index = time + '_' + str(i) 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) |
◆参考記事
Python sortのまとめ (リスト、辞書型、Series、DataFrame)
以上、SlackでTodoistのタスクを表示する方法でした。
Slackbot+PythonまとめTOP>>Slackbotの作り方マニュアル〜Python編〜
Todoist+Pythonまとめ>>Todoist+Pythonの活用方法まとめ
◆関連記事
Todoistの情報をPythonで取得する
SlackbotでTodoistのタスクを完了済みにする〜PythonでのBot開発〜