超言理論

特に益もない日記である

SlackのチャネルにTodoistに登録されているタスク一覧を投稿するPythonスクリプト

最近、グループでSlackを本格的に使い始めたので、SlackでのQoLを上げようと思っていろいろ試していた。
# Slackはそこそこ直感的なグループチャット。"ゆるゆる"くらいの意味らしいんだけど、プロジェクト管理に重要視されている"らしい"。某社でも使われてるらしい。

ゆとりの法則 ? 誰も書かなかったプロジェクト管理の誤解

ゆとりの法則 ? 誰も書かなかったプロジェクト管理の誤解

全然関係ないけど最近ゆるゆり見てるからゆるゆりのブルーレイおいておきますね。

話は戻るけど、SlackはGoogleカレンダーなんかが既に簡単に連携できるようになっていたんだけど、自分が使っているTodo管理のTodoistというサービスは連携がまだできていなくて、ちょっと歯がゆい思いをしていた。
# Todoistはめっちゃ使いやすいTodo管理サービス。

そんなところに以下のような記事を見つけて、mosowave.hatenablog.com
(゚∀゚)キタコレ!!とおもっていたんだけど、どうやら普通にRubyでプログラムを書いて連携させているので、それなら自分用にPythonで用意すればよくね?ってことでPythonで再実装した。

import sys
from pytodoist import todoist
from datetime import datetime, timedelta, date
from slacker import Slacker
# 日付を変えて表示するための埋め込み
embedding_date = [
[-365, 0, 'スタックされた'],
[0, 1, '今日の'],
[1, 3, '三日以内の'],
[3, 7, '今週の']
]
# TodoistのAPT Token
todoist_token = None
try:
f = open('.todoist_credentials', 'r')
todoist_token = f.readline()
except:
print('You have no todoist credentials, please input your todoist API token:')
todoist_token = sys.stdin.readline()
try:
todoist_usr = todoist.login_with_api_token(todoist_token.strip())
with open('.todoist_credentials', 'w') as f:
f.write(todoist_token.strip())
except Exception as e:
print('Cannot login with your todoist credentials or API token.')
print(e)
exit()
# slackのAPI Token
slack_token = None
try:
f = open('.slack_credentials', 'r')
slack_token = f.readline()
except:
print('You have no slack credentials, please input your slack API token:')
slack_token = sys.stdin.readline()
try:
slack_usr = Slacker(slack_token.strip())
with open('.slack_credentials', 'w') as f:
f.write(slack_token.strip())
except Exception as e:
print('Cannot login with your slack credentials or API token.')
print(e)
exit()
# 一応のためTodoistにsync
todoist_usr.sync()
# 現在時刻の取得(UTC)
now = datetime.utcnow()
content = []
# 埋め込み日付を参考にしてTodoistのタスクを取得して古い順に並べる
for e in embedding_date:
emb_content = []
for t in sorted( [ x for x in todoist_usr.get_tasks() if x.due_date is not None ], key=lambda t:datetime.strptime(t.due_date, '%a %d %b %Y %H:%M:%S +0000')):
if t.project.name == '<取得したいプロジェクト名>' :
if datetime.strptime(t.due_date, '%a %d %b %Y %H:%M:%S +0000') >= now + timedelta(days=e[0]) and datetime.strptime(t.due_date, '%a %d %b %Y %H:%M:%S +0000') < now + timedelta(days=e[1]):
emb_content.append('> ・'+t.date_string+'\t'+t.content)
if len(emb_content) > 0:
emb_content.insert(0, '>#'+e[2]+'Todoist:')
content.extend(emb_content)
if len(content) == 0:
content.append('>直近1週間でのTodoはありません。\n>Excellent work!!!')
content.append('> Karman:'+str(todoist_usr.karma)+' '+str(todoist_usr.karma_trend))
print(content)
slack_usr.chat.post_message('<投稿したいSlackのチャンネル>', '\n'.join(content))
view raw todoist_slackbot.py hosted with ❤ by GitHub

gist69ce7d55a4bac0e0e8d1*1

PythonにはTodoistもSlackもAPIを簡単に扱えるラッパがあって、どっちも

$pip install pytodoist Slacker

で簡単に入る。

元記事ではuncompleted_itemとかうまく使って昨日完了したタスクとかを表示していたんだけど、
調べたらプレミアム会員のみの機能になったみたいなので、今回は実装をパスした。
代わりに、"積まれているタスク"、"今日のタスク"、"3日以内のタスク"、"今週中のタスク"みたいな感じで期間ごとに分けて出すようにした。
あとはcronかなんかで適当なタイミングで呼べばその日やるべきタスクをslackに投稿してくれる。

目指せQoSlack向上。

*1:2015/12/08:バグがあったので修正しました。


Copyright © 2012-2016 Masahiro MIZUKAMI All Rights Reserved.