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のトークンも取得しておきます。

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^)/