LoginSignup
5
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-09

経緯

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

[完成イメージ]

  • slack側
    slack.png

  • Mattermost側
    mm.png

使用するもの

Mattermost
Slack
Google Apps Script
Google Cloud Pratform

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(一部モザイクのところ)を利用いたします。
スクショ.png

2.Slackで外向きのウェブフックの設定

 Slackのメニューの Administration > Manage apps から Custom Integrations を選択します。
 今回は Outgoing WebHooks を選択します。
 Integration Settings 内の Channel を転送したいチャンネルに設定しておきます。
 後ほどToken(黒塗り)を使用します。
100.png

 また、以下のURLからSlack APIのトークンも取得しておきます。
 https://api.slack.com/custom-integrations/legacy-tokens

3.GASにコードを記述

 以下のコードを作成しました。みんな大好きレッツコピペ。

Slack2Matter

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.実行

 ウェブアプリケーションとして実行します。

スクリーンショット 2018-04-09 17.10.21.png

 すると「現在のウェブアプリケーションのURL」が出てくるのでそのURLをSlackのWebHooksの設定画面のURLの欄(赤矢印)に入力し保存します。

スクリーンショット 2018-04-09 17.13.35.png

100.png

5.設定したチャンネルで発言する

  • slack側 
    slack.png
     

  • Mattermost側
    mm.png

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

課題点

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

結論

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

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3