Mattermost で Bot Account を作る方法
Slack alternative として有名な Mattermost ですが、わりと最近の v5.12 で Bot 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 が使用できます。
フォームに従って admin アカウントを作成し、次の画面で "Create a new team" から適当なチームを作成してください。チームは Slack でいうワークスペースに当たるようです。
Mattermost 上にボットアカウントを作成する
ではブラウザからボットアカウントの作成をしてみましょう。ドキュメントの手順はこちらです。
Bot Accounts — Mattermost 5.13 documentation
まずは System Console から Integration Management でボットの作成を有効化します。
そしてチームの画面に戻り、 Integrations から Bot Accounts を選択し、 "Add Bot Account" でボットの作成に進みます。
Role はデフォルトで Member になっていますが、プライベートチャンネルや DM にメッセージを送りたい場合は System Admin にしてあげる必要があります。そして作成完了後がハマりポイントになります。
問題なくボットが作成されているように見えますが、肝心のアクセストークンがわかりません。 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 も取得してみました。これらがわかると簡単なボットの動作確認ができます。 最後に作成したボットをチームに加えてあげてください。
ボットアカウントの動作確認をする
上述のアクセストークン、チャンネル 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"}]}}
次のようにメッセージが送信できています。やりましたね!
この記事はこれで以上ですが、このアクセストークンを使って SDK などでボット側のコードを実装すれば、晴れて Mattermost 用のボットを動かすことができます。気になる方はやってみてください。
- 作者: トム・デマルコ,伊豆原弓
- 出版社/メーカー: 日経BP
- 発売日: 2001/11/26
- メディア: 単行本
- 購入: 14人 クリック: 119回
- この商品を含むブログ (111件) を見る