うごくものづくりのために

技術的な備忘録がメインです。

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.pywebhook()を変更しました。

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)

動かすとこんな感じ。

f:id:tilt_silvie:20170922160809p:plain

いい感じですね。

slackerを用いてslackに投稿する

Slack API Tokenを取得する

以下のを参考に、SlackBotアカウントの作成を行います。

PythonでSlackbotを作る(1) – ビットログ

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に投稿する仕組みは、以下の記事を参考にします。

PythonでSlackbotを作る(3) – ビットログ

先程実装した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")

結果

f:id:tilt_silvie:20170922185149p:plain

Trelloでカードを動かした情報を無事Slackに投稿できました!

ゴール達成!

参考

PythonのslackbotライブラリでSlackボットを作る - Qiita

PythonでSlackbotを作る(1) – ビットログ

PythonでSlackbotを作る(2) – ビットログ

PythonでSlackbotを作る(3) – ビットログ