カテゴリー: Discordボット開発

Discordボット開発#8埋め込み(Embed)を画像・フィールドで飾る (Pythonサンプル付き)

この記事は韓国語の原文から翻訳したものです。

目次9項目

こんにちは!Mojangcamです 😎

前回の#7ではモーダル(Modal)でユーザーから入力を受け取ってみました。今回の#8では、ボットが送るメッセージをぐっと見やすくしてくれる埋め込み(Embed)を扱います!

埋め込みは、Discordでタイトル・説明・フィールド・画像・色をすっきりまとめて表示するカード型のメッセージです。サーバー情報、プロフィールカード、お知らせ、ユーザーランキングなどを作るとき、そっけないテキストよりずっと見栄えが良くなります。今回はフィールド(Field)の並べ方とサムネイル・大きな画像の入れ方まで、コピペでそのまま試せるサンプルでまとめました!

📌 準備するもの

  • Python 3.8+
  • discord.py 2.x (スラッシュコマンド・埋め込みの最新機能を使います)
  • Discordボットのトークン & サーバーへの招待済み (前回までにセットアップしていればそのままでOK)
cmake
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)

Python
# 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行 + サムネイル・バナー画像が入ったきれいなカードが表示されます!

📌 よくあるエラー

  1. 画像が表示されない — 原因: URLに拡張子がない、または非公開(ログインが必要な)URL。解決: .png・.jpgで終わる公開されている画像URLを使ってください。
  2. HTTPException: In embeds.0.fields.0.value: This field is required — 原因: valueが空文字列。解決: フィールドの値に最低でも1文字は入れてください。
  3. /서버정보が表示されない — 原因: tree.sync()の書き忘れ、または反映の遅れ。解決: on_readyでsyncしているか確認しましょう。グローバル同期は最大1時間かかることがあるので、テストにはギルド同期を使うと早いです。
  4. メンバー数が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ボット開発

  1. #1Discordボット開発 - スラッシュコマンド(Slash Command)完全攻略!
  2. #2スラッシュコマンドにオプション(Arguments)を追加しよう!
  3. #3スラッシュコマンドにサブコマンド(Subcommand)を追加しよう!
  4. #4スラッシュコマンドで埋め込み(Embed)を送信しよう!
  5. #5ボタン(Button)のインタラクションを実装しよう!
  6. #6ドロップダウン(Select Menu)メニューを実装しよう!
  7. #7モーダル(Modal)で入力を受け取る方法 (Pythonサンプル付き)
  8. #8埋め込み(Embed)を画像・フィールドで飾る (Pythonサンプル付き)現在の記事
  9. #9AI(Claude・ChatGPT API)と連携する! (Pythonサンプル付き)
  10. #10多言語(i18n)に対応する! (Pythonサンプル付き)
  11. #11FlaskでWebダッシュボードを作る! (Pythonサンプル付き)
  12. #12コマンドのクールダウン(Cooldown)・権限(Permission)を管理しよう! (Pythonサンプル付き)
  13. #13ロール・チャンネルの自動化でサーバーを管理しよう! (Pythonサンプル付き)
  14. #14データを保存しよう!JSON vs SQLite (Pythonサンプル付き)
  15. #15슬래시 명령어 그룹(Group)으로 명령어 정리하기! (파이썬 예제) (韓国語)
  16. #16리마인더·알림 기능 만들기! 봇이 먼저 말 걸게 하기 (파이썬 예제) (韓国語)
  17. #17RAG로 문서 기반 답변봇 만들기! 우리 서버 전용 FAQ 봇 (파이썬 예제) (韓国語)
  18. #18투표(Poll) 기능 만들기! 다수결로 정하는 서버 규칙 (파이썬 예제) (韓国語)
  19. #19Cog로 코드 쪼개기! 1000줄 봇도 안 더러워지는 구조 (파이썬 예제) (韓国語)
  20. #20자동 환영 메시지·온보딩 만들기! 규칙 동의 버튼으로 자동 역할 부여 (파이썬 예제) (韓国語)
  21. #21키워드 자동응답·금지어 필터 만들기! 경고 누적으로 자동 제재까지 (파이썬 예제) (韓国語)
  22. #22슬래시 명령어 자동완성(Autocomplete) 만들기! 금지어를 골라서 추가·삭제 (파이썬 예제) (韓国語)
  23. #23aiosqlite로 비동기 DB 제대로 설계하기! JSON 탈출 (파이썬 예제) (韓国語)
  24. #24채널 난독화(Channel Obfuscation) 대응하기! 11/16부터 안 보이는 채널이 생겨요 (파이썬 예제) (韓国語)
  25. #25봇이 죽지 않게! 에러 핸들링·로깅 체계 잡기 (파이썬 예제) (韓国語)
  26. #26티켓(Ticket) 문의 시스템 만들기! 버튼 하나로 1:1 상담 채널 자동 생성 (파이썬 예제) (韓国語)
  27. #27티켓 담당자 배정·우선순위 만들기! 스태프가 여러 명이어도 안 꼬이게 (파이썬 예제) (韓国語)
  28. #28레벨·경험치(XP) 시스템 만들기! 채팅할수록 레벨업, 랭킹판까지 (파이썬 예제) (韓国語)
  29. #29화폐·상점(Economy) 시스템 만들기! 코인 벌어서 아이템 사기 (파이썬 예제) (韓国語)
  30. #30投票・アンケート(Poll)ボットを作ろう!ネイティブ投票+ボタンでリアルタイム集計まで(Pythonサンプル) 🗳️
  31. #32サーバーログ・監査ログ(Audit Log)チャンネルを作ろう!メッセージの削除・編集・入退室・キックまで自動記録(Pythonサンプル) 🕵️
  32. #33임시 음성방 확장, 파티방 만들기! 방장 위임·강퇴·초대 전용(비공개) 방 + 전용 채팅방 자동 생성 (파이썬 예제) 🎉 (韓国語)
全32回を表示閉じる

著者

Mojangcam

自分でコードを書き、サーバーを動かし、詰まったエラーを解決しながら学んだことを記録する開発・IT実践ブログ