Slackbotでタスクトラッキング

この記事は「Slack Advent Calendar 2017」の記事です。

概要

slack上で作業内容と時間を記録するタスクトラッキングbotPythonを用いて作りました。コードはGitHubで公開しているので、使ってみていただければ幸いです。対応バージョンはPython3.6となっています。

GitHub - marukosu/tasktracking-slackbot

timesチャンネルとは

c16e.com

こちらで紹介されているように、timesチャンネルはチーム内で「今何してる?」を共有し、課題の早期解決や関連情報の提供の促進を狙いとした個人用チャンネルです。 今回は今何してる?の共有に加え、自分が何にどれだけ時間を使っているかをタスクトラッキングし、その結果を指定した時刻に定期的に投稿するbotを作りました。

構成図

今回のbotの構成は以下の図のように、Pythonでslackとのメッセージの取得・送信と、トラッキングしたデータを保存するデータベース(MySQL)の操作を行います。

f:id:Marukosu:20171222033315p:plain

slackからのメッセージの取得とそれに対する返答には、slack Real Time Messaging APIをベースにしたPythonのslackbotを利用しています。

定期的なレポートの送信にはSlack APIのpythonインターフェイスslackerを利用しました(slackbotは現状、メッセージの能動的な送信はサポートしていないため)。

インストール方法

API Tokenの取得

はじめに、botを導入したいチームでbotを作成し、API TOKENを取得します。 公式のBot Usersページcreating a new bot userからbotを作成。 作成に成功するとAPI Tokenが表示されます。

このAPI Tokenは後ほど実行環境の環境変数に追加するので、どこかにコピーしておいて下さい。 ちなみにbotには名前や表示する画像も設定できます。

作成したbotは利用したいチャンネルにinviteしておいてください。

環境構築

Python3.6およびgitが利用できる環境でリポジトリからクローンして利用します。

git clone https://github.com/marukosu/tasktracking-slackbot.git

必要なライブラリをreqirementsからインストールします。

pip install -r requirements.txt

botの接続先はslackbot_settings.pyにおいて

API_TOKEN = os.environ['PYTHON_SLACKBOT_API_TOKEN']

として環境変数から取得するようになっています。 なので、さきほど取得したAPI Tokenを環境変数に追加してください。

私の場合はMacのbash上でテストしていたので以下のような記述を~/.bash_profileに追加します。

export PYTHON_SLACKBOT_API_TOKEN=[さきほど取得したAPI Token]

環境変数の記述方法が分からない方は「OS名 環境変数 設定」等で検索すればすぐ見つかると思います。

データベースの作成

今回紹介するリポジトリには、dockerによるMySQL環境の提供用にdocker-mysqlフォルダを用意しています。 dockerについての詳細は割愛しますが、dockerを利用できる環境であればdocker-mysqlのREADMEに従えば以下の2コマンドでテーブル込みのMySQL環境を用意できます。(必要であればパスワード等は適宜変更してください。)

docker build -t mysql57:slack .
docker run -d -p 13306:3306 --name mysql57slack mysql57:slack

自前で用意される方は、tasktracking-slackbot/docker-mysql/initdb/setting.sqlにSQLの設定が記述してあるので参照ください。

利用方法

以上でbotの導入およびtasktracking-slackbotの利用準備が整いました。 botの設定はslackを起動してチーム名が表示されている左上をクリックし、Manage Apps>Custom Integrations>Botsから確認できます。

ここからは利用方法を解説します。 起動は

python run.py

で行います。(本当はデーモン化して実行しなければいけないのですがまだ未対応です。現状はtmuxでセッションを別途建てて、そこで実行させています。)

起動すると以下のようにslack側でbotがオンライン状態になります。

f:id:Marukosu:20171222005014p:plain:w150

botが起動している状態でhelpとメッセージを送信すると、利用できるコマンドと説明が返ってきます。

以下が利用できるコマンドです。()内は省略して入力可能です。(@botは設定したbotの名前にメンションして利用します。)

コマンド オプション 機能
@bot register me ユーザー登録
begin(b) taskname [-b time] タスクの登録(-b で開始時刻指定。デフォルトはメッセージ送信時刻)
finish(f) (taskname) [-f time] タスクの終了(-f で終了時刻指定。tasknameは直近のタスクであれば省略可)
list(l) [-sum] [-t today yesterday|week] |登録済みのタスク一覧を表示。-tで期間指定できます
now 直近の終了していないタスクの表示
@bot addReport [-b time] [-every day Monday-Sunday] [-i command]|commandの内容(listを実行するメッセージ)を指定時刻に定期的に送信します
showReports 登録しているレポート一覧の表示

タスク登録

はじめに@bot register meでユーザーをデータベースに登録し利用します。 その後はb(egin)でタスク登録、f(inish)でタスク終了でデータベースに記録されていきます。

f:id:Marukosu:20171222011908p:plain:w300

レポート機能

データベースに登録済みのタスクはlistコマンドで期間指定して確認できますが、reportとして登録しておけば定期的に実行済みのタスク一覧を投稿してくれます。

f:id:Marukosu:20171222025305p:plain:w300

-everyオプションでは毎日のdayの他に曜日Mon-Sunも対応していますので、

@bot addReport -b 19:00 -every Sun -i "l -s -week" 

のようにレポートをセットすれば、週報チェックもできます。

終わりに

今回はレポートの定期実行を標準のschedを用いて実装しました。また、CronTabライブラリを使用することで、定期実行までの時間取得がきれいになったと思います。

私は基本Slackを開いているのですが、slack上でタスクトラッキングを導入してみると自分を含め周りが何に対して時間を取られているか(記録をつけてないとこはサボっているのがバレたり、、)が可視化されていい感じでした。 また、周りが何をどれくらいしているかが見えるので、行き詰まっているようであれば現状確認するなど、コミュニケーションが活性化したように感じます。

まだ実装したばかりでコード的には汚い部分も多いので、利用感やコードに対してコメントいただけると大変嬉しいです。