ディーメイクからのお知らせや技術情報などをお届けします

ディーメイクブログ

lambda Mattermost Mattermost API

Mattermostでチャンネル一覧を取得する

更新日:

こんにちはエンジニアの 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

処理の流れは

  1. MattermostAPI公開チャンネル取得API)でチーム内の公開チャンネル一覧取得
  2. 取得した一覧をMarkdownの表形式に整形して投稿するテキストを作成
  3. MattermostAPI投稿API)で 2. のテキストを投稿

またLambdaの環境変数として以下を持っています。

  • MatternostのURL
  • チャンネル一覧を取得するチームID
  • チャンネル一覧を投稿するチャンネルID
  • Botアカウントのトークン

では処理の詳細をかんたんに解説します。(ソースコードについてはGitHubを参照してください)

Mattermost導入サービス
Mattermost導入支援

チーム内の公開チャンネル一覧取得

最初にチャンネル一覧を取得します。

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をいただく形でも大丈夫です)


おすすめ記事リンク

-lambda, Mattermost, Mattermost API
-, ,

Copyright© ディーメイクブログ , 2021 All Rights Reserved.