Slackの消えてしまった過去ログの閲覧ツールを作った。

以前から作っていたSlack過去ログ閲覧ツールSlackLogViewerを公開してみる。Wiindows、Mac用にはGitHubでビルド済みの状態でも配布している。Slackフリープランの10000件または90日制限への対策である。詳細は使い方の説明を。

macOS版がm1などApple Silicon搭載機で動作しないという報告があった。当該Macを所有する方は動作確認報告、C++開発スキルをお持ちであれば是非ビルド試験などをして欲しい。

最終更新2022年12月03日。

※本記事は2020年9月28日時点で公開したver1.1.Beta-0を元に必要に応じて追記、修正したものである。新バージョンの更新情報を詳細に知りたい場合はカテゴリー「SlackLogViewer」からより新しい記事へ移動されたい。

背景

Slackは基本的に無料で使用できるが、有料プランも用意されている。特に大きな違いは、過去のメッセージをどれだけ閲覧できるかだろう。フリープランだと10000件までしか遡れないので、活発に動いているワークスペースではすぐに流れて読めなくなってしまう。2022年9月1日以降ではこの保存期間が変更され、10000件の上限は廃止、その代わりに表示可能なメッセージが過去90日間に限定されることになった。90日以内のメッセージ数が10000件を超えるような活発なワークスペースは稀だと思われ、多くの人にとってこの変更は打撃となったようだ。Twitterでも話題になり、本記事のアクセス数が急増した(あんまり素直に喜べない……)。

しかしフリープランであっても過去ログのエクスポートは可能である(方法は「Slack エクスポート」あたりの単語で検索すればすぐに見つかるだろう)。こちらは閲覧できなくなったメッセージまで遡って丸ごとファイルに出力してくれるので、有料プランを使わせてくれない貧乏環境に生きている人たちにとってはありがたい話だ。制限の変更後もExportまで不可能になるとは説明されていなかったので、おそらく9月1日以降も可能だろう。

問題は、このエクスポートされたファイルがjson形式になっていることだ。そのまま読むのはとても大変である。ネット上でこれを閲覧するビューワを探してみたが、あまり良さげなものはなかった。例えばslack-export-viewerなどは致命的なことに検索機能が貧弱だし、どうやら非常に重いらしい。その他にも何かしら「作った」という記事は見つかるのだが、容易に一般利用可能な形では公開されていないようだった。

仕方ないので自作することにした。検索機能もある程度のものを付けた。
結果、以下のようなものが出来上がった。GUIは可能な限りSlackに似せて作ってあるので、操作に困ることは特にないだろう。個人名ややり取りを公開することはできないのでモザイクばかりだが、まあ雰囲気は伝わるかと。

SlackLogViewer

動作環境

WindowsMacLinux。いずれも64bitのみ対象としている1
Windows版は8以降で動くはずだが動作確認は10でしか行っていないので、問題があればコメント等で報告されたい。
Mac上ではcielavenir様のご協力によりver-1.1.Beta-5以降で動作可能になった。ただし開発者の私はMac環境を所持していないため、バイナリを継続的に配布できるかは不明である。もし最新のバージョンにwindows版しかない場合は過去のバージョンいずれかからダウンロードして使うか、もしくはLinuxと同様に自力でビルドして欲しい。なお、少なくともver-1.1.Beta-5にはMac版バイナリがある。
Linuxも同様にver-1.1.Beta-5以降で対応した。CMakeを用いてユーザー自らビルドしてもらう必要があるが、Linuxユーザーならそのくらいは朝飯前だろう。

ビルド方法はこちらの記事を参照されたい

Windowsでの実行時にMSVCP140_____.dllが見つからないなどのエラーメッセージが表示された場合、アイコンなどが正常に表示されない場合は、Visual Studio 2019 用 Microsoft Visual C++ 再頒布可能パッケージを(再)インストールすると解決するかもしれない。このパッケージは名称がころころ変わったりするようだが、2019用が含まれるものが正しいはず。

使い方

  1. エクスポートされたSlackのログファイルを解凍しておく。ver-1.1.Beta-3以降は解凍不要。
  2. Windows、Mac用ソフトウェア本体はこちらからダウンロードできるLinuxの場合はビルド頑張ってください。
  3. SlackLogViewerを実行する。
  4. 左上のメニューアイコンから「Open」を選択。
  5. 解凍済みのSlackログファイルのフォルダを開く(channel.json、user.jsonなどがあるフォルダ)。ver-1.1.Beta-3以降はzipファイルを直接開いてもよい。
  6. 心ゆくまで閲覧すべし。

なおエクスポートしたフォルダはワークスペース名と日付が付いていると思うが、このフォルダ名は変更しないことが望ましい。Cacheフォルダを見てみれば分かると思うが、内部のキャッシュはこのフォルダ名によって管理されており、フォルダ名によってどのExportファイル群かを識別できることを前提にしているためである。まあ区別できれば問題ないし、そうでなくともキャッシュファイルを時々削除していれば無視できるのだが、一応念のため。

できること

  1. ワークスペース開設時まで遡りすべてのメッセージを見ることができる。もちろん本来無料プランでは表示できない10000件or90日よりも前のものまで見られる。
  2. ダイレクトメッセージ、プライベートチャンネルはver-1.2.Alpha-0以降で対応した。ただしエクスポートには有料プランのBusiness+またはEnterprise Gridか、もしフリープランでエクスポートしたいのならslackdumpなどのツールが必要。
  3. 1個以上の単語または正規表現による検索機能も付けた。現在のチャンネルまたは全チャンネルを対象に、メッセージ本文、名前、ファイル名から検索できるが、全チャンネル検索は時間がかかる。Qtとマルチスレッドとの親和性がもう少し高ければ、あるいはplacement newとか使えればもうちょい頑張れるのだが。全チャンネル検索もver-1.1.Beta-1にて高速化済み。
  4. ファイルに関してはSlackフリープランのストレージ上限によってアーカイブされていなければダウンロード可能である。ファイルの一括キャッシュ機能はver-1.1.Beta-2で追加された。
  5. スレッドももちろん表示可能。
  6. リアクションはある程度表示できる。ただしSlackの絵文字をUTF-8に変換して表示しているので、見た目がちょっと異なるし、UTF-8にない絵文字は表示できない。

未実装の機能

  1. 自分自身のユーザー情報を設定して参加しているチャンネルだけ表示、とかを作ろうかと思ったが、全く異なるワークスペースに対して対応するのが大変なので未実装。
  2. ダイレクトメッセージ、プライベートチャンネルは考慮していない。だってフリープランだとエクスポートできないんだもの。データの形式すら分からないので対応しようがないver-1.2.Alpha-0で対応。
  3. ファイル検索機能。テキスト内の検索はやろうと思えばできるが、全部ダウンロードして読み込むのは気持ち悪いので今の所用意していない。ファイル名、ユーザー名検索くらいは簡単だからそのうち付けるかもしれない->ver-1.1.Beta-1で実装。
  4. キャッシュは自動削除されないので、使い続けていると一時ファイルとは名ばかりにどんどん溜まる。ストレージを圧迫したくない場合、定期的にCacheフォルダ内を手動で掃除する必要がある。逆に考えればバックアップの代わりに使うことはできるし、私はそうしている。

既知の不具合

  1. メッセージの一部を選択しそれを別の場所にD&Dしようとするとクラッシュする。つい先程適当に弄っている中で偶然気づいた。まだ対処法を思いついていない。ver-1.1.Beta-1で修正。
  2. 検索機能を使ったあとに別の過去ログフォルダを開いた場合、その後の操作によってはクラッシュすることがある。原因は明らかなのでそのうち修正する。いつだったか忘れたが修正したはず。
  3. ファイル名が長すぎて枠をはみ出すことがあるが、実害がないので放置している。
  4. 一度何らかのログを開いたあとに別のログを開き直したい場合は一度アプリを閉じることを推奨する。何度も異なるログファイルを行き来すると唐突にクラッシュすることがある。原因不明。研究が忙しすぎて原因究明の時間がないので直してない。

開発に関して

本ソフトウェアはC++で、msvc2019とQt5を用いて開発されている。
またSlackの絵文字とunicodeを変換するためにemojicppを使用している。
ver-1.1.Beta-3以降はQuaZIPzlibが新たに導入された。

アイコンのいくつかはICOOON MONOからダウンロードさせてもらった。種類が多いわけではないけれども、アプリ中でのクレジット表記などを求められないのは楽である。膨大な種類の無料アイコンを配布するサイトは、下手をするとアイコンごとにライセンスが異なっていたりして、使うに使えないことが多々あるのだ。
いくつかのアイコンは自作である。作成にはvectrを使わせてもらった。無料ウェブアプリでこれだけの機能があるのはとてもありがたい。

免責事項とか

本アプリケーションは私の個人的な趣味と実益のために作成されたものである。MITライセンスの元で公開しており誰でも自由に利用してよいが、これを利用することで受けたあらゆる損害について私は一切の責任を負わない。オープンソースとはいえ不特定多数の開発者が参加しない限りは安全性を担保できないので、もし利用するのなら自己責任で。
また不具合報告や要望などがあれば善処するが、こちらの意欲と時間の余裕に強く依存するため保証しない。

余談

バイナリファイルを配布するのは初めてなので、何か不具合があるんじゃないか、DLLは不足していないか、ここまで作って誰も使ってくれなかったらどうしよう、とか結構おっかなびっくりである。

私はWindowsユーザーであるため、基本的にはWindowsで開発を行っており、Linuxはビルド成否と簡単な動作確認をしているだけである。またMac環境を所持していないため、動作確認やデバッグなどは一切行えないし、Mac用バイナリ配布も私個人では不可能だMac用バイナリはcielavenir様にご協力頂き一応配布できるようになったものの、Mac版の継続的なサポートが可能かどうかは一切不明であることを承知願いたい。

どうでもいいことだが、バージョンが1.1なのは未公開のバージョン1.0が存在するからである。1.0の時点では検索機能などがなく色々とひどかったので公開を見送ったのだ。またBeta-0となっているのはデバッグが十分でないからだ。ある程度の動作確認はしたが十分ではないし、既知の不具合もある。
どちらかと言えば簡素な実装にすることを心がけたので、黒魔術じみたコードはほぼない。GUIアプリケーションなので、クリティカルな部分以外のパフォーマンスはこだわるだけ無駄である。
しかしQtとC++GUIアプリケーションを作るのは果たして良い方法と言えるのだろうか。研究用と今回のツールと合わせて3つくらい作ってきたが、毎回ひどく苦労する。
例えばWidgetを適当に組み合わせているうちはいいが、凝ったデザインのGUIを作りたいとか考え始めると悲惨なことになる。今回、Slackに似たGUIとそれなりの速度を両立するためにQStyledItemDelegateの派生クラスを設計したのだが、非常に大変だった。QTreeViewやQListViewは普通に使うだけでも大変なのに。
他には、QObjectをスレッド間で受け渡せないのがとても辛かった。この問題を回避するために多くの調整が必要で、それにより検索機能が低速化してしまった。
何となく書いていると決して意図したように動かないので、きちんと仕様を調べながら使わなければならない。他の言語はもっとGUIを作りやすかったりするのだろうか。もちろんC++にはC++の優れた点が多くあるので、隣の青い芝を羨んでいるだけなのかもしれない。

ところでこういうのってSlack Technologiesから怒られたりしないんだろうかとちょっと不安になる。Slack本体とは全く無関係なツールではあるけれども、UIとかそのまんまなので著作権的に大丈夫なんだろうかと思わなくもない。前例があるしそちらはGitHubでかなりの星を獲得しながらも問題となっていないようなので、多分大丈夫なんだろうが……。


  1. 32bitで動かないことはないはずだが、今どきそんな化石環境を使っている人はいないと思うので、ビルドも動作確認もしていない。