無料版Slackのメッセージが90日で消えちゃうらしいのでDiscordにメッセージを移行させるツール作った

## 2022/08/28追記

①
↓の記事からリンクされていることに気づきました。

https://zenn.dev/yogarasu/articles/10637328b9739c

こちらはCLIですが、よりリッチにメッセージの移行ができるみたいなので、CLIでもいける！という方はこっち使ったほうがいいかもです！（まあこの記事もCLIいけないとだめですが）

②
Discordのbotでも移行できるようにしてみました。
興味ある方は以下の記事を見てみてください。

https://qiita.com/yuki-n/items/4e59f1c916f02e1cd713

----

数年ぶりの投稿です。

## 背景

自分は、無料版のSlackをメモ帳代わりに使っていて、気になる記事のURLや思いついたことなどを自分のワークスペースにメモっていました。

が、先日以下のような発表がなされまして、これだと今までのメモが消えてしまう、新しくメモっても90日で消えてしまう、と思い、今までのメモを移行しようと思いました。

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%9C%80%E6%96%B0%E6%83%85%E5%A0%B1

移行先として色々検討して、慣れてるしUIもいいし無難にDiscordが良さそうだと思い、Discordに移行させることにしました。

ただ、全部コピペは面倒だし、Slackのエクスポート機能も微妙的なこと書いてある記事があったので、せっかくならプログラム書いて移行させようかと思いました。

## 作ったもの

これです。

https://github.com/yuki-noguchi/slack-message-transfer

Typescript x Next.js x Discord.js x Node Slack SDK x Chakra UIで作っています。

画面は超シンプルなこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177591/557fbbb0-540e-c735-913f-738e1a6d726b.png)


どこにもホスティングしたりしていない＆するつもりもないので、もし使いたい方がいたら`git clone`して`yarn dev`して使ってください。

※本当はSPAで作ってどっかにホスティングしてやろうと思ったのですが、slackのSDKがNode.jsに依存しているせいでブラウザ上で動かせず、さらにWEB APIもブラウザから実行するとCORSエラーになっちゃうので諦めたという経緯があります。SlackとかDiscordのトークンを入力してもらう前提の実装なので、それらのセキュアな情報を自分の立てたサーバーを経由させるの良くないよなーと思い、ホスティングするのはやめた感じです。

## 使い方

雑な使い方も書いておきます。

### SlackでAppを作成する

ここらへんの記事とかを参考に作成してください。

https://qiita.com/sampo-cure/items/6b57d8503e37a0d2d1f6

このとき、

https://api.slack.com/methods/conversations.history

と

https://api.slack.com/methods/conversations.list

にあるScopeを有効にするようにしておいてください。

このSlack AppのOauth Tokenは後で必要になるので控えておきます。

### 作ったSlack Appを移行したいSlackのチャンネルに参加させておく

チャンネル内で、 `@作成したApp名` とすれば召喚できます。

### DiscordでBotを作る

これはここらへんの記事を見ればよくわかります。

https://narikakun.net/technology/dis-saru-3/

`BOT PERMISSIONS`の設定では、`Manage Channels` `Send Messages` のチェックが必要になります。

このBotのトークンはあとで必要になるので控えておきます。

### 移行先DiscordサーバーのIDを控えておく

以下を参考にIDを控えます。

https://support.discord.com/hc/ja/articles/206346498-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8ID%E3%81%AF%E3%81%A9%E3%81%93%E3%81%A7%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%89%E3%82%8C%E3%82%8B-

### ローカルで起動

以下のようにコマンドを実行し、ローカルでプログラムを起動します。

```
git clone https://github.com/yuki-noguchi/slack-message-transfer.git
cd slack-message-transfer
yarn install
yarn dev
```

### ブラウザに移動し、入力項目を埋める

ブラウザから以下のURLにアクセスします。

http://localhost:3000/

以下のような画面が表示されるので、前の手順で控えたそれぞれの値を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177591/557fbbb0-540e-c735-913f-738e1a6d726b.png)

それぞれ入力したら、`取得する`ボタンをクリックします。

すると、以下のような感じでslackチャンネルの一覧が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177591/b96aaaa3-307d-41fe-c25b-01d7eebeaca8.png)

移行を行いたいチャンネルをクリックして表示されるモーダルで、`移行する`ボタンをクリックすると、Dicord側のSlackのチャンネルと同名のチャンネルが作成され、メッセージの移行が実行されます。

### 補足など

バリデーションもしていなければエラーハンドリングもしていない、ワイルド仕様なので、もしなんか動かんってなったらよしなにデバッグをお願いします。

SlackとDiscordのBotを作る過程が割と面倒で、パーミッション周りが実は設定されていなかったみたいなことが起こりがちだと思うので、なんかエラーになったらそこらへん見てもらうと良いかと思います。

あと、メッセージ以外は移行を行うことができません。スレッドの移行とか、リアクションとかはできないです。

## 感想

ちゃんと移行できて大満足。

画面作ってSlackとかDiscordのAPIを呼ぶと、なんかアプリ作ってるライブ感みたいなのが出ていいですね。