分类: Discord 机器人开发

Discord 机器人开发#8用嵌入消息(Embed)的图片和字段美化消息(Python 示例)

本文译自韩语原文。

目录9 项

大家好!我是 Mojangcam 😎

上一篇 #7 我们用模态框(Modal)接收了用户输入。这一篇 #8 来讲能让机器人发出的消息漂亮得多的嵌入消息(Embed)!

嵌入消息是 Discord 里一种卡片式消息,可以把标题、描述、字段、图片和颜色整齐地放在一起展示。做服务器信息、个人资料卡、公告、用户排行榜这类内容时,比单调的纯文本好看得多。今天我把字段(Field)排列和添加缩略图、大图都整理成了直接复制粘贴就能跟着做的示例!

📌 准备工作

  • Python 3.8+
  • discord.py 2.x(使用斜杠命令和嵌入消息的最新功能)
  • Discord 机器人 Token 并已把机器人邀请进服务器(如果前几篇已经配置好,直接沿用就行)
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 字段横向并排显示。(一行最多 3 个)
  • inline=False:独占一整行。很适合当分隔线用。
  • name / value 为空字符串时会报错,请务必填上内容。

📌 第 3 步 - 添加缩略图和大图

图片有两种。显示位置不同,请根据用途选择。

代码
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 这类扩展名结尾才能稳定显示。没有扩展名的地址可能显示不出来。

📌 完整代码(可直接复制)

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("在这里粘贴机器人Token")
  • guild:执行命令的服务器对象。名称、成员数、创建日期都可以直接从这里取。
  • member_count:自动获取服务器的成员数。
  • display_avatar.url:机器人头像的地址。这里把它用作 footer 的图标。

📌 运行结果

启动机器人后在服务器里输入 /서버정보,就会出现一张漂亮的卡片,里面有标题 + 横向并排的成员数和频道数 + 单独一行的创建日期 + 缩略图和横幅图片!

📌 常见报错

  1. 图片不显示 — 原因:URL 没有扩展名,或者是非公开(需要登录)的地址。解决:使用以 .png、.jpg 结尾的公开图片 URL。
  2. HTTPException: In embeds.0.fields.0.value: This field is required — 原因:value 是空字符串。解决:字段值里至少要填一个字符。
  3. /서버정보 不出现 — 原因:漏了 tree.sync(),或者同步还没生效。解决:确认在 on_ready 里执行了 sync。全局同步最多可能要 1 小时,测试时用服务器(guild)同步会快很多。
  4. 成员数显示 None 人、频道数显示 0 个(我自己真的卡在这里过!) — 症状:服务器名称也不显示,成员数 None、频道数 0,只有创建日期正常。原因:机器人其实并没有加入那个服务器。如果只通过"用户安装(User Install)"添加应用,斜杠命令虽然会出现,但机器人不是服务器成员,所以无法读取服务器信息(fetch_guild 时返回 404 Unknown Guild,错误代码 10004)。解决:在开发者门户 → 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为 Slash Command 添加选项(Arguments)!
  3. #3在 Slash Command 中添加子命令(Subcommand)!
  4. #4用 Slash Command 发送 Embed 嵌入消息!
  5. #5实现按钮(Button)交互!
  6. #6实现下拉菜单(Select Menu)!
  7. #7用模态框(Modal)接收用户输入(Python 示例)
  8. #8用嵌入消息(Embed)的图片和字段美化消息(Python 示例)当前文章
  9. #9接入 AI(Claude·ChatGPT API)!(Python 示例)
  10. #10支持多语言(i18n)!(Python 示例)
  11. #11用 Flask 制作网页仪表盘!(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 实战博客