内容
pythonを使ったdiscord botをつくるとなると、大きく分けて2つタイプがあるようです。
- 対話的に動作するタイプ
- discord.pyというライブラリが便利らしい。この記事では扱いません。
- 一方的に通知するタイプ
- 定期的に通知するにはこちら。以下で説明します。
webhook URL取得
チャンネルごとに取得が必要です。
こちらのページの「Webhook URLを取得」が参考になります。
オプション設定はコードでできるのでパスしてもよし。
簡易版
一番シンプルな構成は以下。
import requests, json
webhook_url = 'さっき取得したWebhook URL'
main_content = {'content': '送るテキスト'}
headers = {'Content-Type': 'application/json'}
response = requests.post(webhook_url, json.dumps(main_content), headers=headers)
botの見た目
botの見た目はコード内で以下のように定義できます。
アイコンの設定には画像のURLが必要のようです。以下ではtwitterアカウントのアイコンのURLを与えています。
ローカルの画像ファイルの場合は、Webhook URL取得時に設定するほかなし?
import requests, json
webhook_url = 'さっき取得したWebhook URL'
main_content = {
'username': 'お名前',
'avatar_url': '画像のURL',
'content': 'テキスト'
}
headers = {'Content-Type': 'application/json'}
response = requests.post(webhook_url, json.dumps(main_content), headers=headers)
メッセージの見た目を凝りたい
埋め込み(embeds)を使います。詳しくはこちら。
例を以下にあげます。
import requests, json
webhook_url = 'さっき取得したWebhook URL'
embeds = [
{
'description': 'googleのページ',
'color': 15146762,
'image': {
'url': '画像のURL'
}
}
]
main_content = {
'username': 'お名前',
'avatar_url': '画像のURL',
'content': 'テキスト',
'embeds': embeds
}
headers = {'Content-Type': 'application/json'}
response = requests.post(webhook_url, json.dumps(main_content), headers=headers)
こんな見た目になります。
左の縦棒の色はembeds
の中のcolor
で設定します。
数字と色の対応はこちら。「Color Mixer」のバーを動かして表示したい色を探し、「Decimal:」の右の数字を与えてください。
関数にして使い回す
例えばこんな感じです。
テキストだけ送るときはchannel
, content
だけ引数を与えます。
埋め込みを使いたい時は、必要な情報をemb
であたえます。
emb = {
'description': '埋め込み内テキスト',
'color': '色',
'img_url': '画像URL',
'content': '本文'
}
def send_discord_msg(channel, content, emb=0):
webhook_dic = {'channel 1': 'channel 1のWebhook URL',
'channel 2': 'channel 2のWebhook URL'}
webhook_url = webhook_dic[channel]
main_content = {
'username': 'botの名前',
'avatar_url': 'アイコンURL',
'content': content
}
if emb != 0:
color_dic = {
'色1': 15146762,
'色2': 49356,
}
embeds = [
{
'description': emb['description'],
"color": color_dic[emb['color']],
"image": {
"url": emb['img_url']
},
}
]
main_content.update({'embeds': embeds})
main_content['content'] = emb['content']
headers = {'Content-Type': 'application/json'}
try:
res = requests.post(webhook_url, json.dumps(main_content), headers=headers)
except Exception as e:
print(e)