Discordのチャンネルに計算機の状況を定期報告する

# 何をしたいか
- Linuxを念頭に置いた計算機上で、計算機の実行状況のレポートをテキスト、および画像(png)にまとめて、discordの特定のチャンネルにcurlコマンドでポストする。
- レポートはbash, pythonのコードをcronで定期実行して、作成する。レポートのポストもcronで定期実行。
なぜこうしたいか、なぜdiscordなのかといったポエムは記事の最後。(書きかけ)

# Discordへのポストの準備と動作確認
まずは、テスト用のテキストや画像がポストできるように、discord周りの設定を詰める。
## Webhook botの作成
Discordのwebhookを使って、所望の動作を実現する。
[Webhook - Wikipedia](https://ja.wikipedia.org/wiki/Webhook)

公式ページの[Intro to Webhooks &ndash; Discord](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks)にしたがって、webhookを作成。
1. 対象のサーバー(この事例では自分のアカウントのサーバーを使った)の**サーバー設定(Server Settings)**を開いて、**連携サービス(Integrations)**タブを選ぶ。
2. **ウェブフックを作成(Create Webhook)**のボタンを押す。

これで、botができた。適当な名前をつけて、投稿先のチャンネルをドロップダウンメニューから選ぶ。(この事例では「ジョブ管理 Bot」という名前で、事前に準備していた「＃ジョブ管理」チャンネルを選んだ。
**ウェブフックURLをコピー(Copy Webhook URL)**のボタンを押すことで、URL(`https://discord.com/api/webhooks/1234567890...`なるアドレス)をゲットできる。

参考URL: https://scrapbox.io/Geek-SpaceBox/Discord%E3%81%AEWebhook%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

## Webhookに色々curlで投げてみる
### 最も簡単なテスト
`Hogehoge test`というテキストをチャンネルに投稿する。以下のコマンドを適当なコンピューターのコンソールから(今回は手元のMacから)入力する:

```console
printf '{"content": "Hogehoge test"}\n' | curl -v -H "Content-Type: application/json" -d @- "https://discord.com/api/webhooks/1234567890..."
```
最後のURLを上でゲットしたWebhookのURLに差し替える。これで、所望のチャンネルに`Hogehoge test`がポストされたら、設定は多分うまくできてる。

参考URL: https://qiita.com/Eai/items/1165d08dce9f183eac74

### jsonコードをcurlでポストする

```json:text_post.json
{
  "content": "ポストしたいテキストをここに書く。絵文字☺とかも大丈夫。"
}
```
を準備して

```console
curl -v -H "Content-Type: application/json" -d @./text_post.json "https://discord.com/api/webhooks/1234567890..."
```
でテキストがポストできる。

ファイルをポストしたい場合は(**書きかけ**)
```json:file_post.json
{
  "content": "ファイルの説明とか"
  
}
```
を準備して

```console
curl -v -H "Content-Type: multipart/form-data" -d @./file_post.json "https://discord.com/api/webhooks/1234567890..."
```

[](https://discord.com/developers/docs/resources/webhook)


## botを作ろうと思って、最初試みてうまくいかなかったムーブ
<details><summary>最初試みてうまくいかなかったムーブ(うまくいかなかった内容を見たい場合はここをクリック)</summary><div>
### Botのdiscordアカウントの作成
https://note.com/bami55/n/ncc3a68652697#SXY3O
https://discordapp.com/developers/applications/me/

### Botをサーバーに招待する
https://note.com/bami55/n/ncc3a68652697#SXY3O

### BotのトークンとチャンネルIDの取得
チャンネルIDはブラウザで該当チャンネルを選択した時のURL最後の18桁

### curlでポストしてみる
https://zenn.dev/book000/articles/discord_post_with_curl

```console
curl -X POST -H "Authorization: Bot <TOKEN>" -d "{\"content\":\"aaa\"}" https://discordapp.com/api/channels/<CHANNELID>/messages
```
<TOKEN>にBotのトークンを、<CHANNELID>にチャンネルのIDを入れる。

これは**うまくいかなかった**。

</div></details>

# cURL備忘録

```bash
-d "hogehoge" #文字列 hogehoge をデータとして送る
-d @file.dat  #ファイル(file.dat)をデータとして送る
-d @-         #標準入力をデータとして送る(例えばリダイレクトされたりした時)
-X POST       #ポストすることを指示
-v            #ログの出力
-F "file=@hoge.png"         # 
-H "Content-Type: application/json" #httpヘッダーの指定
```

参考URL: https://qiita.com/shtnkgm/items/45b4cd274fa813d29539

# なんでdiscordのチャンネルに計算機の情報を定期報告することにしたか
様々なネットワークに点在したクラスター計算機やスーパーコンピューターを並行して使っていると、計算の管理が極めて煩雑になる。それぞれのログイン端末にリモートでログインして、コンソールで`qstat`や類似のコマンドを入力することで、**その計算機の**計算の進捗は確認できるが、これを複数回行って計算の進捗状況を確認するのは、怠い。
計算が走り始めた際に、終わった際にメールを所定のアドレスに送るというサービスはあるが、これはジョブの始点と終点の状況に過ぎない。人間の記憶は、前後に調べた計算などからどういった計算を行おうとしていたかがわかるし、情報としてはできるだけ、`qstat`で物が確認できるのが望ましい。かつ、気の利いたバッチキューイングシステムであれば、計算が流れる予定時刻もこちらのコマンドに応じて教えてもらえる。
こうした状況を打破するために、定期的(n時間毎?)にどのジョブが待機しているのかをポストする場所があれば、そこだけ見ればリモートで計算の実行状況を確認する必要もなく便利である。合わせて、前後数日のログも容易にアクセスできるようにしておけば、どんな計算をしたかったのかも思い出しやすい。(キューにある計算が5-6本を超えたあたり、一つの計算が24時間を超えたあたりから、なんのためにそのパラメーターの計算をしようとしたのかは直ぐにはわからなくなる。)
こんな情報を、誰でも見れるようなサイトに公開するのは、webを汚しているようで忍びないし、何よりセキュリティ上もあまり良くない情報も誤って含まれてしまうかもしれない。一方で、公開先はさておき、投稿先はインターネットに公開されている場所になければ困る。(どこぞのローカルネットが投稿先にあると、そこへのルーティングが面倒だし、そもそもそういった設定が許されないような計算機、ネットワークポリシーの場所もある。)というわけで、自分がアカウントを持っていて自分と、せいぜい顔見知りくらいがアクセスできる場所に公開することになる。調べるとGoogle driveにもAPIを色々調べたりappを作ったりするとそういうことができるらしいが、かなり玄人向けだという記事が散見された。Slackの特定のチャンネルに計算機から`cron`で定期的に状況をポストするとwebhookは作ったことがあったので、slackでも良かった。ただ、個人利用のためにslackのworkspaceを準備するのは忍びない。(また、他の用途に準備したslackに関係のないものをポストするのは、情報の整理の観点から気持ちが悪い。)Discordなら、アカウントを持っていれば個人のサーバーがあるので、ここが良いだろう ということで、discordの自分サーバーのチャンネルに的を絞ってポストできる仕組みを構築して観た。(書きかけ)