Python3 + Flask + py-trello + slackerでTrelloの更新情報をslackに流す(2)
前回 の記事で、py-trelloでwebhookの登録をし、Flaskでサーバを立ててTrelloの通知を受け取ることができました。
今回は、拾ってきたTrelloの通知情報をslackに投げるところを作りたいと思います。
ゴール
Trelloのウェルカムボードのカードの移動を、Flaskで作ったサーバにWebhookで通知させる。 サーバに通知がきたら、slackにPostする。
Trelloのwebhookから必要な情報だけを抜き出す
カードの移動に関する通知だけを抜き出す
Trelloのwebhookは、登録したボードに関する更新情報をすべて通知します。 今回必要なのはカードの移動だけなので、通知のうちカードの移動に関するものだけを抽出します。
通知がTrelloのどのアクションと紐付いているかは、webhookで届くデータの以下に格納されています。
action -> display -> translationKey
カードの移動に関する通知の場合は、このフィールドが action_move_card_from_list_to_list
になります。
詳細な情報を抜き出す
今回は、以下の4つのデータを取ってくることにします。
- 移動されたカード名
- 移動前のリスト名
- 移動後のリスト名
- カードを移動させた人の名前
カード移動に関する通知を受け取ると、上の4つの情報を表示するように webhook_server.py
のwebhook()
を変更しました。
webhook_server.webhook()
@app.route('/webhook', methods=['POST']) def webhook(): if request.method == 'POST': action_type = request.json["action"]["display"]["translationKey"] if action_type == "action_move_card_from_list_to_list": card_name = request.json["action"]["data"]["card"]["name"] before_list = request.json["action"]["data"]["listBefore"]["name"] after_list = request.json["action"]["data"]["listAfter"]["name"] user_name = request.json["action"]["memberCreator"]["username"] message = user_name + "さんが「" +card_name + "」を「" + before_list + "」から「" + after_list + "」へ移動しました!" print(message) return '', 200 else: abort(400)
動かすとこんな感じ。
いい感じですね。
slackerを用いてslackに投稿する
Slack API Tokenを取得する
以下のを参考に、SlackBotアカウントの作成を行います。
Slackbotのアカウントができたら、APIトークンを secret_token.py
に追加しておきます。
slack_token = "#Your slack token HERE#" trello_api = "#Your trello API HERE#" trello_token = "#Your trello token HERE#"
実装
slackerライブラリを用いてSlackに投稿する仕組みは、以下の記事を参考にします。
先程実装したwebhook()
の中で表示したメッセージをそのままslackにPOSTしてみます。
webhook_server.py
rom flask import Flask, request, abort from slacker import Slacker import secret_tokens app = Flask(__name__) @app.route('/webhook', methods=['POST']) def webhook(): if request.method == 'POST': action_type = request.json["action"]["display"]["translationKey"] if action_type == "action_move_card_from_list_to_list": card_name = request.json["action"]["data"]["card"]["name"] before_list = request.json["action"]["data"]["listBefore"]["name"] after_list = request.json["action"]["data"]["listAfter"]["name"] user_name = request.json["action"]["memberCreator"]["username"] message = user_name + "さんが「" +card_name + "」を「" + before_list + "」から「" + after_list + "」へ移動しました!" # print(message) slack.chat.post_message("sandbox", message, as_user=True) return '', 200 else: abort(400) @app.route("/webhook", methods=["HEAD"]) def webhook_creation(): if request.method == "HEAD": return "", 200 else: abort(400) if __name__ == '__main__': slack = Slacker(secret_tokens.slack_token) app.run(port=5000, host="0.0.0.0")
結果
Trelloでカードを動かした情報を無事Slackに投稿できました!
ゴール達成!