Pythonでテキストや画像をDiscordに送信
研究であったら便利そうなので作りました。
はじめに
研究で機械学習を使っているのですが、1個のモデルを学習し終わるのに1時間強ぐらいかかります。
毎回十数個のモデルを作成するので、一回学習を回し始めると2つのGPUを並列で使っても5,6時間はかかるわけです。
そのため、研究室から出る前に学習を始めるのですが、結果を見るにはまた研究室に行く必要がありました。
いちいち研究室に行くのは面倒なので、DiscordのWebhookを使って学習結果のjsonを送信させることにしました。
実装
というわけで書きました。下のコードをコピペしてWEBHOOK_URLを変更すれば動くはずです。
URLの取得については、こちらの「外部サービスからDiscordにメッセージを送る(Webhook)」が参考になります。
post_discord()の引数に、メッセージ本文と送信したいpng画像のファイルパスリストを与えれやれば動きます。
# この定数は自身で変更する
WEBHOOK_URL = "https://discord.com/api/webhooks/1234567890/hogehoge"
def post_discord(message = str, files_path_list: list[str] = []):
payload = {}
payload["content"] = message
# 画像ファイルをmultipart formに追加
multiple_files = []
for i, file_path in enumerate(files_path_list):
multiple_files.append((
f"files[{i}]", (f"image{i+1}.png", open(file_path, "rb"), "image/png")
))
# リクエスト送信
response = requests.post(WEBHOOK_URL, data={"payload_json": json.dumps(payload)}, files=multiple_files)
# 開いたファイルを閉じる
for name, filetuple in multiple_files:
if isinstance(filetuple, tuple) and filetuple[1]:
filetuple[1].close()
変に複雑に見えますが、やっていること自体は簡単で、メッセージやファイルを整形してWebhookにPOST送信しているだけです。
payloadに本文の文字列を入れ、requests_post()のfiles引数にバイナリで開いたファイルを渡しています。