取得
chatlog.py で Slack / Discord のチャンネルログを取得し、JSON に蓄積します。まだソースコードを取得していない場合はトップページの手順で git clone してください。
動作環境
- Python 3 系
- Slack を取得する場合: Slack API トークン(下記スコープ)。追加ライブラリは不要。
- Discord を取得する場合: Discord Bot トークンと
discordライブラリ(python3 -m pip install discord)。discordは Discord 取得時にのみ読み込むので、Slack だけ使うなら未インストールで構いません。
使い方
python3 chatlog.py <出力JSONファイル> <チャンネル名> <設定JSONファイル>
Slack / Discord のどちらを取得するかは、設定ファイルの service で決まります(引数は共通)。
| 引数 | 説明 |
|---|---|
| 出力JSONファイル | ログを蓄積する JSON のパス(既存があれば読み込んで追記) |
| チャンネル名 | 取得するチャンネル名(Slack は # 不要、Discord は表示名そのまま) |
| 設定JSONファイル | 下記の設定ファイルへのパス |
実行例:
python3 chatlog.py general.json general ~/.config/chatlog/config.json
general チャンネルの新規メッセージ(前回保存分より後)を取得して general.json に追記します。出力ファイルが無ければチャンネルの最古から全件取得します。チャンネル名とファイル名は独立しているので、日本語チャンネル名を英語ファイル名に振り分けてもかまいません。
設定ファイル (config.json)
service は必須です。記載が無い、または slack/discord 以外だと、その旨を表示して終了します(既定では動かしません)。
Slack の例:
{
"service": "slack",
"token": "xoxb-xxxxxxxx",
"overlap_seconds": 86400
}
Discord の例:
{
"service": "discord",
"token": "(Discord Bot トークン)",
"overlap_seconds": 86400
}
| キー | 説明 |
|---|---|
service |
取得元。"slack" または "discord"。必須 |
token |
API トークン(Slack は Bot トークン xoxb- 推奨、Discord は Bot トークン)。必須 |
overlap_seconds |
取りこぼし対策のマージン(秒)。保存済みの最新メッセージからこの秒数だけさかのぼって取得し直す。省略可(既定 86400 = 1 日) |
Slack の準備
Slack の Web API(conversations.*)を使います。
- Slack API: Your Apps で Create New App → From scratch。
- OAuth & Permissions の Bot Token Scopes に次を追加:
channels:read/channels:history/groups:read/groups:history/users:read(パブリックチャンネルのみならgroups:*は不要)。 - Install to Workspace して Bot User OAuth Token(
xoxb-)を取得し、tokenに設定。このトークンはインストールしたワークスペース専用で、取得対象もそのワークスペースのチャンネルに限られます。 - 取得したいチャンネルに Bot を招待する(
/invite @アプリ名)。Bot がメンバーでないと履歴を取得できません。
チャンネル名は Slack 上の名前と完全一致で指定します。コマンド引数には先頭の # を付けません(例: #general は general)。アーカイブ済みチャンネルは取得対象外です。
Discord の準備
discord ライブラリで取得します。
- Discord Developer Portal でアプリ(Bot)を作成。
- Bot 設定で MESSAGE CONTENT INTENT を ON(本文の取得に必須)。
- Bot トークンを取得し、
tokenに設定。 - Bot を対象サーバーに招待し、対象チャンネルの View Channel / Read Message History 権限を与える。
python3 -m pip install discord。
コマンド引数のチャンネル名は表示名と完全一致させます(先頭の # は付けません)。現在の実装は Bot が参加している全サーバーから最初に一致したテキストチャンネルを選ぶため、複数サーバーに同名チャンネルがある場合は意図しないチャンネルを取得するおそれがあります。名前を一意にするか、Bot を対象サーバーだけに参加させてください。
取得対象の範囲
取得するのは通常のチャンネル履歴の本文・投稿者・時刻・添付ファイル名です。添付ファイルの本体はダウンロードしません。絵文字リアクション、投稿の編集履歴、削除済みメッセージ、埋め込み表示などは保存・再現しません。ビューアは保存された本文を簡易表示するもので、Slack / Discord の画面を完全に再現するものではありません。
Slack のスレッド返信は取得しません(スレッドの親メッセージのみが対象です)。書式付き(太字・斜体・取り消し線・コード・リスト・引用・コードブロック)のメッセージは、本文 text に加えて Slack の rich_text 構造(blocks)も保存し、ビューアが書式を再現します。プレーンな本文やメンション・リンクだけの投稿は text で再現できるため blocks は保存しません。投稿者情報を持たないメッセージ(Bot や連携アプリが attachments で流し込む投稿など)は、発言者名を PLUGIN(判別できない場合は UNKNOWN)として、内容を整形せずそのまま保存します。投稿者が退会済みなどでチャンネルメンバーに見つからない場合は、名前の代わりにユーザー ID がそのまま記録されます。
Discord は通常メッセージに加えて、ピン留め通知やメンバー参加などのシステムメッセージも取得します(本文は Discord が生成する英語の定型文になります)。ピン留め通知には、どのメッセージをピン留めしたかという情報は含まれません。ただしスレッドやフォーラムの投稿は取得しません。
取得のタイミングと失敗時の扱い
このツールはコマンドを実行した時点で取得します。常駐や定期実行は行わないため、継続して蓄積するには cron、launchd、GitHub Actions などで利用者が実行をスケジュールします。
- 初回実行は保存済みデータがないため、取得可能な最古のメッセージから全件を読み込みます。大きなチャンネルでは時間がかかることがあります。
- 2 回目以降は、最後に保存したメッセージの
overlap_seconds秒前から再取得し、重複を除いて追記します。既に保存した同一メッセージは重複として保持するため、投稿後の編集は反映しません。 - API 取得中に失敗すると終了コード 1 で終了し、出力 JSON の
errorに時刻とエラー内容を記録します。それまで保存済みのログは残ります。成功した次回実行時にerrorは消え、retrievedAtが更新されます。errorが記録された JSON をビューアで開くと、フッタに失敗した時刻とエラー内容が強調表示され、取得が失敗している状態に気づけます。
保存先の親ディレクトリはあらかじめ作成してください。出力 JSON のファイル名は任意ですが、ビューアで公開する際はビューアのとおり chatLog(...) の名前と合わせます。
ログが大きくなったら 分割・統合 で初期表示を速くできます。