Slack のエクスポートをテキストに変換 — 無料・非公開

Slack ワークスペースのエクスポートを読みやすい書き起こしに変換します。ユーザー ID を名前に直し、リンクとメンションを展開し、参加・退出の通知を取り除きます。

Slack ワークスペースのエクスポートを読み解く

Slack のエクスポートはファイルではありません。ディレクトリツリーです。チャンネルごとに一つのフォルダー、その中に一日ごとの JSON ファイル、そしてルートにワークスペースのメタデータがいくつか。日付のファイルを開くとメッセージオブジェクトの配列があり、書き手は U04J8K2L9 のようなコード、本文には山括弧の記法が織り込まれ、タイムスタンプはマイクロ秒付きの Unix エポックが文字列として入っています。

このページはそれを、チャンネルごとに一本、日付順に、実名の付いた読める文字起こしへ組み直します。.zip をまるごと置いてください。読み取りはこのブラウザタブの中で行われ、アップロードされることはありません。

名前は別のファイルにある

Slack のエクスポートをツールなしでは読めないものにしている最大の要因がこれです。メッセージは書き手をユーザー ID だけで示します。その ID から人の名前への対応は、アーカイブのルートにある users.json にあり、それを必要とするすべてのメッセージから切り離されています。

そこで users.json をどのチャンネルファイルよりも先に読み、得られた対応表を解析の最後まで持ち回ります。ユーザーごとに候補の名前が複数あります。本名、表示名、アカウントのハンドル。この順に試します。読み手が認識するのは本名ですし、表示名は設定されていれば Slack が見せる名前だからです。エクスポートによっては user_profile オブジェクトがメッセージに直接埋め込まれていることもあり、その場合はそちらを優先します。現在ではなく当時の名前を記録しているからです。

ボットのメッセージにはユーザー ID がそもそもなく、代わりにボットの識別子と、場合によっては username を持ちます。これらは別扱いにして、連携ツールの出力が空欄ではなくきちんと帰属するようにしています。

Slack 独自の記法

メッセージの本文はプレーンではありません。Slack はいくつかの種類の参照を山括弧で包んでおり、そのままにすると文字起こしは読みづらくなります。

  • ユーザーのメンション<@U04J8K2L9> の形です。同じユーザー対応表で解決して、読める @名前 にします。
  • チャンネルの参照<#C01234ABC|general> の形で、縦棒の後ろに名前がある場合とない場合があります。
  • リンク<https://example.com|表示テキスト> の形をとります。テキストを残し、その後ろの括弧に URL を置くので、文言も遷移先も失われません。
  • ブロードキャストのメンション、たとえば <!here><!channel> は、素の表記に置き換えます。
  • HTML の実体参照。アンパサンド、山括弧、引用符は元データでエスケープされているので、元に戻します。

落としてよいノイズ

Slack はイベントも subtype 付きのメッセージとして記録します。チャンネルへの参加と退出、目的やトピックの変更、アーカイブの通知——どれも実際の会話と同じ配列に並んでいます。ある程度の規模のワークスペースでは、全員が自動で追加される一般チャンネルを中心に、これらが実際のメッセージを上回ることがあります。システムメッセージとして分類し、既定では落とします。

もうひとつ、本文がまったくないメッセージの場合があります。ファイルのアップロードや、内容がすべて attachment ブロックに入っているボットの投稿です。メッセージを捨てる前に attachment にテキストがないかを確かめるので、出力を添付として投稿する連携ツールも、消えてしまわずに内容を残せます。

日ごとのファイルを組み直す

各チャンネルは一日ごとのファイルに分かれているので、チャンネルの履歴はまとめ直す必要があります。ファイルはソート順に処理され、日付で名づけられたファイルではそれが時系列になり、メッセージはチャンネルごとの一本の文字起こしに追記されます。結果として、数百の断片ではなく、チャンネル名の見出しの下に続く一続きの会話ができます。

チャンネルのデータでないファイル——チャンネル一覧、連携のログ、各種のダイレクトメッセージの索引——は読み飛ばします。解析に失敗したものもアーカイブ全体を失敗させずに読み飛ばすので、一日分が壊れていてもワークスペースを失うことはありません。

何に使われているか

無料のワークスペースがメッセージ数の上限に達し、古い会話に手が届かなくなる前に履歴を残す。別のツールへ移るときに、読める形を後に残す。JSON のディレクトリではなく文字起こしでコンプライアンスや法務の要請に応える。どこにも書き残されなかった決定の議論を掘り起こす。プロジェクトのチャンネルをモデルに渡し、半年のあいだに何が起きたかを再構成する。

エクスポートを受け取る

ワークスペースのオーナーか管理者が、ワークスペース設定のデータのインポート/エクスポートからエクスポートで作成できます。標準のエクスポートが対象とするのはパブリックチャンネルです。プライベートチャンネルとダイレクトメッセージには別の階層のエクスポートが必要で、多くの法域では文書化された理由も求められます。

ローカルで読む

ワークスペースのエクスポートは、組織が作り出すファイルの中でもとりわけ機微なものです。社内の議論、顧客の名前、貼るべきでないチャンネルに貼られた認証情報、そして関係者の率直な意見が入っています。それを第三者の変換サービスにアップロードすることは、たいていの会社では報告対象の事故です。

ここでは何も送信されません。アーカイブはこのブラウザタブの JavaScript が開いて解析し、表示されるのは読める出力だけです。サーバーがファイルを受け取ることはないので、保持について答えるべき問いも、削除を依頼するものもありません。

他のプラットフォームはチャット履歴の共通エクスポートページで扱います。