Slackbotでタスクトラッキング
この記事は「Slack Advent Calendar 2017」の記事です。
概要
slack上で作業内容と時間を記録するタスクトラッキングbotをPythonを用いて作りました。コードはGitHubで公開しているので、使ってみていただければ幸いです。対応バージョンはPython3.6となっています。
GitHub - marukosu/tasktracking-slackbot
こちらで紹介されているように、timesチャンネルはチーム内で「今何してる?」を共有し、課題の早期解決や関連情報の提供の促進を狙いとした個人用チャンネルです。
今回は今何してる?の共有に加え、自分が何にどれだけ時間を使っているかをタスクトラッキングし、その結果を指定した時刻に定期的に投稿するbotを作りました。 今回のbotの構成は以下の図のように、Pythonでslackとのメッセージの取得・送信と、トラッキングしたデータを保存するデータベース(MySQL)の操作を行います。
slackからのメッセージの取得とそれに対する返答には、slack Real Time Messaging APIをベースにしたPythonのslackbotを利用しています。 定期的なレポートの送信にはSlack APIのpythonインターフェイスslackerを利用しました(slackbotは現状、メッセージの能動的な送信はサポートしていないため)。 はじめに、botを導入したいチームでbotを作成し、API TOKENを取得します。
公式のBot Usersページのcreating a new bot userからbotを作成。
作成に成功するとAPI Tokenが表示されます。 このAPI Tokenは後ほど実行環境の環境変数に追加するので、どこかにコピーしておいて下さい。
ちなみにbotには名前や表示する画像も設定できます。 作成したbotは利用したいチャンネルにinviteしておいてください。 Python3.6およびgitが利用できる環境でリポジトリからクローンして利用します。 必要なライブラリをreqirementsからインストールします。 botの接続先はslackbot_settings.pyにおいて として環境変数から取得するようになっています。
なので、さきほど取得したAPI Tokenを環境変数に追加してください。 私の場合はMacのbash上でテストしていたので以下のような記述を~/.bash_profileに追加します。 環境変数の記述方法が分からない方は「OS名 環境変数 設定」等で検索すればすぐ見つかると思います。 今回紹介するリポジトリには、dockerによるMySQL環境の提供用にdocker-mysqlフォルダを用意しています。
dockerについての詳細は割愛しますが、dockerを利用できる環境であればdocker-mysqlのREADMEに従えば以下の2コマンドでテーブル込みのMySQL環境を用意できます。(必要であればパスワード等は適宜変更してください。) 自前で用意される方は、tasktracking-slackbot/docker-mysql/initdb/setting.sqlにSQLの設定が記述してあるので参照ください。 以上でbotの導入およびtasktracking-slackbotの利用準備が整いました。
botの設定はslackを起動してチーム名が表示されている左上をクリックし、Manage Apps>Custom Integrations>Botsから確認できます。 ここからは利用方法を解説します。
起動は で行います。(本当はデーモン化して実行しなければいけないのですがまだ未対応です。現状はtmuxでセッションを別途建てて、そこで実行させています。) 起動すると以下のようにslack側でbotがオンライン状態になります。
botが起動している状態でhelpとメッセージを送信すると、利用できるコマンドと説明が返ってきます。 以下が利用できるコマンドです。()内は省略して入力可能です。(@botは設定したbotの名前にメンションして利用します。)timesチャンネルとは
構成図
インストール方法
API Tokenの取得
環境構築
git clone https://github.com/marukosu/tasktracking-slackbot.git
pip install -r requirements.txt
API_TOKEN = os.environ['PYTHON_SLACKBOT_API_TOKEN']
export PYTHON_SLACKBOT_API_TOKEN=[さきほど取得したAPI Token]
データベースの作成
docker build -t mysql57:slack .
docker run -d -p 13306:3306 --name mysql57slack mysql57:slack
利用方法
python run.py
コマンド | オプション | 機能 |
---|---|---|
@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)でタスク終了でデータベースに記録されていきます。
レポート機能
データベースに登録済みのタスクはlistコマンドで期間指定して確認できますが、reportとして登録しておけば定期的に実行済みのタスク一覧を投稿してくれます。
-everyオプションでは毎日のdayの他に曜日Mon-Sunも対応していますので、
@bot addReport -b 19:00 -every Sun -i "l -s -week"
のようにレポートをセットすれば、週報チェックもできます。
終わりに
今回はレポートの定期実行を標準のschedを用いて実装しました。また、CronTabライブラリを使用することで、定期実行までの時間取得がきれいになったと思います。
私は基本Slackを開いているのですが、slack上でタスクトラッキングを導入してみると自分を含め周りが何に対して時間を取られているか(記録をつけてないとこはサボっているのがバレたり、、)が可視化されていい感じでした。 また、周りが何をどれくらいしているかが見えるので、行き詰まっているようであれば現状確認するなど、コミュニケーションが活性化したように感じます。
まだ実装したばかりでコード的には汚い部分も多いので、利用感やコードに対してコメントいただけると大変嬉しいです。