こんにちはエンジニアの sakasai です。
最近「貧民、聖櫃、大富豪」という漫画にハマってGW中に一気読みしてしまいました。続きが待ち遠しい。
さて、ディーメイクでは社内のチャットツールにMattermostを利用しています。
基本的にチャンネルの作成などにルールや制限は設けていないのですが、作った人しか知らないチャンネルがあったり、知ってればそのチャンネルに入りたかったのに・・・みたいなことがたまに発生したりということで、現在どんなチャンネルが有るか一覧で見える形に可視化するために、定期的にチャンネルの一覧を取得して共有する形にしています。
というわけで今回はMattermostでチーム内の公開チャンネル一覧を取得して、その内容を投稿するボットについて紹介したいと思います。
構成はこんな感じです。
実際にはMattermost自体もEC2上で稼働しているのですが、Lambdaからインターネット経由でMattermostAPIを実行する形にしています。
Botアカウント作成
まずはMattermost上でボットを作成します。
メニューから「統合機能」を選んで
「Botアカウント」をクリックして
「Botアカウントを追加する」をクリックします
必要な項目を入力して「Botアカウントを作成する」をクリックします。
※チャンネル一覧を取得するために役割を「システム管理者」する必要があります。(役割「システム管理者」を選択すると「投稿」のチェックボックスが勝手にオンになります)
作成するとMattermostAPI実行に必要なトークンが発行されますので保存しておいてください。(なくしてしまった場合はあとから新しいトークンを生成することができます)
Botアカウントができたら実際にチャンネル一覧を取得して投稿するボットを実装します。
今回はAWS Lambda(Python3.8)で実装しました。
今回のソースコードはGitHubにアップしてあります。
https://github.com/msakasai/mm-list-channels
処理の流れは
- MattermostAPI(公開チャンネル取得API)でチーム内の公開チャンネル一覧取得
- 取得した一覧をMarkdownの表形式に整形して投稿するテキストを作成
- MattermostAPI(投稿API)で 2. のテキストを投稿
またLambdaの環境変数として以下を持っています。
- MatternostのURL
- チャンネル一覧を取得するチームID
- チャンネル一覧を投稿するチャンネルID
- Botアカウントのトークン
では処理の詳細をかんたんに解説します。(ソースコードについてはGitHubを参照してください)
チーム内の公開チャンネル一覧取得
最初にチャンネル一覧を取得します。
APIリクエストヘッダの Authorization: Bearer
にBotアカウントのトークンをセットします。
APIのパラメータ(ページ番号、1ページの取得件数)は任意ですが、明示的に指定するようにしています。
全件取得するためにパラメータで指定した件数未満になるまでループして一覧取得するようにしています。
また、取得結果のチャンネルのヘッダと説明の項目から改行コード( \n
)の削除と https://
の文字列を削除しています。(後続のテキスト成形・投稿時に崩れることがあったための対応)
テキストの整形
次に取得したチャンネル一覧を投稿するMarkdown形式のテキストに整形します。
まず一覧をチャンネル名(英名)でソートしています。
Markdown形式のテキストへの整形ですが、今回は Jinja2 を使ってテンプレートからテキストを生成するようにしています。
- テンプレート
| # | channel | display_name | header | purpose |
|:-:|:--|:--|:--|:--|
{%- set ns = namespace(idx = 1) -%}
{% for c in chs %}
| {{ ns.idx }} | ~{{ c['name'] }} | {{ c['display_name'] }} | {{ c['header'] }} | {{ c['purpose'] }} |
{%- set ns.idx = ns.idx + 1 -%}
{%- endfor %}
Mattermostの機能で ~チャンネル名
にするとチャンネルへのリンクになります。
Jinja2についての詳細な説明は省略しますが、テンプレート内でのインクリメントに少し手間取りました。。
Mattermostの投稿にはMarkdown形式のテキストが使えるのが便利ですね。
チャンネル一覧を投稿
最後に作成したMarkdown形式のテキストを投稿します。
APIリクエストヘッダの Authorization: Bearer
にBotアカウントのトークンをセットします。
パラメータは必須のチャンネルIDとメッセージのみ渡しています。(メッセージに生成したテキストをセットします)
※MattermostAPIでのメッセージの投稿は こちらの記事 もご参照ください
成功するとチャンネルに投稿できていることが確認できます。
というわけでMattermostAPIを使ったチャンネル一覧取得と投稿のご紹介でした。
そんなMattermostを使ったディーメイクで運営しているエンジニアの情報交換チャットにご参加いただけます。
興味がありましたら以下からご登録ください。
https://d-challenge.chat.d-make.co.jp/signup_user_complete/?id=kqy6hqpfq7frtnqpmyqaj4sm7h
2021-5-14 追記:
Mattermostのスラッシュコマンド機能を使ってチャンネル一覧を取得する方法の紹介記事を公開しました。
弊社ではエンジニア募集してます。
https://www.wantedly.com/companies/company_6372758/projects
気になった方はお気軽にご連絡ください。(カジュアル面談でちょっと話が聞きたいという方は自分のtwitter宛にDMをいただく形でも大丈夫です)