LoginSignup
72
57

More than 3 years have passed since last update.

Discord.pyでEmbedを扱う(メモ)

Last updated at Posted at 2019-07-23

注意:DiscordのバージョンアップによりEmbedの見た目がこの記事の写真と異なっていますので、ご注意ください。
2021/1/19追記: 内容の一部修正・追記・タイトル変更を行いました。

自分用のメモがてら、Discord.pyのEmbedにできることを残しておきます。
旧バージョンのasync版では使用できない(そもそも使えない)1ので注意です。

そもそもEmbedって何?

以下の様なメッセージを指す。
image.PNG
ユーザーには作成できない。
Embedにはヘッダー、フッターテキストの設定や画像の貼り付け、サムネイルの設定等ができる。
Embed一つ当たりに格納できる最大文字数は最大で6000文字。テキストにはマークアップも使用可能。

Embedオブジェクトの定義

以下の様に行う。

Embedオブジェクトの定義
embed = discord.Embed(title="Embedのタイトル",description="Embedの概要")

「Embed」の「E」が大文字になっていることと、「n」ではなく「m」を入力することに注意。
なお、これらの二つのキーワード引数は必須ではないが、指定しておかないと送信しようとした際にエラーが発生する。

Embedの送信

定義したEmbedをDiscordのテキストチャンネルへ送信するには、send()のキーワード引数embedにEmbedオブジェクトを指定する。
ここでは、「embed」の文字が小文字になっているので注意。
以下のコマンドを実行すると、画像の様なEmbedが送信される。

Embedの送信
embed = discord.Embed(title="Hi!!",description="How are you?")
await channel.send(embed=embed)

image.PNG
なお、二行目のchannelは、そのままchannelと書き込めば良いのではなく、Channelオブジェクトが入る点に注意。
コマンドフレームワークを使用しており、コマンド定義内で使用する場合は、ctxで良い。
また、引数に直接discord.Embed()を書き込む事も出来るが、コードが見づらくなる可能性があるうえ、利便性が悪いので、避けた方が良い。

枠の色を指定

discord.Embed()のキーワード引数のcolorに16進数カラーコードを指定することでEmbedの枠に色を付けることができる。

枠の色の指定
embed = discord.Embed(title="Hi!!",description="I got a color!",color=0xff0000) #16進数カラーコード

送信すると以下の様になる。
image.PNG

特殊な指定方法

discord.Colour()というクラスを使うと、カラーコードではなく色の名前で色を指定できる。

特殊な色の指定
embed = discord.Embed(title="Hi!!",description="I got a special color!",color=discord.Colour.red())

image.PNG

ただ、この方法だと望んでいる色とは少し違う色で作成されたりするのでカラーコード指定をオススメする。
使える色の名前の一覧は公式APIリファレンスに載っている。

from_rgb()を使えばRGB値から、from_hsv()を使えばHSV値から指定することも出来る。

RGB、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")

image.png

フィールドのインライン表示

全体的に小さいフィールドを2つ以上追加した場合、画像のように横に並んで表示される場合がある。
image.png
これはインライン表示と言い、複数のフィールドを一つの段にまとめることができる。
無効にしたい場合は、add_field()のキーワード引数、inlineFalseを指定する。

インライン表示の無効化
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)

image.png

なお、インライン表示は指定が無い場合有効になる。

画像の埋め込み~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")

image.png

サムネイルの設定~set_thumbnail()

set_thumbnail()でサムネイルを設定できる。
書き方はset_image()の時と同じ。

サムネイル設定
embed.set_thumbnail(url="画像url")

サムネイルは通常、Embedの右上に配置される。
image.png

作成者の設定~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

一見するとリンクが出来てないように見えるが、マウスポインターを置くとしっかりとリンクになっているのが分かる。
image.png

その他汎用的な関数

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で「カラーピッカー」と検索するだけで使える。枠の色を決めるときに使える。


  1. 2019年4月のrewrite版正式リリースにより、サポートが終了したため。詳しくはこちらの記事を参照 

  2. 動画を埋め込んだEmbedはYoutubeなどのURLを送信したときに自動で発生するEmbedのみであり、現在Discord.pyを用いてこれらを自分で作り出すことは出来ない。 

72
57
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
57