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

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

Python3 + Flask + py-trello + slackerでTrelloの更新情報をslackに流す(1)

弊チーム(https://github.com/SSL-Roots/Roots_home/wiki)では、タスクの管理にTrelloを使っています。 また、最近チャットツールとしてslackを導入したので、チームの活動に関する全情報をslack上に集約したいと思っています。

そこで、TrelloでタスクがDoneリストに入ったらslackで報告してくれるbotを作ります。 Trelloとslackの連携は公式でサポートされていますが、通知が英語だし味気ないので、タスク完了したら可愛い女の子が褒めてくれる仕組みにしたいです… ちなみに、RaspberryPi3 上で動かします。

というわけで。

ゴール

Trelloのウェルカムボードのカードの移動を、Flaskで作ったサーバにWebhookで通知させる。 サーバに通知がきたら、slackにPostする。

今回の記事では、Flaskでサーバを立てて、そこにTrello Webhookの通知がくるところまでを目指します。

インストール

Python3, pip3は入ってるという前提です。

sudo pip3 install flask py-trello slacker

Flaskでサーバを用意

Trello Webhookを受け取るためのサーバをFlaskで用意します。

webhook_server.py

from flask import Flask, request, abort
import pprint

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    if request.method == 'POST':
        pprint.pprint(request.json)
        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__':
    app.run(port=5000, host="0.0.0.0")

Trello Webhookの登録

Trello Webhookに、作ったサーバを登録します。 py-trelloを用いてTrello APIにアクセスしますが、その際にAPIキーとトークンが必要になります。 APIキーとトークンの取得方法は、以下のページを参考にしてください。

Trello の Webhook API をPHPで受け取ってみた - きじとら

APIキーとトークンの情報をまとめたsecret_tokens.pyを作っておきましょう。

secret_tokens.py

trello_api = "#Your API Key HERE#"
trello_token = "#Your token HERE#"

さて、Webhookの登録をします。 Webhookの登録には、WebhookサーバのURLと、通知をもらいたいアイテム(ボードだったり、カードだったり)のIDが必要です。 py-trelloを使ってアイテムのIDを取得する方法は以下のページに詳しいです。

Python + py-trelloで、Trello APIを使ってみた - メモ的な思考的な

今回は、Trelloに登録したときに必ず存在するはずの、ウェルカムボードを登録します。

trello_regist_webhook.py

from trello import TrelloClient
import secret_tokens

def main():
    server_url = "http://[自分のグローバルIP]:5000/webhook"

    client = TrelloClient(
        api_key=secret_tokens.trello_api,
        token=secret_tokens.trello_token
        )

    all_boards = client.list_boards()

    for board in all_boards:
        if board.name == "ウェルカムボード":
            welcome_board = board
            break

    webhook = client.create_hook(callback_url = server_url, id_model = welcome_board.id)

    if webhook == False:
        print("Failed webhook registration")
    else:
        print("Success!")

if __name__ == "__main__":
    main()

先程作ったwebhook_server.pyを実行させた状態でtrello_regist_webhook.pyを実行すると、Webhookが登録されます。

python3 webhook_server.py &
python3 trello_regist_webhook.py

Success!と表示されればWebhookの登録が正しく完了しています。

実験

さて、webhook_server.pyを起動している状態で、Trelloのウェルカムボード上で何かしてみましょう。 試しに、一番左の「やってみる」リストから、真ん中の「やったこと」リストにカードを移動させてみましょう。 すると…

f:id:tilt_silvie:20170917191224p:plain

Trelloの更新情報がJSONで送られてきました!

実際は、Python内部では送信されたJSONをパースして辞書形式で持っています。 あとは、必要な情報をその辞書から抜き出してやればOKです。

今回はここまで。 次回はslackに投稿する部分を作って、システムを完成させます。

参考

Python + py-trelloで、Trello APIを使ってみた - メモ的な思考的な

Trello の Webhook API をPHPで受け取ってみた - きじとら

GitHub - sarumont/py-trello: Python API wrapper around Trello's API

trelloのboardにwebhookを登録する - pblog

2017/09/22 記事修正

slackbotライブラリの代わりにslackerライブラリを使うことにしましたので、タイトルを修正。