Discord.pyで1つのメッセージに複数のembedを埋め込む方法

最初に

本記事で説明している内容は特に難しいものではないので、かなり簡単な解説になっています。ご了承ください。
今回は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 - これは俺もよくわかってない。ただ、これがないとうまく送信されない。とりあえず書いとけばいいやつ。

はい解説終わり。簡単だったでしょ?

参考にした記事

discordのwebhookをpythonのrequestsのpostで使う

Req_
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザーは見つかりませんでした