Amezariz Blog

アイドルプロジェクト「アメザリズ」の公式ブログです。

Slack のアーカイブを取ろう

どうも、アメザリズスタッフの Neo です。

アメザリズではコミュニケーションツールに Slack を使っています。この Slack、無料プランだと発言から90日分のデータしか残らないのが難点です。

そこで今回は、Slack の投稿のアーカイブを取得してみました。

前提

ココから先、エンジニア向けの内容を書きます。基礎的な単語の説明はしませんのであしからず。

OAuth トークンを取得する

まず Slack Apps のページに行き、以下のマニフェストで App を作成します。

display_information:
  name: slack-exporter
oauth_config:
  scopes:
    user:
      - channels:history
      - channels:read
      - groups:history
      - groups:read
      - im:history
      - im:read
      - mpim:history
      - mpim:read
      - users:read
settings:
  org_deploy_enabled: false
  socket_mode_enabled: false
  token_rotation_enabled: false

ワークスペースに App をインストールしたら、左メニュー「OAuth & Permissions」から「User OAuth Token」を取得しておきます。

Slack Exporter 環境を構築する

Slack の投稿をエクスポートする、「Slack Exporter」という Python スクリプトを用意します。こちらは

にて公開されていたものを Fork し、ユーザ一覧とチャンネル一覧についても JSON を出力できるようにしたモノを使用します。

以降は WSL Ubuntu 環境で Python v3 系を使用して作業します。

$ cat /etc/os-release | grep 'PRETTY_NAME'
PRETTY_NAME="Ubuntu 20.04.6 LTS"

$ python3 -V
Python 3.11.2

$ pip3 -V
pip 22.3.1 from /home/linuxbrew/.linuxbrew/opt/python@3.11/lib/python3.11/site-packages/pip (python 3.11)

前述の「Slack Exporter」を Git Clone し、依存パッケージをインストールしていきます。

$ git clone https://github.com/Neos21/slack-exporter.git
$ cd "$(basename "$1" .git)"

$ pip3 install -r ./requirements.txt

Slack の投稿内容をエクスポートする

それではいよいよ Slack の投稿をエクスポートしていきます。

$ python3 ./slack_export.py \
    --token xxxxx \
    --output-dir output

このようなコマンドでスクリプトを実行すると、Slack の投稿の取得が始まります。取得結果の JSON ファイルは output/ ディレクトリに格納されていきます。

投稿量にもよりますが、自分は10分程度で

  • 参加しているパブリックチャンネル
  • 参加しているプライベートチャンネル
  • 自分との DM

の情報が取得できました。約90日分の投稿内容で、JSON ファイルは全体で 20MB 程度でした。

投稿を閲覧するビューアを作る

エクスポートしたデータは JSON 形式なので、Angular を使って簡単なビューアを作ってみました。2時間くらいで大方の実装を終えました。

とりあえず投稿内容を振り返るだけなら十分なフロントエンドが出来たと思います。

添付ファイルは保存されない

さて、このような手順で「投稿されたメッセージデータ」は保管できましたが、投稿に添付したファイルについてはダウンロードできていないので注意が必要です。

今回は添付ファイルの利用量が多く、全データの一括ダウンロードは諦めましたが、技術的には可能です。取得した投稿メッセージ内の files[].url_private_download プロパティ値をクロールして wget していけば良いでしょう。

以上デス

とりあえず JSON データだけ取得しておけば、添付ファイル類は90日間を超えてもしばらくは残っているようだったので、まずは投稿メッセージの取得だけでもやっておくと良いでしょう。