Python で Todoist を操作する

コードはこちらに置きました todoist/todoist_random_scheduler.ipynb at master · akiphumi/todoist

パソコンに Python 環境を用意しなくても Colab 上で動きます。 token を自身のものに書き換えてください。

# API token は Settting の Interations で確認
token = '0123456789abcdef0123456789abcdef01234567'

以下のコードで同期したあと、 api.state['labels'] とか api.state['items'] で必要な情報にアクセスします。

api = TodoistAPI(token)
api.sync()

タスクの数がよほど大きくない限り、同期制限には引っかからないと思いますが、同期制限をかけてくれるデコレータをみかけたので、せっかくなので入れ込みました。

# The rate limited version of the sync function
@rate_limit(0.8)  # 50/60 = 0.833...
def rate_limited_commit(*args):
#     print("Syncing...")
    return commit(*args)

同期したいラベルを指定して、Daily Goal の数だけランダムピックアップして、今日のタスクに更新します。

items = []
# 同期したいラベルを指定
key = 'next'
for item in api.state['items']:
  if labels.get(key) in item['labels']:
    items.append(item['id'])

daily_goals = random.sample(items, api.state['user']['daily_goal'])

下記の同期制限なしのコードは iOS の Pythonista アプリでも動作します。

import random
import time
from todoist.api import TodoistAPI
from tqdm import tqdm

token = '0123456789abcdef0123456789abcdef01234567'
api = TodoistAPI(token)
api.sync()

labels = {}
for lable in api.state['labels']:
    labels.setdefault(lable['name'], lable['id'])
print(labels)

items = []
key = 'next'
for item in api.state['items']:
    if labels.get(key) in item['labels']:
        items.append(item['id'])
print(items)

daily_goals = random.sample(items, api.state['user']['daily_goal'])
print(daily_goals)

for item in tqdm(api.state['items']):
    if item['id'] in daily_goals:
        item.update(due={'string': 'today'})
        api.commit()