Mattermost を利用したSlackのログ取り
Slackの無料プランでは、発言が1万件を超えた場合、古いものから順に見れなくなっていきます。有料プランに移行する方法もあるのですが、なるべくコストを抑えてこの問題を解決したいために、Slackによく似たOSSを利用できないかを考え、Mattermostというossにたどり着きました。しかしながら、今更SlackのチャンネルユーザーがMattermostに登録し直すのはかなりめんどくさいので、Slackの発言をMattermostに転送することでログを残せないかを考えました。
[完成イメージ]
- Slack側
- Mattermost側
使用するもの
- Mattermost
- Slack
- Google Apps Script (GAS)
- Google Cloud Pratform (GCP)
Mattermostの導入
参考①:https://docs.mattermost.com/install/install-rhel-71.html
参考②:https://qiita.com/hanaita0102/items/a684effed7e2cba157ae
ちなみに私が導入した時はバージョンが 4.8.0 でした。バージョンはこちらでチェック。
サーバーはGCPの無料枠を採用しました。
転送方法
1.Mattermostで内向きのウェブフックの設定
- Mattermostのメニューの統合機能から内向きのウェブフック(Incoming WebHooks)を設定します。
- 転送したいチャンネルを指定します。タイトルと説明は任意で構いません。
- ユーザー名とプロフェール画像については空欄にしておきます(Slackから反映させるため)。
- 後ほどURL(一部モザイクのところ)を利用いたします。
2.Slackで外向きのウェブフックの設定
Slackのメニューの Administration > Manage apps から Custom Integrations を選択します。
今回は Outgoing WebHooks を選択します。
Integration Settings 内の Channel を転送したいチャンネルに設定しておきます。
後ほどToken(黒塗り)を使用します。
また、以下のURLからSlack APIのトークンも取得しておきます。
https://api.slack.com/custom-integrations/legacy-tokens
3.GASにコードを記述
以下のコードを作成しました。みんな大好きレッツコピペ。
function doPost(e) {
var t = e.parameter.token;
//slackのwebhookトークン照合
if( t != "[slack WebHook Token]")
{return;}
var chName = e.parameter.channel_name;
var userName = e.parameter.user_name;
//slackapiのためのコード
var user_options = {
"method" : "post",
"payload" : {
"token" : "[slack API Token]",
"user" : e.parameter.user_id,
}
};
var response = UrlFetchApp.fetch("https://slack.com/api/users.info", user_options);
var json = JSON.parse(response.getContentText());
var name = json["user"]["real_name"]; //本名表示
var image = json["user"]["profile"]["image_24"]; //発言者のslackアイコンを指定
var msg = "チャンネル名:" + chName + "\n内容 : "+ e.parameter.text ;
var payload = {
"text" : "Slackから転送\n" + msg, //転送メッセージを設定
"icon_url" : image, //アイコン画像を設定
"username" : name, //Mattermostでの表示名を設定
}
postMmost(payload);
}
function postMmost(payload)
{
var options = {
"method" : "POST",
"contentType" : "application/json",
"payload" : JSON.stringify(payload)
}
var url = "[MatterMost Incoming Webhook URL]";
var response = UrlFetchApp.fetch(url, options);
var content = response.getContentText("UTF-8");
}
5行目の[slack WebHook Token]を先ほど発行したSlackのWebHooksのトークンに書き換えます。
15行目の[slack API Token]をSlackのAPIアクセストークンに書き換えます。
44行目の[MatterMost Incoming Webhook URL]を、先ほどのMattermostのWebHookで設定したURLに書き換えます。
4.実行
ウェブアプリケーションとして実行します。
すると「現在のウェブアプリケーションのURL」が出てくるのでそのURLをSlackのWebHooksの設定画面のURLの欄(赤矢印)に入力し保存します。
5.設定したチャンネルで発言する
・Slack側
・Mattermost側
と、こんな感じになります。
課題点
- 転送するチャンネル毎に手作業で追記しなければならない
- 画像がslack内のリンクになる
- @付きの発言ではslackユーザーIDが転送される
- Slack上での発言の編集結果は転送されない
後記
多少問題点がありますが、これで無料でのslackのログ取りが可能となりました。
\(^o^)/