うるおいらんど
アイキャッチ画像

Slackのメッセージをローカルに保存するツールを作ってみた【Deno】

Deno

どうも、Reoです。

Slack Message ExporterというSlackのメッセージをCSVやHTML形式で保存するツールを作りました。

リポジトリ

リポジトリを公開しています!

uruly/SlackMessageExporter

READMEをちゃんと用意しました。細かい使い方はREADMEに任せて、このブログでは簡単に紹介していこうと思います。

きっかけ

今回このツールを作った理由は、メンターをしている方とのワークスペースで、回答した内容を確認したかったからです。

Slack にはフリープランとプロプランがあります。プロプランの場合には全てのメッセージにアクセスすることができますが、フリープランでは直近90日以内のメッセージにしかアクセスできません。(その他にビジネスプランとEnterprize Gridプランもあります)

確認したかった内容は90日より前のメッセージで、プロプランのトライアルを使って閲覧しました。

最近では公私ともにSlack を使うことが減ってきてしまっていて、プロプランに課金するにはあまりに使っていなさすぎます。せっかくトライアルをしているんだから、今のうちに全部メモしておこう!と思い、ツールを作ってみました。

機能

  • Slackのチャンネルを丸ごとローカルに保存します。
  • CSVとHTMLへの書き出しができます。
  • 添付されたファイルをローカルに保存します。
  • publicチャンネルとprivateチャンネルのどちらでも利用できます。

htmlファイルを開くと、上記画像のように表示されます。

html では年ごとに目次も作成されるようになっています。画像やコードブロック等も見やすいので、csvよりhtmlでの書き出しをオススメします。

環境

Deno で動きます🦕

$ deno --version

deno 2.1.6 (stable, release, aarch64-apple-darwin)
v8 13.0.245.12-rusty
typescript 5.6.2

作り方

サクッとバックアップができればいいなと思って作り始めたので、ほとんど ChatGPTに書かせました。

Slack API と Deno を使ってメッセージをCSVに保存するコードを書いてください。

この一言でcsvの書き出しの枠組みができました。それからうまくいってない部分を置き換えたり、添付ファイルを取得する等の追加機能をつけていきました。

最終的に csv じゃなくて html の方が見やすくない?と思い、html での書き出しも追加しました。(Twitter のツイートバックアップを取得するとhtmlでダウンロードできていたことを思い出し、その方法にしました。Xになった今もそうなのかな?)

Slack Apps

Slack API を用いてメッセージを取得するために、Slack Apps よりアプリを作って、ワークスペースとチャンネルに追加する必要があります。

Slack Appsよりアプリを用意します。

OAuth & Permissionsより OAuth Token の取得とBot Token Scopesの設定が必要になります。

Bot Token Scopes で権限も与えてあげます。

  • channels:history (publicチャンネルのメッセージ取得に利用)
  • files:read (添付ファイルの取得に利用)
  • users:read (ユーザー名やアイコンの取得に利用)
  • channels:read (publicチャンネルの名前取得に利用)
  • team:read (ワークスペースの名前取得に利用)
  • groups:history (privateチャンネルのメッセージ取得に利用)
  • groups:read (privateチャンネル名の取得に利用)

ワークスペースにインストールしたら、メッセージを保存したいチャンネルにアプリを追加します。

/invite @MessageExporter

/invite を打つとアプリを追加するメニューが出てきます。このチャンネルにアプリを追加するから追加することもできますが、この方法だとアプリが出てこないことがあったので、/invite @MessageExporter とした方が早いです。

また、メッセージを保存したいチャンネルのIDも確認しておきます。 右上のメニューから「チャンネル詳細を開く」を選択します。

1番下にチャンネルIDがあります。

これでメッセージを取得する準備ができました。

ツールを使う

SlackMessageExporterをクローンします。

git clone https://github.com/uruly/SlackMessageExporter
cd SlackMessageExporter

.envファイルを作って、先ほどのOAuth TokenとチャンネルIDを入力します。

チャンネルIDは.envに書いてもいいし、wizard でも入力できるようにしました。

# Slack Bot Token
SLACK_BOT_TOKEN=your-slack-bot-token

# Slack Channel ID
SLACK_CHANNEL_ID=your-channel-id

.envを用意したら実行します。

deno run --env --allow-net --allow-write --allow-read --allow-env index.ts

チャンネルIDを .env に設定していても、別のチャンネルIDを書けばそのチャンネルから取得ができます。(ただし、bot をチャンネルに追加するのを忘れないでください。) デフォルトは全部Yesで、全てのファイルを書き出します。

outputs ディレクトリ(もしくはwizardで指定したフォルダ)に書き出されます。

htmlファイルを開けばローカルでメッセージを閲覧することができます。

フリープランの場合

フリープランの場合は、90日以内のメッセージのみが取得できます。 Slack アプリ自体は10個まではインストールができるそうなので、作ったアプリを導入してメッセージを保存すること自体はできました。

絵文字

Slack のショートコード (例 :bow: 等)をそのまま絵文字に変換するのがうまくいかず、emoji_map.json で手動で追加しています...。

知らないショートコードがあれば unknown_shortcods.jsonに吐き出されるので、それを emoji_map.json に追加するという運用です...。

なんか上手いやり方があれば修正したいところです。

おわりに

数日後にはフリープランに戻ってしまうのと、最近ではほとんどSlackを使うことがなくなってしまったことから、このツールの保守もやらないんじゃないかと思います。せっかくなので公開...といった感じです。

コードもほとんどChatGPTに書かせたし、うまく書けているかすらも自信はないですが、初心忘るべからずでアウトプットとしておいておきます。正直wizard機能とかはいらないぐらいなんですけど、実装してみたかったから実装してみました。

こういうツールを作るときは毎回Swiftを使っていましたが、UIが必要ないツールは全然コレでいいですね。Deno かわいいのでもっと使っていきたいです。

でもSlackの人からするとあんまり快くないだろうツールだな...とも思い...少し心も痛むなり(課金しなくてすまんです。)

ではでは。何かの参考になれば嬉しいです。

ちなみに Slack は滅多に使ってないけどちゃんとログインしているので連絡くれたら反応しますので気軽にご連絡ください。🙇‍♀️

Comments

コメントはありません。

現在コメントフォームは工事中です。