💬

Slack データのエクスポート ハマりポイント

に公開

こんにちは。趣味でSlackをやっている者です。
Slackのデータエクスポートでハマったポイントがあったので備忘録です。
Slackの管理者やデータ活用をされている方と情報交換できたら嬉しいです。

今回やりたかったこと

特定のユーザーが、特定の期間に、パブリックチャンネルとプライベートチャンネルで(DMは除く)、いつ投稿したか、その情報を取得したい。

なお、これは、私の関係する組織で不正や犯罪があったということではないので、妙な邪推はしないでくださいね。

特定個人の行動を追跡することにもなるので、情報の取り扱いについては、人事や法務ともよく相談しましょう。

ワークスペースのデータをエクスポートする

前述のやりたかったことに対して、まずはエクスポートを試みました。

公式の説明

https://slack.com/intl/ja-jp/help/articles/201658943-ワークスペースのデータをエクスポートする

https://slack.com/intl/ja-jp/help/articles/220556107-Slack-からエクスポートしたデータの読み方

画面操作イメージ

条件を指定し、データエクスポートを開始すると、データ生成中としてローディングマークが出現します。データ量により、ダウンロードできるまでの時間は異なります。数分〜数十分待つことになります。

エクスポートで注意する点

前述の操作により、JSONやtxtが入手できます。しかし、ここでいくつか注意点があります。(2025/04/24時点)

  • ワークスペースに所属していないユーザーのチャンネル会話はエクスポートできない(仕様)
    たとえば、解除されたメンバー(どのワークスペースにも所属していないメンバー)は所属チャンネルがないため、チャンネルの情報を取得できない。なお、DM情報はエクスポートできる。

  • ユーザーをワークスペースに追加しても、チャンネルに参加していなければそのチャンネルのデータはエクスポートされない。
    たとえば、解除されたメンバーをワークスペースに所属させ直しても、その時点で参加しているチャンネルの情報しかエクスポートできない。過去に所属していたチャンネルの情報はエクスポートされない。

  • アーカイブされたチャンネルはエクスポートの対象に含まれる。

やりたかったことを実現するには

最終的にはAPIでデータ取得しました。
雑に説明すると、非同期処理でPythonでいい感じにして、1ヶ月ごととかユーザーごととか期間区切って、中間データ溜めつつ、JSONとCSVを吐き出します。レートリミットもあるので、対象件数が多いと数時間かかるため、夜間に処理走らせておいて翌朝出来てるかな、みたいな感じにもなります。トークンを分けて処理を複数ぶん回す荒技もあります。この辺、私よりも詳しい人がたくさんいらっしゃると思いますので、そういった方々にご教授いただきたいです。
コードはAIでも簡単に生成できると思うので割愛します。

利用したAPI

APIは以下のあたりです。カッコ内はレートリミットです。

conversations.list (Tier 2 / 20+ per minute)
conversations.history (Tier 3 / 50+ per minute)

https://api.slack.com/methods/conversations.list
https://api.slack.com/methods/conversations.history

処理時間

特にhistoryの処理が重めです。仮に対象がユーザー1名、チャンネル数1,500、2年間の情報を取得しようとした時、以下のような大雑把な計算になります。

1500チャンネルに対して:

  • チャンネルリストの取得
    • 1回のリクエストで約100チャンネル取得するとすると、15回のリクエストが必要
    • レート制限(20+ リクエスト/分)を考慮すると、最低でも約1分
  • 各チャンネルの履歴取得
    • conversations.historyのレート制限:50+ リクエスト/分
    • 理想的な条件では1分あたり50チャンネル処理できる
    • 単純計算:1500 ÷ 50 = 30分

ただし、上記はあくまで楽観・単純計算に過ぎず、次のような考慮事項もあります。

考慮事項

  • 各チャンネルのメッセージ量によってはページネーションが必要(複数リクエスト)
  • エラー処理と再試行の時間
  • 2年分のデータとなると各チャンネルで複数リクエストが必要
  • ネットワーク状況やSlackサーバーの応答性
  • メッセージ量が非常に多いチャンネルの存在

というわけで、現実的には数時間かかるとみておいた方がいいでしょう。

Pythonを実行するときには、仮想環境を作っておくと良いでしょう。クラウドで処理しても良さそうですが、そんなに頻繁にやることでもないので、ローカルでいいかなという気持ち。GASでやるのはしんどいと思います。

最適化された実装と安定したネットワーク環境により、より高速に処理できるかと思いますが、この辺りは詳しい人にぜひぜひご教授いただきたいです🙏

そして、こういうことをモリモリ推進したり、社内システムをスクラッチで作ったりできるパーソンをへーしゃは求めています。ご興味ある方、カジュアル面談いかがでしょうか?
CIO は 7032さんです。
https://x.com/7032/status/1916787043985920345

#Slack #SlackEnterpriseGrid #データエクスポート #エクスポート #JSON #CSV #監査ログ

雑記はnoteにして、技術っぽいことはZennに書いていこうかなあ、どうしようかなあ、そんな今日この頃です。
https://note.com/0375

Discussion