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
Learn how to build bot users, send notifications, and interact with workspaces using our APIs.

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

コメント