数日前、今年の9月1日からSlackのフリープランではメッセージ履歴が過去90日分までしか閲覧できなくなるとの発表がありました。
ただし、改定後のフリープランでは過去のメッセージ履歴やファイルを保存できるのは「最大90日間」のみ。これらの変更も値上げと同時の9月1日から適用され、同日以降は過去90日以前のメッセージやアップロードしたファイルが非表示になる。
90日間を過ぎたメッセージとファイルを閲覧したい場合は、有料プランへのアップグレードが必要。これまで大学のサークル等で無料版を使用していたユーザーは、重要なファイルのバックアップを忘れないようにしたいところだ。
https://forest.watch.impress.co.jp/docs/news/1426026.html より
プライベートでSlackのフリープランを利用しているので、添付ファイルはともかくメッセージが遡れなくなるのはツライところがありますが、幸いSlackにはメッセージを取得するためのAPIが用意されているので、これを使って外部にログを残しておくための簡単なスクリプトを書いてみました。
APIトークンの取得方法
APIを利用するにはトークンが必要になるため、まずは下記の手順でトークンを取得しておきます。下記手順は2022年7月時点の情報で、今後仕様が変更される可能性がある点にはご注意ください。
- サインインした状態でSlack APIのサイトにアクセスします。
- 「Create an app」ボタンをクリックします。
- 「From scratch」を選択します。
- アプリ名の入力(App Name)とワークスペースを選択(Pick a workspace to develop your app in:)し、「Create App」ボタンをクリックします。
- Settingsメニューの「Basic Information」から「Permissions」を選択します。
- Scopesの「User Token Scopes」にある「Add an OAuth Scope」ボタンをクリックします。
- 「channels:history」と「channels:read」を追加します。プライベートチャンネルのメッセージを出力する場合は「groups:history」と「groups:read」も追加します。
- 「OAuth Tokens for Your Workspace」にある「Install to Workspace」ボタンをクリックします。
- 権限のリクエスト画面が表示されたら「許可する」ボタンをクリックします。
- トークンが発行されるので、「User OAuth Token」をコピーしておきます。
以上でAPIトークンの取得作業は終了です。
取得したトークンは漏れないよう保管しておく必要があります。
SlackのメッセージをCSVファイルとして保存するPowerShellスクリプト
今回書いたスクリプトが下記になります。
メッセージを保存できれば保存先は何でも良かったのですが、今回はとりあえず加工しやすいCSVファイルとして出力することにしました。
2022/9/19 追記:
ページ送りに対応し、より多くのメッセージを取得できるようにしました。
チャンネル指定
まずは指定したチャンネルのメッセージを保存するスクリプトです。
スクリプト内のチャンネルIDとトークンは環境に合わせて変更する必要があります。
チャンネルIDはURLやアプリのチャンネル詳細から確認できます。
全パブリックチャンネル
次はAPIでチャンネル情報を取得して、全パブリックチャンネルを対象にメッセージを保存するスクリプトです。
こちらもスクリプト内のトークンを環境に合わせて変更する必要があります。
プライベートチャンネル含む
2022/9/1 追記:
プライベートチャンネルのメッセージを保存する場合は、下記コードのようにチャンネルのリストを取得する際に「private_channel」も指定する必要があります。
出力したCSVファイル
スクリプトを実行すると下図のようなCSVファイルがデスクトップに出力されます。
2、30行程度の簡単なスクリプトですが、これでメッセージのバックアップを取るという目的は達成できました。
参考Webサイト
2022/9/6 追記:
「ファイルもダウンロードできないか?」との質問をいただいたので、Slackにアップされたファイルをダウンロードするスクリプトも書いてみました。
SlackにアップされたファイルをダウンロードするPowerShellスクリプト
チャンネル指定
まずは指定したチャンネルのファイルをダウンロードするスクリプトです。
スコープとして「files:read」を追加する必要があります。
下記スクリプトを実行するとデスクトップにフォルダが作成され、その中にファイルがダウンロードされます。
全チャンネル
続いて全チャンネルを対象としたスクリプトです。
スコープとして「channels:read」、「groups:read」、「files:read」を追加する必要があります。
SlackのメッセージをCSVファイルとして保存するPowerShellスクリプト(本文内のユーザー名置換)
2022/9/19 追記:
本文内のユーザーIDをユーザー名で置換した状態でメッセージを取得するスクリプトを追加しました(プライベートチャンネル含む)。
スコープとして「users:read」、「channels:read」、「channels:history」、「groups:read」、「groups:history」を追加する必要があります。
開発知識がないので困っていたところこちらのスクリプトを見つけてお借りしました。
無事保存でき非常に助かりました。ありがとうございました!
大変便利なコードを公開いただきありがとうございます。
一点質問なのですが、プライベートチャンネルのバックアップはできないのでしょうか?実行した方でどなたかお答えいただければ幸いです。
> タンヤオ 様
ブログ管理者のきぬあさです。
プライベートチャンネルのチャンネルのメッセージも出力する場合は、スコープとして「groups:history」と「groups:read」も追加し、チャンネルのリストを取得する際に「private_channel」も指定する必要があります。
詳細は追記した記事をご参照ください。
こちら、過去全期間のログではないですよね。古いデータがとれていません。
何か原因等お判りでしょうか。
> shiki 様
ブログ管理者のきぬあさです。
APIで取得できる上限がデフォルトで100になっていましたので、スクリプトを一部変更し、ページ送りにも対応しました。