Slackの投稿データをMattermostに移行してみる

## 背景と概要

Slackのフリープランを自分のメモ用と家族の情報共有用に使っていたが、2022年9月1日に[料金プランが更新](https://slack.com/intl/ja-jp/help/articles/7050776459923-%E3%83%97%E3%83%AD%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AE%E6%96%99%E9%87%91%E6%94%B9%E5%AE%9A%E3%81%A8%E3%83%95%E3%83%AA%E3%83%BC%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AE%E6%9B%B4%E6%96%B0)され、フリープランだと過去90日間の投稿しか見れなくなってしまった…。昔のメモが見れなくなってしまうのは若干困るのだが、有料プランに変更するほど使いまくっているわけでもなく、可能ならば無料のままで過去の投稿も見れるようにしたい。
[Mattermost](https://mattermost.com/)だとSlackみたいなサービスを自分で構築できるので、今までのSlackの投稿データをMattermostに移行してみることにした。

この種の情報はググると沢山出てくるので、基本的な手順などは各記事へのリンクを参考にしていただきたい。本記事では、これらのリンクの情報を参考にしてどのように移行したかを記載する。

また移行において[slack-export](https://github.com/thamaa/slack-export)のPythonツールを使わせていただいたが、[slack_export.py](https://github.com/thamaa/slack-export/blob/main/slack_export.py)の修正が必要で、そのやり方に関しては現状**テキストでの簡単な記載しかしていない不完全な状態**なのでご了承願いたい。

## 手順

### (1) Mattermost環境の構築

例えば以下のサイトを参考に、Docker Composeで作成する。

https://qiita.com/gucchy55/items/a575547a02679f212582

### (2) Slackの投稿データのエクスポート

以下のREADMEとソースを参考にさせていただいた。

https://github.com/thamaa/slack-export

#### (2-1) エクスポート用のアプリを作成

上の記事のREADMEにも書かれているが、事前にエクスポート用のアプリを[こちら](https://api.slack.com/apps)から作る必要がある。

* 手順概要
    * 右上の「Create New App」ボタンをクリック
    * 「From an app manifest」を選択して、以下のYAMLマニフェストを記載
        * [manifest.yaml](https://github.com/thamaa/slack-export/blob/main/manifest.yaml)とほぼ同じ内容
    * **アプリ作成後に発行されるOauth Tokenを以後利用するので控えておく**

    ```yaml
    display_information:
      name: [任意の名前]
    oauth_config: 
      scopes:
        user:
          - channels:history
          - channels:read
          - groups:history
          - groups:read
          - im:history
          - im:read
          - mpim:history
          - mpim:read
          - users:read
     settings:
      org_deploy_enabled: false
      socket_mode_enabled: false
      token_rotation_enabled: false
    ```

#### (2-2) 投稿データのエクスポート

[こちら（再掲）](https://github.com/thamaa/slack-export)のツールを参考にjson形式のエクスポートデータを作成する。
現時点だと「各チャンネルの投稿テキスト」と「ダイレクトメッセージ」のみの出力で、これだけではMattermostへのインポートのために必要なデータが足りない模様。これ以外にもいくつか修正必要で、ソース[slack_export.py](https://github.com/thamaa/slack-export/blob/main/slack_export.py)で修正が必要な内容を以下に記載する。（本当は作ったソースをGitHubとかに上げればいいのだが、現状は文章のみでの共有になっておりあしからず）

* 投稿データの出力ディレクトリの変更
    * 元のソースは「指定したディレクトリ」直下に出力されるので、各チャンネル（および各ダイレクトメッセージ）毎にその名前のディレクトリを個別に作って、jsonファイルはそこに格納するよう修正
* ``fetch_users``関数で取得したユーザ一覧
    * https://api.slack.com/methods/users.list を利用する
    * ファイル名は``users.json``で保存
* ``fetch_channels``関数で取得したチャンネル一覧
    * https://api.slack.com/methods/conversations.list を利用する
    * ファイル名は``channels.json`` で保存

```
$ python slack_export.py \
--token [アプリ作成時に発行されたトークン] \
--output-dir output \
--output-format json
```

outputディレクトリの構成は以下のような感じになる。各ディレクトリのmessages.jsonは任意のファイル名で問題なさそう。

```
$ tree ./output
./output
├── channels.json
├── users.json
├── general
│   └── messages.json
├── random
│   └── messages.json
├── channel1
│   └── messages.json
├── channel2
│   └── messages.json
...
├── direct-message1
│   └── messages.json
...
```

:::note info
上記のディレクトリ構成は、[Slackからデータをエクスポート](https://slack.com/intl/ja-jp/help/articles/201658943-%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B)した際のzipを展開してみると参考になる。また、[こちら](https://slack.com/intl/ja-jp/help/articles/220556107-Slack-%E3%81%8B%E3%82%89%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%AA%AD%E3%81%BF%E6%96%B9)にもフォーマットの説明があり助けになりそう。
:::

エクスポートしたデータはzip化する。

```
$ cd ./output
$ zip -r slack_export.zip .
```

``slack_export.zip``は次の手順で利用する。

:::note warn
フリープランの場合、過去90日間の投稿データしかエクスポートできない。過去データもエクスポートしたい場合は、30日間の無料トライアルモード等を使う必要あり。
:::


### (3) Mattermostへのインポート

下記サイトを参考に行うが、微妙に手順のカスタマイズが必要。

https://katblog.manadream.net/index.php/2022/07/23/mattermost-slack-data-import/?utm_source=pocket_mylist

カスタマイズ部分は以下

* **不要箇所**
    * [3. slackのデータをエクスポート](https://katblog.manadream.net/index.php/2022/07/23/mattermost-slack-data-import/?utm_source=pocket_mylist#slack) 、 [4. slack API トークン発行](https://katblog.manadream.net/index.php/2022/07/23/mattermost-slack-data-import/?utm_source=pocket_mylist#slack_API)
        * 既に [(2) Slackの投稿データのエクスポート](https://qiita.com/showchan33/items/e9a3860b1d1becdca0ed#2-slack%E3%81%AE%E6%8A%95%E7%A8%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88) で済んでいるので不要
        * こちらの手順では「パブリックチャンネルのみ」エクスポート可能だが、本記事の手順で生成した``slack_export.zip``にはプライベートチャンネルも含まれる
* **カスタマイズ箇所**
    * [5. 移行データの作成](https://katblog.manadream.net/index.php/2022/07/23/mattermost-slack-data-import/?utm_source=pocket_mylist#i-3)
        * ``{発行したslack API トークン}``は、[(2-1) エクスポート用のアプリを作成](https://qiita.com/showchan33/items/e9a3860b1d1becdca0ed#2-1-%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E7%94%A8%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90) で発行したトークンを使う
        * ``{slackからエクスポートしたファイル名}.zip``は、[(2-2) 投稿データのエクスポート](https://qiita.com/showchan33/items/e9a3860b1d1becdca0ed#2-2-%E6%8A%95%E7%A8%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88) で作成した``slack_export.zip``に置き換える

## おわりに（課題など）

上手く行けば、MattermostにSlackの情報が移行できているはず！
だが課題も結構多くあり以下に遺す。今後もっと簡単に移行できるようにノウハウやツールのアップデートも必要かも。

* 日本語で作ったチャンネル名が反映されず、代わりにチャンネルIDで設定されしまう
* 添付ファイルが一部しか移行できていない
* 移行したチャンネルが全てパブリックチャンネルになっている
* 各チャンネルの所属メンバー情報が反映されていない
    * 以下のAPIでメンバーを取得可能なのと、
        * https://api.slack.com/methods/conversations.members
    * 上記APIで取得した結果を [(2-2) 投稿データのエクスポート](https://qiita.com/showchan33/items/e9a3860b1d1becdca0ed#2-2-%E6%8A%95%E7%A8%BF%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88) で出力する``channels.json``の各要素に``"members": ["A", "B", "C" ...]``のように追加すれば反映されることは確認済

* ダイレクトメッセージが移行できていない