夏休みの宿題やり残してませんか?Slackフリープランの利用上限が変更される前にメッセージとファイルのエクスポートをしておく!

夏休みの宿題は終わらせずに先生が諦めるまでじっと耐え忍ぶタイプでした。
2022.08.29

こんにちは、平野です。

Slackのフリープランの利用上限が2022/09/01から変更となります。

Slack 初の料金改定とフリープランの内容変更のお知らせ

9/1からは、

過去 90 日間のメッセージ履歴とファイルストレージを無制限に利用できる

ようになります。 これまではメッセージ件数での上限設定でしたので、 ずっと古いメッセージであっても、全体の件数が多くなければ保持されている状態でしたが、 今後は直近90日しかメッセージを参照できなくなるという変更となります。 ただし90日以内であればファイルストレージには制限がなくなります。

私はフリープランをメモ書き場所として利用しており、 全体の件数は少ないものの、ほとんどが90日以上経過しているメッセージとなっていました。 ということで、これをエクスポートするという宿題を夏休み終了間近のタイミングでやっていこうと思います!

公式のエクスポート機能

まず話の前提として、Slackでは公式にメッセージのエクスポート機能が提供されています。 しかしフリープランでエクスポートできるのはパブリックチャンネルのみなので、 プライベートチャンネルやDMはエクスポートされません。 よって、今回はこの方法以外で、プライベートチャンネルやDMのエクスポートもされることをゴールとします。

使用上の注意

この記事は、あくまでも私の使用環境においてうまくいったというだけの情報となります。

Slackはさまざまな機能がありますが、私がそのワークスペースで使っていた機能はごくごく一部だけです。 下記にそのワークスペースの概要を書きますので、ご承知おき下さい。

  • 私用のメモを書き残す場所として使用
  • メッセージ数は1500程度
  • ただURLを貼っただけのメッセージが多い
  • 一部には写真や動画、PDFなどを貼り付けたメッセージもある
  • プライベートチャンネルはなし
  • botはごく初歩的なものは動作していた
  • 今回の出力においては多少無理をしてもデータさえ出力できれば良い
    • 出力に使うアプリなどのお片付けは考えない
  • 「念の為外に残しておきたい」ぐらいの感覚である
    • 発言の順序やどのチャンネルで行われたのかなどの情報は最悪抜け落ちても良いと思っている

テキスト情報の出力

これに関しては、

Slackのチャンネルとダイレクトメッセージをエクスポートする

というドンピシャな記事がすでにありましたがので、こちらをそのまま使わせて頂きました。 やることは全てこちらのブログおよびリンク先のGitHubに書かれています。 ですので、このブログでは実際にやってみた結果についてをできるだけ書いていきたいと思います。 後述するように、一点だけ私の環境ではうまく行かなかった所はありましたが、 それ以外はもう完全におまかせで大丈夫でした。

やってみた

APIのアクセストークンの取得方法についてもGitHubのREADMEに書かれていますので、それにそのまま従うだけで特に難しいところも有りませんでした。 アクセストークン取得後、以下のようにPythonスクリプトを実行しました。

python thamaa.py --token <token> --output-dir output --output-format jsonl

出力形式としてはjsonlとしました。 実行すると、取得を行っているチャンネル名がログに表示され、 発言が多いチャンネルでは少し時間がかかるので、しっかり進んでいる感があります。 とはいえ、私の環境(1500メッセージ程度)であれば、2分くらいで完了しました。

outputディレクトリの中に、各チャンネルごとのjsonlファイルが出力されました。 中を見てみると、発言の順序についても保たれているように見えました。

出力チャンネル

上記プログラムを実行した際に、出力が確認できたチャンネルを挙げます。

  • パブリックチャンネル
    • 自分が参加しているもの
    • 自分が参加していないもの
  • DM
    • 他の人とのDM
    • 自分自身とのDM
    • SlackBotなど、botとのDM

逆に、出力されなかったチャンネルとして、

  • 「Slackコネクトのつながり」のDM(以下、「コネクトDM」)

がありました。これについては後述します。

なお、前述の通り、このワークスペースにはプライベートチャンネルがなかったのですが、 自分以外のメンバーのDMは保存されなかった(見れちゃったら怖い)ので、 プライベートチャンネルについても自分が所属しているもののみが保存されるものと思います。

コネクトDM

これは別のワークスペースのユーザとのチャットのことですが、 このプログラムでは、コネクトDMがあるとプログラムが途中で例外を出して止まってしまうようでした。 ちょっと見てみたところコネクトDMは、is_sharedという項目がTrueになるようなので、 以下のようなif文で出力を諦めることでプログラムを最後まで動作させることができました。

修正箇所抜粋

    for channel in channels:
        if channel.get("is_shared"):
            continue
        channel_id = channel["id"]
        channel_name = channel.get("name") or users[channel.get("user")]["name"]

私の場合、コネクトDMは完全にテストでしか使っていなかったので、 保存をしたいという需要は皆無でしたので、何も考えずに出力しない方法を選びました。 出力が必要な方は、、、頑張ってくださいね!

添付ファイルのダウンロード

上記で、テキストをjsonlとして保存することはできました。 少なくとも私の用途としては、ほぼこれで十分でした。 しかし、一部のチャンネルでは画像を色々貼っていたことを思い出しました。 ここはもうひと頑張りして、添付されたファイルも保存したいと思います。

ここに書くやり方は非常に雑です。 あまり時間がなかったことと、最悪保存されてなくてもそこまで困らない、 という状況であったので、これで良しとしています。 ここは人によって状況は違うので、適宜工夫をお願いします。

ダウンロードURLの取得

保存されたjsonlの中にはurl_private_downloadという項目があり、そこにはファイルダウンロード用のURLが書かれています。 丁寧にやるならjsonlをjqなどを使ってurl_private_downloadの項目を取ってくるのは正しいやり方だとは思いますが、 それも面倒だったので、 jqコマンドで整形(適切に改行を入れる)して、url_private_downloadを含む行だけを残す、という洗いやり方で行いました。 コマンドラインだとこんなイメージです。

cat general.jsonl | jq | grep 'url_private_download'

もちろんこの結果はjsonlの一部だけを抜いてきたものなので、その後の整形は手動で行います。

ダウンロード実行

複数のファイルをダウンロードするので、最初はwgetコマンドを使用して、

wget https://files.slack.com/files-pri/XXXXXXXXX-YYYYYYYYY/download/______31_________________________________________________________.pdf

という具合にやって見たのですが、このURLは直接ファイルのURLなのではなく、 あくまでもファイルのダウンロードを開始するページのURLのようなので、これではうまく行きませんでした。

なので、安直にこれをブラウザで開いてやればダウンロードできるはず、ということで、

open https://files.slack.com/files-pri/XXXXXXXXX-YYYYYYYYY/download/______31_________________________________________________________.pdf

という風にやってみました。 openは関連付けられたアプリケーションでファイル等を開くコマンドですが、URLの文字列なら規定のブラウザで開いてくれます。 なお、openはMacのコマンドですが、他のOSでもたいてい同様のコマンドが用意されていますので、適宜置き換えてください。

結果として、これでばっちりでした。 ダウンロードしたかったファイルは80個ほどありましたが、特に問題なく全てダウンロードできました。 なお、連続でファイル取得をリクエストするので、各コマンドの間にスリープなどを入れてあげた方が精神衛生上良いかと思います。

ポイントとして、 自動でファイルを全取得したいということは、対象ファイルが数十個程度はある状態だと思います。 なので、ブラウザの保存先フォルダは、一旦この出力以外のものを別の場所に退避させておくことをおすすめします。

また、保存されるファイル名はそれぞれのurl_private_downloadに書かれているもののファイル名(最後の/より後ろ部分)になります。 数が多いと当然かぶりが出てくることが考えられますが、少なくとも私の環境(Chromeを使用)では、 同名になってしまう別ファイルをダウンロードする際には自動的に(1)などをつけてくれるので、 ファイルが上書きされてしまうということはありませんでした。

注意点

今回の雑なやり方においては、 どのファイルがどのメッセージに紐づいていたのか、 という情報については特に考慮していません。

今回の私の利用用途としてはこれで十分だったため、深追いしていませんが、 ファイルパスはjsonlの中で定義されていますので、整理すれば紐付け情報を作ることは可能かと思います。

まとめ

2022/09/01以降、Slackの無料プランだと直近90日のデータしか見えなくなってしまうので、メッセージをエクスポートをする必要がありました。 素晴らしい記事 が有り、その通りにやるだけでメッセージの出力は簡単にできました。 添付ファイルについても、特別うまいことをすることなく、URLを開くだけでダウンロードも可能でした。

ただあくまでも筆者のメモ書き環境でうまくいったというだけの話なので、色々な機能を使い倒しているワークスペースの場合はここまで簡単にできるかはわかりません。 夏休み中(8月末まで)に間に合わなかった場合も、データ自体が消えてしまうわけではなく、単に見えなくなるだけなので、 後で落ち着いた時に保存してみても良いと思います。

それではみなさん夏休み最後の数日を有意義にお過ごしください。

その他参考情報