API調べようと思ったけどこれで全部完結した
Releases · Tyrrrz/DiscordChatExporter (github.com)
なお 定期的に取得したいので バッチ化できる CLI を使う
大前提:トークンを取得する
GUI版に手順の記載がある
要は Web版 Discord を開き、HTTPリクエストのヘッダ部 にある「authorization」の値を使う
よくわからん人は GUI版もダウンロードして手順を参照
英語読めんって人は頑張れ
サーバー一覧の取得
DiscordChatExporter.Cli.exe guilds -t <token>
ID, サーバー名 の順で出てくる
PowerShell のスクリプトなら分割できる
DiscordChatExporter.Cli.exe guilds -t <token> | %{ $_.Split("|")[0].trim() }
IDのみをずらずらと出力する例
チャンネルの取得
DiscordChatExporter.Cli.exe channels -g <サーバーのID> -t <token>
チャンネル一覧が出てくる
ボイスチャンネルも乗る
IDが欲しいときは先述参考
チャット内容のエクスポート
.\DiscordChatExporter.Cli.exe export -c <チャンネルID> -t <token> -o <出力先のファイルパス>
ここでやっと取得できる
ただし、これだけだとテキストしかローカルに保存されない
メディア類も確保したい場合、「–media」をつける
また、同じディレクトリに落とすとき、一度ダウンロードしたものを再ダウンロードするのは無駄なので「–reuse-media」も合わせるとよし
所属している全サーバーの全チャンネルの全チャットをエクスポートするスクリプト
ゲロ遅いし負荷かけると思うので一週間に一回ぐらいに実行するよろし
なお 以下は bat (powershell は自動化する上で管理者実行が面倒なので) だが、同じ理屈で bash などにもできると思う
@echo off
rem ---------------------------------------------------------------------------
rem DiscordChatExporter.cli.exe の実行ファイルへのフルパス
set _PATH_DISCORDEXPORTER="<DiscordChatExporter.Cli.exe へのフルパス>"
rem Token
set _DETOKEN=<トークン>
rem 出力先ファイルパス
set _PATH_OUTPUT=<出力するファイルパスのルート>
rem ---------------------------------------------------------------------------
rem for /f の制約により、必要な処置
setlocal enabledelayedexpansion
rem ---------------------------------------------------------------------------
rem サーバー一覧の取得
%_PATH_DISCORDEXPORTER% guilds -t %_DETOKEN% > temp_slist.txt
rem ---------------------------------------------------------------------------
rem サーバー一覧からチャンネル一覧を取得し、それをすべて追記する
for /f "tokens=1 delims=:|" %%s in (temp_slist.txt) do (
echo ServerID = %%s を処理中...
%_PATH_DISCORDEXPORTER% channels -g %%s -t %_DETOKEN% >> temp_clist.txt
)
rem ---------------------------------------------------------------------------
rem チャンネル一覧から IDと名称 両方を取得してアウトプット
for /f "tokens=1,2 delims=:|" %%c in (temp_clist.txt) do (
echo Channel = %%c %%d を処理中
rem 出力パスの構成
set __PATH_OUTPUT="!_PATH_OUTPUT!\%%c_%%d"
rem ファイルパスとして悪さをしそうなやつを置換する
set __PATH_OUTPUT=!__PATH_OUTPUT:/=/!
set __PATH_OUTPUT=!__PATH_OUTPUT:?=?!
rem Exportを開始する
%_PATH_DISCORDEXPORTER% export -c %%c -t !_DETOKEN! -o !_PATH_OUTPUT! --media --reuse-media
rem 後処理
set __PATH_OUTPUT=
)
rem ---------------------------------------------------------------------------
rem 後処理
del /q temp_clist.txt
del /q temp_slist.txt
set _PATH_DISCORDEXPORTER=
set _DETOKEN=
endlocal
ということをしなくて良いようにコマンドがあります
.\DiscordChatExporter.Cli.exe exportall -t <token> -o <出力先のファイルパス>
for /f の制約とかと戦ってたらこんな便利なコマンドまであって時間が無駄に・・・
こちらにも「–media」「–reuse-media」が使える
せやかて全部は取得していらんとき (サーバーを限定する)
.\DiscordChatExporter.Cli.exe exportguild -g <サーバーID> -t <token> -o <出力先のファイルパス>
こちらも同様に「–media」「–reuse-media」が使える
なのでバックアップを実用するなら、サーバー一覧は取得してIDを調べ、
exportguild を連続して実行するような bat を実行することになるであろう
Discord のバックアップを検討している人はご活用を