カテゴリー: Discordボット開発
Discordボット開発#8埋め込み(Embed)を画像・フィールドで飾る (Pythonサンプル付き)
この記事は韓国語の原文から翻訳したものです。
目次9項目
こんにちは!Mojangcamです 😎
前回の#7ではモーダル(Modal)でユーザーから入力を受け取ってみました。今回の#8では、ボットが送るメッセージをぐっと見やすくしてくれる埋め込み(Embed)を扱います!
埋め込みは、Discordでタイトル・説明・フィールド・画像・色をすっきりまとめて表示するカード型のメッセージです。サーバー情報、プロフィールカード、お知らせ、ユーザーランキングなどを作るとき、そっけないテキストよりずっと見栄えが良くなります。今回はフィールド(Field)の並べ方とサムネイル・大きな画像の入れ方まで、コピペでそのまま試せるサンプルでまとめました!

📌 準備するもの
- Python 3.8+
- discord.py 2.x (スラッシュコマンド・埋め込みの最新機能を使います)
- Discordボットのトークン & サーバーへの招待済み (前回までにセットアップしていればそのままでOK)
pip install -U discord.py💡 このシリーズはずっとdiscord.py 2.xを前提にしています。バージョンが古いとスラッシュコマンドが動かないので、
-Uで最新版にしておいてください。
📌 ステップ1 - 基本の埋め込みを作る
埋め込みはdiscord.Embed()で骨組みを作り、そこにフィールドや画像を付け足していきます。
embed = discord.Embed(
title="📊 サーバー情報",
description="このサーバーの基本情報を埋め込みでまとめました!",
color=discord.Color.blurple(),
)ひとつずつ見ていきましょう 💡
- title : 埋め込みのいちばん上に表示される太字のタイトルです。
- description : タイトルの下に表示される本文の説明です。
- color : 埋め込みの左側の縦線の色です。
discord.Color.blurple()(Discordの紫)のようなプリセットを使うことも、discord.Color.from_rgb(88, 101, 242)で直接指定することもできます。
📌 ステップ2 - フィールド(Field)を追加して並べる
add_field()で「名前 : 値」の形の項目を追加します。inlineの値で横に並ぶかどうかが決まります。
embed.add_field(name="メンバー数", value="120人", inline=True)
embed.add_field(name="チャンネル数", value="18個", inline=True)
embed.add_field(name="サーバー作成日", value="2024-03-01", inline=False)- inline=True : ほかのinlineフィールドと横に並んで表示されます。(1行に最大3つ)
- inline=False : 1行をまるごと使います。区切り線のように使うと便利です。
- name / value が空文字列だとエラーになるので、空にしないよう必ず埋めてください。
📌 ステップ3 - サムネイル・大きな画像を入れる
画像は2種類あります。表示位置が違うので、用途に合わせて選びましょう。
embed.set_thumbnail(url="https://picsum.photos/200") # 右上の小さな画像
embed.set_image(url="https://picsum.photos/600/200") # 下部の大きな画像(バナー)
embed.set_footer(text="Mojangcam Discordボット") # いちばん下の小さな文字- set_thumbnail : 右上の小さなサムネイル (プロフィール・サーバーアイコン向け)。
- set_image : 埋め込み下部の大きなバナー画像。
- set_footer : いちばん下の小さなグレーの文字(出典・ボット名の表示向け)。
- ⚠️ 画像URLは
.png・.jpgのような拡張子で終わっていると安定して表示されます。拡張子のないURLは表示されないことがあります。
📌 全体のコード (コピペOK)
# discord.py 2.x / Python 3.8+
import discord
from discord import app_commands
intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
@client.event
async def on_ready():
await tree.sync() # スラッシュコマンドを登録
print(f"{client.user} 準備完了!")
@tree.command(name="서버정보", description="サーバー情報を埋め込みで表示します")
async def server_info(interaction: discord.Interaction):
guild = interaction.guild
embed = discord.Embed(
title=f"📊 {guild.name} サーバー情報",
description="このサーバーの基本情報を埋め込みでまとめました!",
color=discord.Color.blurple(),
)
embed.add_field(name="メンバー数", value=f"{guild.member_count}人", inline=True)
embed.add_field(name="チャンネル数", value=f"{len(guild.channels)}個", inline=True)
embed.add_field(
name="サーバー作成日",
value=guild.created_at.strftime("%Y-%m-%d"),
inline=False,
)
if guild.icon: # サーバーアイコンがあればサムネイルに
embed.set_thumbnail(url=guild.icon.url)
embed.set_image(url="https://picsum.photos/600/200")
embed.set_footer(
text="Mojangcam Discordボット",
icon_url=client.user.display_avatar.url,
)
await interaction.response.send_message(embed=embed)
client.run("ここにボットトークンを貼り付け")- guild : コマンドが実行されたサーバーのオブジェクトです。ここから名前・メンバー数・作成日をそのまま取り出して使います。
- member_count : サーバーのメンバー数を自動で取得します。
- display_avatar.url : ボットのプロフィール画像のURLです。フッターのアイコンとして入れました。
📌 実行結果
ボットを起動してサーバーで/서버정보と入力すると、タイトル + メンバー数・チャンネル数が横並び + 作成日が1行 + サムネイル・バナー画像が入ったきれいなカードが表示されます!

📌 よくあるエラー
- 画像が表示されない — 原因: URLに拡張子がない、または非公開(ログインが必要な)URL。解決:
.png・.jpgで終わる公開されている画像URLを使ってください。 - HTTPException: In embeds.0.fields.0.value: This field is required — 原因:
valueが空文字列。解決: フィールドの値に最低でも1文字は入れてください。 /서버정보が表示されない — 原因:tree.sync()の書き忘れ、または反映の遅れ。解決:on_readyでsyncしているか確認しましょう。グローバル同期は最大1時間かかることがあるので、テストにはギルド同期を使うと早いです。- メンバー数が
None人・チャンネル数が0個と表示される (実際に私がハマったところです!) — 症状: サーバー名も表示されず、メンバー数はNone、チャンネル数は0で、作成日だけ正常。原因: ボットがそのサーバーに実際には参加していないからです。アプリを「ユーザーインストール(User Install)」だけで追加すると、スラッシュコマンドは表示されてもボットはサーバーのメンバーではないため、サーバー情報にアクセスできません(fetch_guildで404 Unknown Guild、エラーコード10004)。解決: Developer Portal → OAuth2 → URL Generatorでスコープbot+applications.commandsにチェックを入れて招待リンクを作り、そのリンクでボットをサーバーに招待してください。サーバーのメンバー一覧にボットが表示されれば成功です!もう一度/서버정보を実行すると、メンバー数・チャンネル数が正しく表示されます。
💬 まとめ
今回は埋め込み(Embed)で、タイトル・説明・色・フィールドの並べ方・サムネイル・バナー画像まで入れて、ボットのメッセージをカードのように飾ってみました。これでそっけないテキストの代わりに、見やすい情報カードを送れるようになりました! 🙌
次回の#9では、ボタンと埋め込みを組み合わせてページをめくれる「埋め込みページネーション」を作ってみます。お楽しみに!
📚 Discordボット開発シリーズ
- #5 ボタン(Button)のインタラクション
- #6 ドロップダウン(Select Menu)メニュー
- #7 モーダル(Modal)で入力を受け取る
- #8 埋め込み(Embed)を画像・フィールドで飾る ← 今読んでいる記事!
- #9 埋め込みページネーション (予定)
連載 · 全32回中8回目
Discordボット開発
- #1Discordボット開発 - スラッシュコマンド(Slash Command)完全攻略!
- #2スラッシュコマンドにオプション(Arguments)を追加しよう!
- #3スラッシュコマンドにサブコマンド(Subcommand)を追加しよう!
- #4スラッシュコマンドで埋め込み(Embed)を送信しよう!
- #5ボタン(Button)のインタラクションを実装しよう!
- #6ドロップダウン(Select Menu)メニューを実装しよう!
- #7モーダル(Modal)で入力を受け取る方法 (Pythonサンプル付き)
- #8埋め込み(Embed)を画像・フィールドで飾る (Pythonサンプル付き)現在の記事
- #9AI(Claude・ChatGPT API)と連携する! (Pythonサンプル付き)
- #10多言語(i18n)に対応する! (Pythonサンプル付き)
- #11FlaskでWebダッシュボードを作る! (Pythonサンプル付き)
- #12コマンドのクールダウン(Cooldown)・権限(Permission)を管理しよう! (Pythonサンプル付き)
- #13ロール・チャンネルの自動化でサーバーを管理しよう! (Pythonサンプル付き)
- #14データを保存しよう!JSON vs SQLite (Pythonサンプル付き)
- #15슬래시 명령어 그룹(Group)으로 명령어 정리하기! (파이썬 예제) (韓国語)
- #16리마인더·알림 기능 만들기! 봇이 먼저 말 걸게 하기 (파이썬 예제) (韓国語)
- #17RAG로 문서 기반 답변봇 만들기! 우리 서버 전용 FAQ 봇 (파이썬 예제) (韓国語)
- #18투표(Poll) 기능 만들기! 다수결로 정하는 서버 규칙 (파이썬 예제) (韓国語)
- #19Cog로 코드 쪼개기! 1000줄 봇도 안 더러워지는 구조 (파이썬 예제) (韓国語)
- #20자동 환영 메시지·온보딩 만들기! 규칙 동의 버튼으로 자동 역할 부여 (파이썬 예제) (韓国語)
- #21키워드 자동응답·금지어 필터 만들기! 경고 누적으로 자동 제재까지 (파이썬 예제) (韓国語)
- #22슬래시 명령어 자동완성(Autocomplete) 만들기! 금지어를 골라서 추가·삭제 (파이썬 예제) (韓国語)
- #23aiosqlite로 비동기 DB 제대로 설계하기! JSON 탈출 (파이썬 예제) (韓国語)
- #24채널 난독화(Channel Obfuscation) 대응하기! 11/16부터 안 보이는 채널이 생겨요 (파이썬 예제) (韓国語)
- #25봇이 죽지 않게! 에러 핸들링·로깅 체계 잡기 (파이썬 예제) (韓国語)
- #26티켓(Ticket) 문의 시스템 만들기! 버튼 하나로 1:1 상담 채널 자동 생성 (파이썬 예제) (韓国語)
- #27티켓 담당자 배정·우선순위 만들기! 스태프가 여러 명이어도 안 꼬이게 (파이썬 예제) (韓国語)
- #28레벨·경험치(XP) 시스템 만들기! 채팅할수록 레벨업, 랭킹판까지 (파이썬 예제) (韓国語)
- #29화폐·상점(Economy) 시스템 만들기! 코인 벌어서 아이템 사기 (파이썬 예제) (韓国語)
- #30投票・アンケート(Poll)ボットを作ろう!ネイティブ投票+ボタンでリアルタイム集計まで(Pythonサンプル) 🗳️
- #32サーバーログ・監査ログ(Audit Log)チャンネルを作ろう!メッセージの削除・編集・入退室・キックまで自動記録(Pythonサンプル) 🕵️
- #33임시 음성방 확장, 파티방 만들기! 방장 위임·강퇴·초대 전용(비공개) 방 + 전용 채팅방 자동 생성 (파이썬 예제) 🎉 (韓国語)
