コミュニティの Discord サーバのログをHTMLで取得する

「Slack データをエクスポート」
https://qiita.com/nanbuwks/items/f400db5f5974c4958f55
にて、以下のように書きました。

>-  コミュニティの昔の ML(メーリングリスト) ベースのコミュニケーションのように、ログをオープンにできないか
>   - 公開して Google でヒットするようにしたい
>   - 集合知を公開し再利用できるようにしたい
>   - 同じ興味のある人間のコミュニティへの参加導線にしたい

その後、コミュニティのコミュニケーションチャンネルとして Slack をやめて Discord を使うようにしました。

そのために、Discord サーバのログを取得して HTML にするのをチャレンジ。

# 使用するツール

 DiscordChatExporter を使います。
https://github.com/Tyrrrz/DiscordChatExporter

## ライセンス

フリーソフトだけど、オープンソースライセンスとは異なる利用条件が必要。

> Terms of use[?]
By using this project or its source code, for any purpose and in any shape or form, you grant your implicit agreement to all the following statements:
> 
> You condemn Russia and its military aggression against Ukraine
You recognize that Russia is an occupant that unlawfully invaded a sovereign state
You support Ukraine's territorial integrity, including its claims over temporarily occupied territories of Crimea and Donbas
You reject false narratives perpetuated by Russian state propaganda
To learn more about the war and how you can help, click here. Glory to Ukraine! 

cf., 「The Open Source Definition | Open Source Initiative」 https://opensource.org/osd

# 環境

今回 Linux を使います。

- Ubuntu 22.04 LTS
- DiscordChatExporter  Release 2.37.1



# 下準備

DiscordChatExporter は .NET 7.0 を使います。
Linux  でも、.NET 7.0 Runtime が必要です。

「Install .NET on Ubuntu - .NET | Microsoft Learn」
https://learn.microsoft.com/en-us/dotnet/core/install/linux-ubuntu
によると、
> .NET 7はUbuntu フィードに含まれていないため、 22.04 Microsoft パッケージ フィードを使用する必要があります。

とのことで、このページにある手順から以下のようにインストールしました。


```
$ wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get update
$ sudo apt-get install -y dotnet-runtime-7.0
```
# DiscordChatExporter 


ダウンロード

https://github.com/Tyrrrz/DiscordChatExporter/releases/tag/2.37.1
こちらから `DiscordChatExporter.Cli.zip`をダウンロードします。

```
$ mkdir DiscordChatExporter.cli
$ mv DiscordChatExporter.Cli.zip DisDiscordChatExporter.cli
$ cd DiscordChatExporter.cli
$ unzip DiscordChatExporter.Cli.zip
$ ls -og
合計 3352
---------- 1  10240  1月 10 21:00 AdvancedStringBuilder.dll
---------- 1 105472  1月 10 21:00 CliFx.dll
---------- 1   6675  1月 10 21:00 DiscordChatExporter.Cli.deps.json
---------- 1  95744  1月 10 21:00 DiscordChatExporter.Cli.dll
---------- 1 111104  1月 10 21:00 DiscordChatExporter.Cli.exe
---------- 1    460  1月 10 21:00 DiscordChatExporter.Cli.exe.config
---------- 1  17960  1月 10 21:00 DiscordChatExporter.Cli.pdb
---------- 1    253  1月 10 21:00 DiscordChatExporter.Cli.runtimeconfig.json
-rw-rw-r-- 1 920601  1月 14 16:24 DiscordChatExporter.Cli.zip
---------- 1 755200  1月 10 21:00 DiscordChatExporter.Core.dll
---------- 1  82744  1月 10 21:00 DiscordChatExporter.Core.pdb
---------- 1  41472  1月 10 21:00 Gress.dll
---------- 1  31232  1月 10 21:00 JsonExtensions.dll
---------- 1 275456  1月 10 21:00 Polly.dll
---------- 1  24576  1月 10 21:00 RazorBlade.dll
---------- 1 668160  1月 10 21:00 Spectre.Console.dll
---------- 1  91648  1月 10 21:00 Superpower.dll
---------- 1 150016  1月 10 21:00 WebMarkupMin.Core.dll
```

この中に入っている dll を dotnet コマンドで動かします。

```
$ dotnet DiscordChatExporter.Cli.dll
Cannot use file stream for [/home/nanbuwks/Downloads/DiscordChatExporter.cli/DiscordChatExporter.Cli.runtimeconfig.json]: Permission denied
Invalid runtimeconfig.json 
[/home/nanbuwks/Downloads/DiscordChatExporter.cli/DiscordChatExporter.Cli.runtimeconfig.json] [/home/nanbuwks/Downloads/DiscordChatExporter.cli/DiscordChatExporter.Cli.runtimeconfig.dev.json]
```

おや。よく見たら先程のファイルのパーミッションが 000 になってますね。

```
$ chmod 644 *
```

とすると動きました。

```
$ dotnet DiscordChatExporter.Cli.dll
DiscordChatExporter.Cli v2.37.1

USAGE
  dotnet DiscordChatExporter.Cli.dll [options]
  dotnet DiscordChatExporter.Cli.dll [command] [...]

OPTIONS
  -h|--help         Shows help text. 
  --version         Shows version information. 

COMMANDS
  exportall         Export all accessible channels. 
  export            Export one or multiple channels. 
  exportdm          Export all direct message channels. 
  exportguild       Export all channels within specified guild. 
  channels          Get the list of channels in a guild. 
  dm                Get the list of direct message channels. 
  guilds            Get the list of accessible guilds. 
  guide             Explains how to obtain token, guild or channel ID. 

You can run `dotnet DiscordChatExporter.Cli.dll [command] --help` to show help on a specific command.
```


# トークンの取得

Web ブラウザから、ログを取得したいサーバとチャンネルを開きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d11589b2-f689-4c97-d1b1-54174962a73f.png)


デベロッパーツールを開き、「Application」→「LocalStorage」-「https:discordapp.com」の「token」の値をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/637e83e2-3a7d-5861-89c7-8fcd62d6a642.png)

また、「Sources」→「channels/・・・」-「xxx」の属性名をコピーします。画像では99729349538... と見えている属性名です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/df4cd103-597a-289f-24fc-d0bd44325978.png)

```
$ dotnet DiscordChatExporter.Cli.dll export --channel <属性名> --token <token> -f "HtmlDark" -o test
```

とすると、以下のように動作して test ディレクトリに HTML が保存されます。
```
┌────────────────────────────────────────────────────────────────────┐
│   Thank you for supporting Ukraine <3                              │
│                                                                    │
│   As Russia wages a genocidal war against my country,              │
│   I'm grateful to everyone who continues to                        │
│   stand with Ukraine in our fight for freedom.                     │
│                                                                    │
│   Learn more: https://tyrrrz.me/ukraine                            │
└────────────────────────────────────────────────────────────────────┘

Exporting 1 channel(s)...
                                                                       
テキストチャンネル / 雑談 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100%
                                                                       
Successfully exported 1 channel(s).
```


```
$ ls -og test
合計 392
-rw-rw-r-- 1 400981  1月 14 16:45 'OpenHardTerrace - テキストチャンネル - 雑談 [997293495687585839].html'
```

できた html をWebブラウザで開くとこのように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4c804afa-9f1a-52ef-394d-9d0377a92f48.png)


添付画像も表示されてますね。このイメージファイルはどこにあるのかな?

```
$ tail -og test/OpenHardTerrace\ -\ テキストチャンネル\ -\ 雑談\ \[997293495687585839\].html 
tail: 無効なオプション -- 'o'
Try 'tail --help' for more information.
nanbuwks@nanbuwks-B550M-S2H:~/Downloads/DiscordChatExporter.cli$ tail  test/OpenHardTerrace\ -\ テキストチャンネル\ -\ 雑談\ \[997293495687585839\].html 
・外出先からNASを利用するシーンが全くない</span> <span class=chatlog__edited-timestamp title="14-Jan-23 02:24 AM">(edited)</span></div></div></div></div></div>
<div class=chatlog__message-group><div id=chatlog__message-container-1063711606959255585 class=chatlog__message-container data-message-id=1063711606959255585><div class=chatlog__message><div class=chatlog__message-aside><img class=chatlog__avatar src=https://cdn.discordapp.com/embed/avatars/3.png alt=Avatar loading=lazy></div><div class=chatlog__message-primary><div class=chatlog__header><span class=chatlog__author title=K_Ohe#9273 data-user-id=858266041251397633>K_Ohe</span> <span class=chatlog__timestamp><a href=#chatlog__message-container-1063711606959255585>14-Jan-23 03:50 PM</a></span></div><div class="chatlog__content chatlog__markdown"><span class=chatlog__markdown-preserve>ESP32のボードがAliから1週間で届きました。
1.9inch、3.5inch、4.3inchのLCDがついていて、1100円、2100円、3100円ぐらいです。
3.5inchと4.3inchのは静電容量のタッチパネルがついています。
1.9inchと4.3inchのは最新のESP32-S3が乗っていますが、4.3inchの方は技適マークなしでした。
これは秋月で売っている技適マークなし＋技適シールと同じ製造番号のものが使われているので実質的には技適ありなんですが、個人的にはOKですが、うるさい人がいそうなので、あまりおすすめできないですね。
これから使ってみます。</span></div><div class=chatlog__attachment><a href=https://cdn.discordapp.com/attachments/997293495687585839/1063711605734522990/IMG_3172.JPG> <img class=chatlog__attachment-media src=https://cdn.discordapp.com/attachments/997293495687585839/1063711605734522990/IMG_3172.JPG alt="Image attachment" title="Image: IMG_3172.JPG (4.33 MB)" loading=lazy> </a></div><div class=chatlog__attachment><a href=https://cdn.discordapp.com/attachments/997293495687585839/1063711606351085578/IMG_3173.JPG> <img class=chatlog__attachment-media src=https://cdn.discordapp.com/attachments/997293495687585839/1063711606351085578/IMG_3173.JPG alt="Image attachment" title="Image: IMG_3173.JPG (3.34 MB)" loading=lazy> </a></div><div class=chatlog__attachment><a href=https://cdn.discordapp.com/attachments/997293495687585839/1063711606850191391/IMG_3174.JPG> <img class=chatlog__attachment-media src=https://cdn.discordapp.com/attachments/997293495687585839/1063711606850191391/IMG_3174.JPG alt="Image attachment" title="Image: IMG_3174.JPG (2.65 MB)" loading=lazy> </a></div></div></div></div></div>

</div>
<div class=postamble><div class=postamble__entry>Exported 315 message(s)</div></div>
```
なるほど、
https://cdn.discordapp.com/attachments/997293495687585839/1063711606850191391/IMG_3174.JPG
を開くと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b7ceb798-d974-65b3-ac66-1a622111dbd6.png)
イメージが出てきます。
画像ファイルを手元においておきたい場合は Wget などを使うと良さそうですね。

# 公開する

Google Sites にコミュニティのページがありました。放置状態だったけど、これを再利用しようかな?
Discord 用の新たなページを作って公開してみました。新規ページに「埋め込む」を貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5d1aa1d7-3ffd-6609-c67e-d7cca87a5554.png)
先に作られた html を貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/796ff209-33e3-4a5c-1b5c-b8888be07db7.png)
ログがインターネットに公開されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5d66b195-d1d9-6b27-d504-36435c7973d6.png)

問題点：

ログの画像が一気に読み込まれてしまいます。
月ごとのスレッド分けをしたりする工夫が必要でしょう。今後の課題です。