Discordに通知するやつ

Botの動作状況だったり、シグナルとか受け取りたい時ってありますよね。

print文に書くようなことをDiscordに通知できたら。。。

そんな感じで書きました。

Setup

jsonファイルを作成しDiscordのBotのウェブフックアドレスを書いて保存します。

{ 
  "チャンネル名": "ウェブフックのアドレス"
}

次に以下のPythonコードをdiscord.pyとして保存します。

import requests
import json


class Discord:
   def __init__(
       self,
       *,
       channel_name="test",
       msg="Test post",
       token=None,
       file_name=None
           ):
       if token is not None:
           url = token
       else:
           with open("discord.json", "r") as f:
               urls = json.load(f)
               url = urls[channel_name]
       self.url = url
       if file_name is not None:
           data = open(file_name, 'rb')
           file = {'file': data}
       else:
           file = None
       self.post(content=msg, file=file)

   def post(
       self,
       *,
       content=None,
       username=None,
       avatar_url=None,
       tts=False,
       file=None,
       embeds=None,
       allowed_mentions=None
           ):
       if content is None and file is None and embeds is None:
           raise ValueError("required one of content, file, embeds")
       data = {}
       if content is not None:
           data["content"] = content
       if username is not None:
           data["username"] = username
       if avatar_url is not None:
           data["avatar_url"] = avatar_url
       data["tts"] = tts
       if embeds is not None:
           data["embeds"] = embeds
       if allowed_mentions is not None:
           data["allowed_mentions"] = allowed_mentions
       if file is not None:
           return requests.post(
               self.url, {"payload_json": json.dumps(data)}, files=file
               )
       else:
           return requests.post(
               self.url,
               json.dumps(data),
               headers={
                   "Content-Type": "application/json"
                   }
               )

Botファイルに次の様に書けば動きます。例えばSample.pyに

from discord import Discord

Discord(channel_name='チャンネル名', msg='通知したい内容')
Discord(channel_name='doten', msg='Longします')

Discord(
   channel_name='チャンネル名',
   msg='something message',
   file_name='picture.jpg'
   )

と書きます。

sample.pyの内容説明します。まず1行目ですが、前述したモジュール(discord.py)をインポートしています。

3行目ですが、これは例です。こんな風に書きます。

4行目が実際に書いた内容です。チャンネル名と通知メッセージは必須です。

またこのモジュールは画像もアップロードできます。
6行目のように、file_nameにファイル名を指定してあげれば、アップロードされます。

sample.pyを実行する前にpip install requestsをターミナルで実行してください。