sponsored link

Mattermost を利用したSlackのログ取り

Slackの無料プランでは、発言が1万件を超えた場合、古いものから順に見れなくなっていきます。有料プランに移行する方法もあるのですが、なるべくコストを抑えてこの問題を解決したいために、Slackによく似たOSSを利用できないかを考え、Mattermostというossにたどり着きました。しかしながら、今更SlackのチャンネルユーザーがMattermostに登録し直すのはかなりめんどくさいので、Slackの発言をMattermostに転送することでログを残せないかを考えました。

[完成イメージ]

・Slack側

Slack

・Mattermost側

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

Legacy tokens
Create legacy tokens for use in ad-hoc tests against your own workspace. We recommend using a Slack app instead.

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側

slack

・Mattermost側

mattermost

 と、こんな感じになります。

課題点

  • 転送するチャンネル毎に手作業で追記しなければならない
  • 画像がslack内のリンクになる
  • @付きの発言ではslackユーザーIDが転送される
  • Slack上での発言の編集結果は転送されない

後記

多少問題点がありますが、これで無料でのslackのログ取りが可能となりました。

\(^o^)/

タイトルとURLをコピーしました