Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

Mattermost で Bot Account を作る方法

Slack alternative として有名な Mattermost ですが、わりと最近の v5.12Bot account の機能が追加されました。 これまで Mattermost 用のボットは偽のユーザーを作成してボットの肩代わりをしていたようですが、公式にボットを作成することができるようになりました。

実は Mattermost のことは全く詳しくないので大した説明もできないのですが、ドキュメントに沿ってボットを作成する方法を紹介します。 と言っても Mattermost 上のボットの作成方法であって、 Hubot などのボット側のコードの実装の話ではないので悪しからず。 なぜそんな細かい話をするかと言うと、公式の手順でもちょっとハマりポイントがあるので説明したいのと、今月のブログのネタがなかったのが理由ですw

ではさっそく手順ですが、こんな流れです。

Docker 以外は試してないです、すいません。

ローカルの Docker 上に Mattermost のサーバを実行する

簡単です。これだけです。

Local Machine Setup using Docker — Mattermost 5.13 documentation

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

latest タグだとバグ踏んで困ることもあるので、僕が確認したバージョンだと以下になります。

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

ドキュメントの通り、ブラウザから http://localhost:8065/ にアクセスするとすぐに Mattermost が使用できます。

f:id:innossh:20190729150947p:plain

フォームに従って admin アカウントを作成し、次の画面で "Create a new team" から適当なチームを作成してください。チームは Slack でいうワークスペースに当たるようです。

f:id:innossh:20190729152951p:plain

Mattermost 上にボットアカウントを作成する

ではブラウザからボットアカウントの作成をしてみましょう。ドキュメントの手順はこちらです。

Bot Accounts — Mattermost 5.13 documentation

まずは System Console から Integration Management でボットの作成を有効化します。

f:id:innossh:20190729152834p:plain

そしてチームの画面に戻り、 Integrations から Bot Accounts を選択し、 "Add Bot Account" でボットの作成に進みます。

f:id:innossh:20190729153429p:plain

Role はデフォルトで Member になっていますが、プライベートチャンネルや DM にメッセージを送りたい場合は System Admin にしてあげる必要があります。そして作成完了後がハマりポイントになります。

f:id:innossh:20190729153805p:plain

問題なくボットが作成されているように見えますが、肝心のアクセストークンがわかりません。 Docker コンテナのログを見てみるとこのようなエラーが発生しています。

{"level":"error","ts":1564382164.8445287,"caller":"mlog/log.go:172","msg":"Failed to send \"Personal access token added\" email successfully","path":"/api/v4/users/kec946gwmjrfpxktgu3dz7fmeo/tokens","request_id":"8ed3d6jpp7r6fnf8nr4p9wpkec","ip_addr":"172.17.0.1","user_id":"b4tods5usiycjdh6ot1yt8h3tc","method":"POST","err_where":"SendUserAccessTokenAddedEmail","http_code":500,"err_details":"SendMail: Failed to open connection, dial tcp 127.0.0.1:2500: connect: connection refused"}

このエラーはボット作成時にアクセストークンをメールで通知する機能が失敗していることによるものです。 SMTP を正しく設定してあげれば問題は解決しそうですが、ローカルで試すだけの場合には面倒です。

というわけで、次のように Docker コンテナ内の DB を直接見てみました。

$ docker exec -t -e MYSQL_PWD=mostest mattermost-preview mysql -u mmuser mattermost_test -e "select * from UserAccessTokens;"
+----------------------------+----------------------------+----------------------------+---------------+----------+
| Id                         | Token                      | UserId                     | Description   | IsActive |
+----------------------------+----------------------------+----------------------------+---------------+----------+
| htrd9rcdnink5bkg1jkixjia9e | xktxxxxxxxxxxxxxxxxxxxxxxx | kec946gwmjrfpxktgu3dz7fmeo | Default Token |        1 |
+----------------------------+----------------------------+----------------------------+---------------+----------+

$ docker exec -t -e MYSQL_PWD=mostest mattermost-preview mysql -u mmuser mattermost_test -e "select * from Channels;"
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+-------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+
| Id                         | CreateAt      | UpdateAt      | DeleteAt | TeamId                     | Type | DisplayName | Name        | Header | Purpose | LastPostAt    | TotalMsgCount | ExtraUpdateAt | CreatorId | SchemeId | GroupConstrained |
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+-------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+
| x5mtmgx347n6fnfynau4rx4k7e | 1564381525626 | 1564381525626 |        0 | aqwm5da3nfgapbj9bei3tz3qcc | O    | Town Square | town-square |        |         | 1564381525698 |             0 |             0 |           | NULL     |             NULL |
| xzcsym6b8jgq5e1d5newqdgqja | 1564381525636 | 1564381525636 |        0 | aqwm5da3nfgapbj9bei3tz3qcc | O    | Off-Topic   | off-topic   |        |         | 1564381525747 |             0 |             0 |           | NULL     |             NULL |
+----------------------------+---------------+---------------+----------+----------------------------+------+-------------+-------------+--------+---------+---------------+---------------+---------------+-----------+----------+------------------+

アクセストークンのついでにチャンネルの ID も取得してみました。これらがわかると簡単なボットの動作確認ができます。 最後に作成したボットをチームに加えてあげてください。

f:id:innossh:20190729155353p:plain

ボットアカウントの動作確認をする

上述のアクセストークン、チャンネル ID を使用して、ドキュメントの通りに curl で確認するだけです。

Bot Accounts — Mattermost 5.13 documentation

curl -i -X POST -H 'Content-Type: application/json' -d '{"channel_id":"<channel-id>", "message":"This is a message from a bot", "props":{"attachments": [{"pretext": "Look some text","text": "This is text"}]}}' -H 'Authorization: Bearer <bot-access-token>' <mattermost-url>/api/v4/posts

実際に Town Square のチャンネルに対して実行してみると

$ curl -i -X POST -H 'Content-Type: application/json' -d '{"channel_id":"x5mtmgx347n6fnfynau4rx4k7e", "message":"This is a message from a bot", "props":{"attachments": [{"pretext": "Look some text","text": "This is text"}]}}' -H 'Authorization: Bearer xktxxxxxxxxxxxxxxxxxxxxxxx' http://localhost:8065/api/v4/posts
HTTP/1.1 201 Created
Content-Type: application/json
Vary: Accept-Encoding
X-Request-Id: m8nsaqxtatd89nossej897mxuh
X-Version-Id: 5.13.0.5.13.2.d9c590816b9b1c0ca3c84c6e6ec84f1f.false
Date: Mon, 29 Jul 2019 06:54:27 GMT
Content-Length: 685

{"id":"d41e8o8xr7gkmegf817739z6ge","create_at":1564383267309,"update_at":1564383267309,"edit_at":0,"delete_at":0,"is_pinned":false,"user_id":"kec946gwmjrfpxktgu3dz7fmeo","channel_id":"x5mtmgx347n6fnfynau4rx4k7e","root_id":"","parent_id":"","original_id":"","message":"This is a message from a bot","type":"","props":{"attachments":[{"id":0,"fallback":"","color":"","pretext":"Look some text","author_name":"","author_link":"","author_icon":"","title":"","title_link":"","text":"This is text","fields":null,"image_url":"","thumb_url":"","footer":"","footer_icon":"","ts":null}],"from_bot":"true"},"hashtags":"","pending_post_id":"","metadata":{"embeds":[{"type":"message_attachment"}]}}

次のようにメッセージが送信できています。やりましたね!

f:id:innossh:20190729155630p:plain

この記事はこれで以上ですが、このアクセストークンを使って SDK などでボット側のコードを実装すれば、晴れて Mattermost 用のボットを動かすことができます。気になる方はやってみてください。

ゆとりの法則 ? 誰も書かなかったプロジェクト管理の誤解

ゆとりの法則 ? 誰も書かなかったプロジェクト管理の誤解