最近、グループでSlackを本格的に使い始めたので、SlackでのQoLを上げようと思っていろいろ試していた。
# Slackはそこそこ直感的なグループチャット。"ゆるゆる"くらいの意味らしいんだけど、プロジェクト管理に重要視されている"らしい"。某社でも使われてるらしい。
- 作者: トム・デマルコ,伊豆原弓
- 出版社/メーカー: 日経BP社
- 発売日: 2001/11/26
- メディア: 単行本
- 購入: 14人 クリック: 119回
- この商品を含むブログ (112件) を見る
- 出版社/メーカー: ポニーキャニオン
- 発売日: 2014/07/16
- メディア: Blu-ray
- この商品を含むブログ (1件) を見る
話は戻るけど、SlackはGoogleカレンダーなんかが既に簡単に連携できるようになっていたんだけど、自分が使っているTodo管理のTodoistというサービスは連携がまだできていなくて、ちょっと歯がゆい思いをしていた。
# Todoistはめっちゃ使いやすいTodo管理サービス。
Getting Things Done with Todoist (English Edition)
- 作者: Daniel LeFebvre
- 発売日: 2015/01/01
- メディア: Kindle版
- この商品を含むブログを見る
そんなところに以下のような記事を見つけて、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)) |
gist69ce7d55a4bac0e0e8d1*1
PythonにはTodoistもSlackもAPIを簡単に扱えるラッパがあって、どっちも
$pip install pytodoist Slacker
で簡単に入る。
元記事ではuncompleted_itemとかうまく使って昨日完了したタスクとかを表示していたんだけど、
調べたらプレミアム会員のみの機能になったみたいなので、今回は実装をパスした。
代わりに、"積まれているタスク"、"今日のタスク"、"3日以内のタスク"、"今週中のタスク"みたいな感じで期間ごとに分けて出すようにした。
あとはcronかなんかで適当なタイミングで呼べばその日やるべきタスクをslackに投稿してくれる。
目指せQoSlack向上。
*1:2015/12/08:バグがあったので修正しました。