最初に
本記事で説明している内容は特に難しいものではないので、かなり簡単な解説になっています。ご了承ください。
今回はWebhookを使用しますが、Webhookの使い方についてよくわかっていない人でも理解できる内容になっていると思います。ただ、Webhookの作成方法やリンクの取得方法は解説していないので、ほかの記事等を見てください。
開発環境
・エディタ - Atom
・実行シェル - PlatformIO IDE Terminal(Atomの拡張機能)
|ただのコマンドプロンプトです。
・python - Python 3.9.1
・discord.py - discord.py 1.5.1
ここから本題
全コード
※今回はEmbedに貼り付ける画像のURLにいらすとやさんのイラストを使用させていたいだいてます。
import discord
from discord.ext import commands
import requests
import json
bot = commands.Bot(command_prefix='!')
TOKEN = ''
webhook_url = ''
main_content = {
"username": "Webhooks username",
"avatar_url": "https://1.bp.blogspot.com/-d3vDLBoPktU/WvQHWMBRhII/AAAAAAABL6E/Grg-XGzr9jEODAxkRcbqIXu-mFA9gTp3wCLcBGAs/s400/internet_404_page_not_found.png",
"content": "Webhooks content",
"embeds": [
{
"title": "first embeds title",
"description": "first embeds description",
"color": 0x00ffff,
},
{
"title": "second embeds title",
"description": "second embeds description",
"color": 0xff0000,
}
]
}
@bot.event
async def on_ready():
print('ready')
@bot.command()
async def test(ctx):
requests.post(webhook_url, json.dumps(main_content), headers={'Content-Type': 'application/json'})
return
bot.run(TOKEN)
解説
モジュールのインポート
import discord
from discord.ext import commands
import requests
import json
上から、
・Discord.pyを開発するうえで必須なモジュール
・コマンドフレームワークを使用するうえで必須なモジュール
・Webhookを送信するためのモジュール
・コード内で使用されている一部をjsonファイルで書かれているものと認識させるために使うモジュール
です。
変数の定義
TOKEN = ''
webhook_url = ''
main_content = {
"username": "Webhooks username",
"avatar_url": "https://1.bp.blogspot.com/-d3vDLBoPktU/WvQHWMBRhII/AAAAAAABL6E/Grg-XGzr9jEODAxkRcbqIXu-mFA9gTp3wCLcBGAs/s400/internet_404_page_not_found.png",
"content": "Webhooks content",
"embeds": [
{
"title": "first embeds title",
"description": "first embeds description",
"color": 0x00ffff,
},
{
"title": "second embeds title",
"description": "second embeds description",
"color": 0xff0000,
}
]
}
TOKENについてはいわずもがななので解説しません。(めんどくさいだけなんて言えない)
・webhook_url - 使用するWebhookのURL
・main_content - 送信するWebhookの情報
webhook_url
について
一応
ch_webhooks = await message.channel.webhooks()
webhook = discord.utils.get(ch_webhooks, name='test')
webhook_url = webhook.token
でも取得できます。
main_content
について
今回のコードで一番大事とも言ってよいmain_content
変数について詳しく解説していきます。
人によってはぱっと見れば理解できるかもしれませんが、一応。
※このコード内ではダブルクォーテーションを使用していますが、json.dumps
関数を使っているのでシングルのほうでも問題ないと思います。
まず、上3行から。
username - Webhookを送信するときに使用するユーザーネームです。
avatar_url - Webhookを送信するときに使用するアイコンのURLです。
content - Webhookに記入する内容です。
で、複数のEmbedを送信するための要素であるembeds
。
ちなみに、Embedしか使わなくていいって人は上の3つはいらないよ。
見てわかる通り、embeds
というのは複数形、つまりリスト(配列)型なんだよね。だから、コロンのあとに[
がいる。(正式名称調べるのめんどくさかった)
このEmbedの定義方法、普通のd.pyのEmbedの定義方法と何が違うかというと、例えば、title='title'
だったのが、"title":"title"
になっただけなんだよね。あとは一つのまとまりとあらわすために{}
があったりとか、それだけ。
例:↓
discord.Embed(title='title', description='description', color=0x00ffff, url='url').set_author(name='author_name', url='author_url', icon_url='author_icon_url')
#が、
{
"embeds":[{
"title": "title",
"description": "description",
"color": 0x00ffff,
"url": "url",
"author":{
"name": "author_name",
"url": "author_url",
"icon_url": "author_icon_url"
}
}]
}
#になるだけ。
ちなみに、PEP8に準拠させなくてもいい場合はインデントとか考えなくていいよ。
で、複数のEmbedを使う場合は、こんな感じで
{
"embeds":[
{
"title": "title",
"description": "description",
"color": 0x00ffff,
"url": "url",
"author":{
"name": "author_name",
"url": "author_url",
"icon_url": "author_icon_url"
}
},
{
"title": "title",
"description": "description",
"color": 0x00ffff,
"url": "url",
"author":{
"name": "author_name",
"url": "author_url",
"icon_url": "author_icon_url"
}
]
}
コンマで区切って、2つ以上の要素を組み込めばいい。
噂によると最大10個のEmbedが埋め込めるらしいです。試してないですが。もし誰か検証した方いたらコメントかなんかで教えていただけると嬉しいです。
on_ready
@bot.event
async def on_ready():
print('ready')
これは言わずもがな、Botが正常に起動したかどうかを確認するだけ。詳しい解説は必要ないかな。
Embedを送信
@bot.command()
async def test(ctx):
requests.post(webhook_url, json.dumps(main_content), headers={'Content-Type': 'application/json'})
return
一応ここではtest
というコマンドを使っていますが、それ以外でももちろんできます。
では、requests.post
内について解説していきます。
webhook_url - 上のほうで定義(取得)したWebhookのURL
main_content - 上のほうで定義したWebhookメッセージの情報が詰め込まれてるやつ(json.dumps()
はjson形式に変換するためのやつ。必須。)
headers - これは俺もよくわかってない。ただ、これがないとうまく送信されない。とりあえず書いとけばいいやつ。
はい解説終わり。簡単だったでしょ?