背景と概要
Slackのフリープランを自分のメモ用と家族の情報共有用に使っていたが、2022年9月1日に料金プランが更新され、フリープランだと過去90日間の投稿しか見れなくなってしまった…。昔のメモが見れなくなってしまうのは若干困るのだが、有料プランに変更するほど使いまくっているわけでもなく、可能ならば無料のままで過去の投稿も見れるようにしたい。
MattermostだとSlackみたいなサービスを自分で構築できるので、今までのSlackの投稿データをMattermostに移行してみることにした。
この種の情報はググると沢山出てくるので、基本的な手順などは各記事へのリンクを参考にしていただきたい。本記事では、これらのリンクの情報を参考にしてどのように移行したかを記載する。
また移行においてslack-exportのPythonツールを使わせていただいたが、slack_export.pyの修正が必要で、そのやり方に関しては現状テキストでの簡単な記載しかしていない不完全な状態なのでご了承願いたい。
手順
(1) Mattermost環境の構築
例えば以下のサイトを参考に、Docker Composeで作成する。
(2) Slackの投稿データのエクスポート
以下のREADMEとソースを参考にさせていただいた。
(2-1) エクスポート用のアプリを作成
上の記事のREADMEにも書かれているが、事前にエクスポート用のアプリをこちらから作る必要がある。
-
手順概要
- 右上の「Create New App」ボタンをクリック
- 「From an app manifest」を選択して、以下のYAMLマニフェストを記載
- manifest.yamlとほぼ同じ内容
- アプリ作成後に発行されるOauth Tokenを以後利用するので控えておく
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) 投稿データのエクスポート
こちら(再掲)のツールを参考にjson形式のエクスポートデータを作成する。
現時点だと「各チャンネルの投稿テキスト」と「ダイレクトメッセージ」のみの出力で、これだけではMattermostへのインポートのために必要なデータが足りない模様。これ以外にもいくつか修正必要で、ソース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
...
上記のディレクトリ構成は、Slackからデータをエクスポートした際のzipを展開してみると参考になる。また、こちらにもフォーマットの説明があり助けになりそう。
エクスポートしたデータはzip化する。
$ cd ./output
$ zip -r slack_export.zip .
slack_export.zip
は次の手順で利用する。
フリープランの場合、過去90日間の投稿データしかエクスポートできない。過去データもエクスポートしたい場合は、30日間の無料トライアルモード等を使う必要あり。
(3) Mattermostへのインポート
下記サイトを参考に行うが、微妙に手順のカスタマイズが必要。
カスタマイズ部分は以下
-
不要箇所
-
3. slackのデータをエクスポート 、 4. slack API トークン発行
- 既に (2) Slackの投稿データのエクスポート で済んでいるので不要
- こちらの手順では「パブリックチャンネルのみ」エクスポート可能だが、本記事の手順で生成した
slack_export.zip
にはプライベートチャンネルも含まれる
-
3. slackのデータをエクスポート 、 4. slack API トークン発行
-
カスタマイズ箇所
-
5. 移行データの作成
-
{発行したslack API トークン}
は、(2-1) エクスポート用のアプリを作成 で発行したトークンを使う -
{slackからエクスポートしたファイル名}.zip
は、(2-2) 投稿データのエクスポート で作成したslack_export.zip
に置き換える
-
-
5. 移行データの作成
おわりに(課題など)
上手く行けば、MattermostにSlackの情報が移行できているはず!
だが課題も結構多くあり以下に遺す。今後もっと簡単に移行できるようにノウハウやツールのアップデートも必要かも。
-
日本語で作ったチャンネル名が反映されず、代わりにチャンネルIDで設定されしまう
-
添付ファイルが一部しか移行できていない
-
移行したチャンネルが全てパブリックチャンネルになっている
-
各チャンネルの所属メンバー情報が反映されていない
- 以下のAPIでメンバーを取得可能なのと、
- 上記APIで取得した結果を (2-2) 投稿データのエクスポート で出力する
channels.json
の各要素に"members": ["A", "B", "C" ...]
のように追加すれば反映されることは確認済
-
ダイレクトメッセージが移行できていない