Slack BOT + Backlog APIでタスク管理する。

仕事の管理ツール

現在、仕事でプロジェクト管理は backlog をコミュニケーションツールは slack を使っています。 会議はあまりないので、仕事の打ち合わせはslack上が多いです!

slackとbacklogを使う際の問題点・・・

最近になってようやく(汗)、slackとbacklogに慣れてきたのですが、 両方使ってきて自分なりの不満点も見えてきました。

  • backlogにあがった課題URLのリンクをSLACKにいちいちコピペするのがだるい。
  • backlogページにログインしたくない (仕事で用いるページ、アプリは少なくしたい→slack、エディタに集中)

上記の課題点を克服すべく、Slack Botを作成してみました!

SLACK BOT環境

python version 主に使用したモジュール

  • Python Anaconda 3-4.0.0
  • slackbotのために使用したモジュールはこちら

モジュール slackbotについて

slackbotを作成する場合、RealTimeMessaging APIを 用いる必要があります。(APIはWebSocketベース)

こちらのモジュールを用いると Websocket周りの通信をうまいことラップしてくれます。 モジュールインストールは pip install slackbot で大丈夫です。

setup(hello world的なヤツ)

最低限の実行に必要な手順は以下

1. SLACBOT API KEYの取得

2. 実行ファイル、環境設定ファイルの指定となります。

1についてはググると色々とあるので、割愛します!

実行ファイル、環境設定ファイルの指定

実行フォルダ直下に

API_TOKEN = <slack_api_key>
# デフォルトの返信
default_reply = "hello!"

#カスタマイズプログラム読み込み指定
PLUGINS = ['plugins.reply_backlog_task']
from slackbot.bot import Bot
def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    main()

と記述し、run.pyを実行すると、botが起動します。

https://gyazo.com/7e38c4d1295783727ebb9c131ffc4ba5

カスタマイズ

次に特定のフレーズに反応した際の処理を作成します。

slackbot_settings.pyに PLUGINSというで指定したファイル(./plugins/reply_backlog_task.py) に独自の処理を追加することが出来ます。

今回は、以下の処理をプログラムすることにしました。

処理手順

1. pj:プロジェクト名とスラックでメンション(slack)

2. pj:に続くプロジェクト名をキャプチャする。(python)

3. キャプチャした単語をtrelloAPIでを呼び出して未完了タスクを呼び出す。(python)

4. backlog担当PJ未完了タスクを表示(slack)

プログラム

from slackbot.bot import respond_to
from slackbot.bot import listen_to
import json
import re
import requests

# backlogクエリパラメータ dict返し
def issue_data(projectId):
    issue_data = {
        'parentChild':0,
        'count':100, #取得上限数
        'projectId[]':projectId,
        'statusId[]': [1,2],#1→未対応、2→処理中
    }
    return issue_data

# backlog api convert pj_name → pj_id
def convert_project_num(project_name):
    dict = {
        "pj1":11111,
        "pj2":22222
    }
    return  dict[project_name]

# backlog api request
def backlog_get_issues(projectId):
    url = HOST + '/api/v2/issues?apiKey=' + <backlog_api_key>
    r = requests.get(url,issue_data(projectId))
    return r.json()

# デコレータの引数にマッチするキーワードを指定し、マッチした後続の関数を実行
# デコレータの引数は正規表現も可能
# 正規表現パターンでマッチした、キャプチャは第二引数に引き渡される
@respond_to(r'pj:(.+)[\s ]?$')
def mention_func(message,project):
    texts = backlog_get_issues(convert_project_num(project))
    for t in texts:
        text = "【未対応案件リスト】"
        text += "\n"
        text += "担当者:"
        text += str(t['assignee']['name'])
        text += "\n"
        text += str(t['description'])
        message.reply(text) # slackに返信
        time.sleep(1)

ごちゃごちゃしてダサいですが、動きました(^^)

https://gyazo.com/1c1113f0cbbc9e595c2000b182462ac7

これからもカスタマイズしていって、便利なslack仕事アシスタントbotを作っていきたいです!

参考ページ!

http://blog.bitmeister.jp/?p=3892