Mattermostのボットを作る

会社内ではMattermostが動いているのですが、他の社内システムと連携したいという要望がこっそり投稿されていて、まあ多少気になっていたのでbotを作ってみました。botの中身についてはともかく、botを動かすところについて一応残しておこうと思います。

Mattermostを動かす

とりあえずはMattermostを動かさないと始まりません。dockerhubにイメージがあるので、適当なイメージを探します。今回は mattermost/mattermost-preview を使いました。

docker run --name mattermost-preview -d --publish 8065:8065 --add-host dockerhost:127.0.0.1 mattermost/mattermost-preview

コンテナが起動したら localhost:8065 にアクセスするとアカウントとチームの作成が始まるのでそれぞれなにかしら入力するだけですぐに利用できます。

コールバックAPIを作る

Mattermostから呼び出されるAPIを動かします。とりあえずGoで書いてみました。リクエストパラメタにhelloをつけて返すだけです。

package main

import (
	"fmt"
	"net/http"
)

func slash(w http.ResponseWriter, r *http.Request) {
	text := r.FormValue("text")
	fmt.Fprintf(w, "hello %v", text)
}

func main() {
	http.HandleFunc("/slash", slash)
	http.ListenAndServe(":8090", nil)
}

VSCodeの REST Client を使って、以下のようにリクエストしました。

POST /slash HTTP/1.0
Host: localhost:8090
Content-Type: application/x-www-form-urlencoded

text=golang

送信したパラメタが正しく表示されました。

HTTP/1.1 200 OK
Date: Sat, 08 Aug 2020 09:42:39 GMT
Content-Length: 12
Content-Type: text/plain; charset=utf-8
Connection: close

hello golang

ここまででAPIはできました。

Mattermostの設定を編集する

開発時の環境にもよりますが、Mattermostから呼び出すAPIをホワイトリストに追加する必要がありました。今回はDockerコンテナの中からホスト上のAPIを呼び出すので、 host.docker.internal を設定します。

System Console を開いたら whitelist で検索して、該当の項目に値を設定します。

systemconsole screenshot

Integrationsを追加する

Integrations から Slash Commands を追加します。コマンドトリガは /slash としました。

integration screenshot

試す

ためしてみます。

request screenshot

コマンドの引数として渡した値が正しく表示されました。

response screenshot

この後

ここでは Slash Commands の追加を行いました。それとは別に Outgoing Webhooks もあります。概ね似たようなものなのですが、リクエストパラメタの取り扱いやレスポンスの形式について、少し違いもありました。

それについてはMattermostのドキュメントを読みつつ実装すれば動かすところまでは問題なくいけるのではないでしょうか。