注意:DiscordのバージョンアップによりEmbedの見た目がこの記事の写真と異なっていますので、ご注意ください。
2021/1/19追記: 内容の一部修正・追記・タイトル変更を行いました。
自分用のメモがてら、Discord.pyのEmbedにできることを残しておきます。
旧バージョンのasync版では使用できない(そもそも使えない)1ので注意です。
#そもそもEmbedって何?
以下の様なメッセージを指す。
ユーザーには作成できない。
Embedにはヘッダー、フッターテキストの設定や画像の貼り付け、サムネイルの設定等ができる。
Embed一つ当たりに格納できる最大文字数は最大で6000文字。テキストにはマークアップも使用可能。
#Embedオブジェクトの定義
以下の様に行う。
embed = discord.Embed(title="Embedのタイトル",description="Embedの概要")
「Embed」の**「E」が大文字になっていることと、「n」ではなく「m」を入力する**ことに注意。
なお、これらの二つのキーワード引数は必須ではないが、指定しておかないと送信しようとした際にエラーが発生する。
#Embedの送信
定義したEmbedをDiscordのテキストチャンネルへ送信するには、send()
のキーワード引数embed
にEmbedオブジェクトを指定する。
ここでは、「embed」の文字が小文字になっているので注意。
以下のコマンドを実行すると、画像の様なEmbedが送信される。
embed = discord.Embed(title="Hi!!",description="How are you?")
await channel.send(embed=embed)
なお、二行目のchannel
は、そのままchannelと書き込めば良いのではなく、Channelオブジェクトが入る点に注意。
コマンドフレームワークを使用しており、コマンド定義内で使用する場合は、ctx
で良い。
また、引数に直接discord.Embed()
を書き込む事も出来るが、コードが見づらくなる可能性があるうえ、利便性が悪いので、避けた方が良い。
##枠の色を指定
discord.Embed()
のキーワード引数のcolor
に16進数カラーコードを指定することでEmbedの枠に色を付けることができる。
embed = discord.Embed(title="Hi!!",description="I got a color!",color=0xff0000) #16進数カラーコード
###特殊な指定方法
discord.Colour()
というクラスを使うと、カラーコードではなく色の名前で色を指定できる。
embed = discord.Embed(title="Hi!!",description="I got a special color!",color=discord.Colour.red())
ただ、この方法だと望んでいる色とは少し違う色で作成されたりするのでカラーコード指定をオススメする。
使える色の名前の一覧は公式APIリファレンスに載っている。
from_rgb()
を使えばRGB値から、from_hsv()
を使えばHSV値から指定することも出来る。
embed = discord.Embed(title="Hi!!",description="I got a special color!",color=discord.Colour.from_rgb(255,0,0))
embed = discord.Embed(title="Hi!!",description="I got a special color!",color=discord.Colour.from_hsv(0,100,100))
この場合はどちらも枠が赤くなる。
#フィールドの追加~add_field()
add_field()
でEmbedにフィールドを追加できる。
embed.add_field(name="フィールドの名前",value="フィールドの値")
以下のようにEmbedを作成して送信すると画像のようになる。
embed = discord.Embed(title="Nice",description="to")
embed.add_field(name="meet",value="you")
##フィールドのインライン表示
全体的に小さいフィールドを2つ以上追加した場合、画像のように横に並んで表示される場合がある。
これはインライン表示と言い、複数のフィールドを一つの段にまとめることができる。
無効にしたい場合は、add_field()
のキーワード引数、inline
にFalse
を指定する。
embed = discord.Embed(title="There are",description="small fields")
embed.add_field(name="small1",value="small1",inline=False)
embed.add_field(name="small2",value="small2",inline=False)
なお、インライン表示は指定が無い場合有効になる。
#画像の埋め込み~set_image()
set_image()
で画像を埋め込むことができる。
embed.set_image(url="画像url")
画像urlは、先頭がhttpかhttpsの物のみ使える。
画像はEmbedの下部、フッターテキスト(後述)の上に埋め込まれる。
例えば、Discordのデフォルトアバターを埋め込むと画像の様になる。
embed = discord.Embed(title="this is",description="default avatar")
embed.set_image(url="https://cdn.discordapp.com/embed/avatars/0.png")
#サムネイルの設定~set_thumbnail()
set_thumbnail()
でサムネイルを設定できる。
書き方はset_image()
の時と同じ。
embed.set_thumbnail(url="画像url")
#作成者の設定~set_author()
set_author()
でEmbedの作成者を設定できる。
「作成者」とあるが、ヘッダーテキストのような物と考えた方が良い。
embed.set_author(name="名前",url="埋め込むurl",icon_url="アイコンのurl")
name
に指定した値がヘッダーテキストとして扱われる。
url
には、urlを指定するとヘッダーテキストにurlが埋め込まれる。
icon_url
には、画像urlを指定すると左上にアイコンが表示されるようになる。
次のように作成者を設定すると画像のようになる。
embed = discord.Embed(title="vege",description="table")
embed.set_author(name="Poteto143`s profile",url="https://qiita.com/Poteto143",icon_url="https://cdn.discordapp.com/embed/avatars/0.png")
embed
一見するとリンクが出来てないように見えるが、マウスポインターを置くとしっかりとリンクになっているのが分かる。
#その他汎用的な関数
##Embedをコピー~copy()
Embedの情報をコピーし、同じ内容を持つEmbedを返す。
テンプレートとなるEmbedを用意し、そこから個別に手を加えて使い回すという処理ができる。
##フィールドをクリア~clear_fields()
サムネイルや画像などを維持し、フィールドを全て削除する。
##指定したフィールドを削除~remove_field()
Embedのフィールドを、インデックス指定で一件削除する。
0が先頭。
embed.remove_field(0)#先頭のフィールドを削除
embed.remove_field(len(embed.fields()) - 1)#末端のフィールドを削除
##既存のフィールドを編集~set_field_at()
第一引数に指定するフィールドのインデックス番号をint型で渡し、それ以降の引数はadd_field()
と同様。
embed.set_field_at(2, name="hello", value="world", inline=False)#三番目のフィールドを書き換え
#フィールドを任意の場所に挿入~insert_field_at()
第一引数に、フィールドを挿入したい場所のインデックス番号をint型で渡し、それ以降の引数はadd_field()
と同様。
embed.insert_field_at(2, name="hello", value="world", inline=False)#三番目のフィールドの前に新しく要素を挿入する
##作成者の削除~remove_author()
前述のset_author()
でセットした制作者の情報をEmbedから消す。
##Embedを辞書型に変換~to_dict()
Embedの情報をPythonの辞書型にまとめる。
この関数が返す値を保存し、クラスメソッドであるEmbed.from_dict()
の引数に渡すと辞書の情報からEmbedを作る事が出来る。
#他に覚えておくと良いこと
title
,description
,colour
はEmbedを定義した後も以下の様に書き換え可能。
embed = discord.Embed(title="hello", description="wolrd")
embed.title = "goodbye" #embedのタイトルがgoodbyeに書き変わる
また、以下の様にすることでEmbedに含まれる画像や埋め込まれている動画2の情報も取得できる。
embed.image.url #埋め込まれた画像のURLを取得する
embed.video.url #埋め込まれた動画のURLを取得する
Message.embeds
を使うと、メッセージに含まれるEmbedのリストを取得できる。
なお、リストで返される理由はWebhookを通して送信したメッセージは複数のEmbedを持つことが可能だからだ。
#便利なサイト
公式APIリファレンス・Discord.pyの仕様がまとめられた公式のサイト。ここではEmbedの項目にリンクしている。
Discord Embed Generator・分かりやすいインターフェースでEmbedの可視化が出来る。
Googleのカラーピッカー・Googleで「カラーピッカー」と検索するだけで使える。枠の色を決めるときに使える。