Linux でDiscord のchat log をbackup する

先日Discord のtext chat で勉強会をしてみました．ログはいつまで残るのかよくわからないし保存できないかなと探してみると DiscordChatExporter というものを見つけました．

DiscordChatExporter – Alexey Golub

早速DL してみると.exe のようです．GUI版，Cli版があるのでどちらかがWine で動かないかな?と試してみるとmono ライブラリを求められました．てことはmono があれば動くのでは?と試したら動きました．てか，GitHub のWiki ページにWindows, macOS, Linux各種環境での使い方も載っていました．

(Wine とmono どちらでも動くけど，圧倒的にmono のほうが軽かったのでmono で動かしましょう)

導入方法はここに載っています．このページのDebian 9 の例ではmono のリポジトリを追加していますが，Debian sid 環境ではパッケージ版のままで動きました．

Linux usage instructions · Tyrrrz/DiscordChatExporter Wiki · GitHub

Debian sid amd64でのmonoの導入

$ sudo apt install mono-devel

release ページから最新版を入手．今回はCli版の最新の2.14を入手した．

DiscordChatExporter.CLI の入手と展開

$ wget https://github.com/Tyrrrz/DiscordChatExporter/releases/download/2.14/DiscordChatExporter.CLI.zip
$ unzip -l DiscordChatExporter.CLI.zip
$ mkdir DiscordChatExporter.CLI
$ cd DiscordChatExporter.CLI
$ unzip ../DiscordChatExporter.CLI.zip

usage

$ mono ./DiscordChatExporter.Cli.exe
DiscordChatExporter 2.14
Copyright (c) Alexey Golub
ERROR(S):
No verb selected.

export Export channel.

exportdm Export all direct message channels.

exportguild Export all channels within a given guild.

channels Get the list of channels in the given guild.

dm Get the list of direct message channels.

guilds Get the list of accessible guilds.

help Display more information on a specific command.

version Display version information.

# To get user token:
1. Open Discord
2. Press Ctrl+Shift+I to show developer tools
3. Navigate to the Application tab
4. Select "Local Storage" > "https://discordapp.com" on the left
5. Press Ctrl+R to reload
6. Find "token" at the bottom and copy the value

# To get bot token:
1. Go to Discord developer portal
2. Open your application's settings
3. Navigate to the Bot section on the left
4. Under Token click Copy

# To get guild ID or guild channel ID:
1. Open Discord
2. Open Settings
3. Go to Appearance section
4. Enable Developer Mode
5. Right click on the desired guild or channel and click Copy ID

# To get direct message channel ID:
1. Open Discord
2. Open the desired direct message channel
3. Press Ctrl+Shift+I to show developer tools
4. Navigate to the Console tab
5. Type "window.location.href" and press Enter
6. Copy the first long sequence of numbers inside the URL

次はトークンとチャンネルIDを入手します．手順は以下のページを参考に．

Obtaining Token and Channel IDs · Tyrrrz/DiscordChatExporter Wiki · GitHub

トークンの入手

Discord のDesktop版を開いた状態で，「Ctrl+Shift+I」を押しデベロッパーツールを表示する．

Application tab に移動する．

Ctrl+R を押して再読込を行う

「Storage」の「Local Storage」から「https://discordapp.com」を選択．

「token」を探してその値をコピーする．

※Discord Web版でもChrome系なら同じ手順でOK
（多分この方法はお行儀が悪い方法．なのでbot のtoken を使う手順のほうがいい．でもうまく行かない?）

次に，チャンネルID を入手します．

チャンネルID の入手

Discordアプリのユーザー設定を開く．

「テーマ」タブから詳細設定の「開発者モード」をOn に移動する．

設定画面を閉じて，入手したいチャンネルで右クリックを押し「IDをコピー」で入手する．

※Discord Web版の場合は，該当チャンネルを開いたときのURLの最後の部分．

入手したトークンとチャンネルIDで書き出しを試します．
以下の例では，
トークンが，MzU0NTM6MEg5NDAzNjQ2OTU0.XEhoGd.9h5f9dguNp-xSqbIwa8mNL1DU4D`で，チャンネルIDが`999999999999999999 だったときの例です．

$ mono ./DiscordChatExporter.Cli.exe export -t 'MzU0NTM6MEg5NDAzNjQ2OTU0.XEhoGd.9h5f9dguNp-xSqbIwa8mNL1DU4D' -c '999999999999999999'
Exporting channel [999999999999999999]... 23.8 %
44.3 %
64.5 %
90.0 %
100.0 %
Completed ✓

うまく行けば.html ファイルが書き出されます．
ただし，このhtml ファイルには画像が含まれていません．一旦ウェブブラウザで開いて保存すると画像も保存できるのでアーカイブに使うはそうしておいたほうが良さそうです．

環境

$ dpkg-query -W mono-devel wine chromium discord
chromium 76.0.3809.62-1
discord 0.0.9
mono-devel 5.18.0.240+dfsg-3
wine 4.0-2
$ hostnamectl | egrep 'Operating System|Architecture'
Operating System: Debian GNU/Linux bullseye/sid
Architecture: x86-64