TodoistのPythonのAPI管理ライブラリ「todoist-python」を使って今日の予定を確認する方法を紹介します。
具体的には、
・TodoistのAPIで日付単位で取得する方法
・TodoistのAPIで今日の予定を取得する方法
の2つについてです。
「todoist-python」の基本的な使い方については「「todoist-python」ライブラリでタスクを取得する方法」をお読みください。
※2019/8/30にAPIバージョンがv8にアップデートされました。v7未対応のライブラリでは動作しないのでご注意ください。
v8の変更点については「TodoistのAPIのv8の主な変更点と対応方法」をお読みだくさい。
目次
TodoistのAPIで日付単位で取得する方法
とりあえず1日の予定を取ってくれば良い訳ですが、このAPIは管理している情報にも一癖あります。
◆取得したタスク情報の中身(v7)
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 | [Item({'all_day': False, 'assigned_by_uid': 21073174, 'checked': 1, 'collapsed': 0, 'content': 'タスク1', 'date_added': 'Wed 23 Jan 2019 00:59:39 +0000', 'date_completed': 'Wed 23 Jan 2019 06:03:31 +0000', 'date_lang': 'ja', 'date_string': '1月23日13:00 ', 'day_order': -1, 'due_date_utc': 'Wed 23 Jan 2019 04:00:00 +0000', 'has_more_notes': False, 'id': 3014512751, 'in_history': 0, 'indent': 2, 'is_archived': 0, 'is_deleted': 0, 'item_order': 8, 'labels': [], 'parent_id': 2988174601, 'priority': 1, 'project_id': 2202980407, 'responsible_uid': None, 'sync_id': None, 'user_id': 21073174}), ] |
いろいろ情報がありますが、「'content'」がタスク名で 「'date_string'」と「'due_date_utc'」が日付情報となります。
さて、日付は「'date_string'」から取りたいところなんですが、なんと年情報がありません。
流石に1年先のタスクはないと思いますが、何年も使っている場合は去年以前の情報を取ってきてしまう可能性があります。という訳で「'due_date_utc'」から取るのが良さそうです。
UTC時間(世界協定時)と呼ばれる時差を計算する時の基準となる時間です。日本時間はUTC時間に+9時間です。よってこの時差も考慮する必要があります。
◆取得したタスク情報の中身(v8)
v8から以下のフォーマットに変わりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Item({'assigned_by_uid': xxxxxxxx, 'checked': 0, 'child_order': 18, 'collapsed': 0, 'content': 'テスト', 'date_added': '2019-10-10T23:08:30Z', 'date_completed': None, 'day_order': -1, 'due': {'date': '2019-10-11', 'is_recurring': False, 'lang': 'ja', 'string': '10月11日', 'timezone': None}, 'id': 0000011111, 'in_history': 0, 'is_deleted': 0, 'labels': [], 'parent_id': None, 'priority': 1, 'project_id': 1111111111, 'responsible_uid': None, 'section_id': None, 'sync_id': None, 'user_id': 111111111})] |
v8の主な変更点
・dueプロパティの追加
・date_stringやdue_date_utcなどプロパティを削除
・その他プロパティ名を一部変更
わかりやすくなりましたが旧プロパティは削除するという暴挙に思い切った変更を行っています。
しかも旧プロパティはそのままなのでv8とv7以前のデータが混在している状況です。
v7以前のプロパティは残しておくといいことがないので新しいタスクを作り直した方がいいですね。
TodoistのAPIで今日の予定を取得する方法
実装内容は以下の通りです。
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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | import todoist import os from datetime import datetime, timedelta import pytz class TodoistItems: def __init__(self, token): # TodoistのAPI情報を取得 self.weekdays = { 0: ['mon', '月曜'], 1: ['tue', '火曜'], 2: ['wed', '水曜'], 3: ['thu', '木曜'], 4: ['fri', '金曜'], 5: ['sat', '土曜'], 6: ['sun', '日曜'], } self.api_token = token self.api = todoist.TodoistAPI(self.api_token) # 全タスク情報を取得 self.api.sync() # プロジェクト名を取得したメソッド def get_project_name(self, item): if self.key_check(item, 'project_id'): project_id = item['project_id'] else: project_id = item['parent_id'] project = self.api.projects.get_by_id(project_id) return project['name'] # 日付からタスクを取得するメソッド def find_by_date(self, date, remove_checked=True): return [item for item in self.api['items'] if # 今日のタスクを取得(有効なタスクのみ) self.active_check(item, remove_checked) and self.date_check(item, date)] # 有効なタスクを取得する def active_check(self, item, remove_checked=True): if self.key_check(item, 'is_archived'): is_archived = item['is_archived'] else: is_archived = True if remove_checked: return is_archived and item['checked'] == 0 and item['is_deleted'] == 0 date_time = datetime.now().strftime('%Y-%m-%d') if date_time in str(item['date_completed']) or item['date_completed'] is None: return is_archived and item['is_deleted'] == 0 return False # Keyがあるかチェックする def key_check(self, item, key): try: result = item[key] return result except: return False def date_check(self, item, date): # 新プロパティかチェック if self.key_check(item, 'due'): # 日本語の場合と英語の場合で処理を分ける if item['due']['lang'] == 'ja': if date.replace('/', '-') in item['due']['date']: return True # 毎日の場合は一律True elif '毎日' in item['due']['string']: return True else: try: date_time = datetime.strptime(item['due']['date'], '%Y-%m-%dT%H:%M:%SZ') date_time = pytz.utc.localize(date_time).astimezone(pytz.timezone("Asia/Tokyo")) if date == date_time.strftime('%Y/%m/%d'): return True except ValueError: pass if self.key_check(item, 'date_string'): if '毎日' in item['date_string']: return True elif '平日' in item['date_string']: week_day = datetime.strptime(date, '%Y/%m/%d').weekday() if week_day is not 5 and week_day is not 6: return True elif '毎週' in item['date_string']: week_day = datetime.strptime(date, '%Y/%m/%d').weekday() if self.weekdays[week_day][1] in item['date_string']: return True elif 'every day' in item['date_string']: return True elif 'every' in item['date_string']: week_day = datetime.strptime(date, '%Y/%m/%d').weekday() if self.weekdays[week_day][0] in item['date_string']: return True else: if date.replace('/', '-') in item['date_string']: return True return False # テスト def main(): t = TodoistItems(os.environ['TODOIST_API_TOKEN']) print(t.find_by_date('2019/10/11')) if __name__ == "__main__": main() |
◆実行結果
1月24日23:59 テスト2
旧プロパティのチェックはざっとしかやってません。
v7以前のタスクは作り直すことを推奨します。
終わりに
今回はPythonで予定を取得する方法について紹介しました。
APIについて理解しておけば自作ツールとの連携も可能となるので開発の幅が広がります。
APIと自作ツールの連携は初心者でも取り組みやすい開発分野です。
何を作ったらいいかわからないという方はまずはAPIを活用して連携ツールを作ってみましょう。
おすすめ記事>>SlackbotでTodoistの予定を確認する
関連記事>>【Python+Todoist】スプレッドシートにタスクを出力する
関連記事>>Todoist活用方法まとめ