LoginSignup
1
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-11-30

何をしたいか

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

Discordへのポストの準備と動作確認

まずは、テスト用のテキストや画像がポストできるように、discord周りの設定を詰める。

Webhook botの作成

Discordのwebhookを使って、所望の動作を実現する。
Webhook - Wikipedia

公式ページのIntro to Webhooks – Discordにしたがって、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から)入力する:

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でポストする

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

を準備して

curl -v -H "Content-Type: application/json" -d @./text_post.json "https://discord.com/api/webhooks/1234567890..."

でテキストがポストできる。

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

}
```
を準備して

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

botを作ろうと思って、最初試みてうまくいかなかったムーブ

最初試みてうまくいかなかったムーブ(うまくいかなかった内容を見たい場合はここをクリック)

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

curl -X POST -H "Authorization: Bot <TOKEN>" -d "{\"content\":\"aaa\"}" https://discordapp.com/api/channels/<CHANNELID>/messages

にBotのトークンを、にチャンネルのIDを入れる。

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

cURL備忘録

-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の自分サーバーのチャンネルに的を絞ってポストできる仕組みを構築して観た。(書きかけ)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1