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