You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.py 如何为Embed嵌入消息添加按钮及设置页脚?

解决方案

1. 前置依赖确认

首先确保你使用的是discord.py 2.0及以上版本,旧版本(v1.x)无原生交互组件支持,过往旧教程多使用已停止维护的第三方兼容库实现按钮,是你之前方案失效的核心原因。升级命令:
pip install --upgrade discord.py

2. 修复set_footer不生效问题

set_footer方法需要在Embed发送之前调用,直接在你现有设置缩略图的代码后添加即可,示例写法:

# 放在set_thumbnail之后、send方法之前调用
HelpEmbed.set_footer(
    text="自定义页脚文字",
    icon_url=client.user.avatar.url # 可选参数,可设置为任意图片链接,不需要可以直接删除该参数
)

3. 交互按钮实现方案

discord.py v2.x使用discord.ui.View类承载交互按钮,可自定义按钮样式、文字和点击回调逻辑,完整修改后的代码如下:

import discord
from discord import ui

# 定义承载按钮的视图类
class HelpView(ui.View):
    def __init__(self):
        super().__init__(timeout=300) # 按钮300秒后过期,设为None则永久有效(机器人重启后自动失效)

    # 定义游戏命令按钮
    @ui.button(label="查看游戏命令", style=discord.ButtonStyle.green, emoji="🎮")
    async def game_cmd_callback(self, interaction: discord.Interaction, button: ui.Button):
        # 点击按钮后的回调逻辑,ephemeral=True表示仅点击用户可见该回复
        await interaction.response.send_message("游戏命令列表:\n发送!GameCMDS查看所有游戏相关指令", ephemeral=True)

    # 定义服务器命令按钮
    @ui.button(label="查看服务器命令", style=discord.ButtonStyle.blurple, emoji="⚙️")
    async def server_cmd_callback(self, interaction: discord.Interaction, button: ui.Button):
        await interaction.response.send_message("服务器命令列表:\n发送!ServerCMDS查看所有服务器相关指令", ephemeral=True)

@client.event
async def on_message(message):
    # 过滤机器人自身发送的消息,避免循环触发
    if message.author.bot:
        return
    if message.content.lower().startswith("!help"):
        HelpEmbed = discord.Embed(
            title="帮助面板",
            description="你可以在这里找到机器人的所有使用说明",
            color=discord.Colour.blue()
        )
        HelpEmbed.add_field(
            name="游戏命令",
            value="这些是游戏相关操作命令,也可以点击下方按钮直接查看所有游戏指令",
            inline=False
        )
        HelpEmbed.add_field(
            name="服务器命令",
            value="这些是服务器相关操作命令,也可以点击下方按钮直接查看所有服务器指令",
            inline=False
        )
        HelpEmbed.set_thumbnail(
            url="https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=1244&q=80"
        )
        # 添加页脚
        HelpEmbed.set_footer(text="机器人帮助系统", icon_url=client.user.avatar.url)
        # 实例化按钮视图
        view = HelpView()
        # 发送时同时传入embed和view参数
        await message.channel.send(embed=HelpEmbed, view=view)
    # 如果你同时使用了commands.Bot的命令扩展,需要添加此行处理其他命令
    # await client.process_commands(message)

额外说明

  • 按钮回调函数必须调用await interaction.response.xxx()方法给出响应,否则用户点击后会显示「交互失败」提示
  • 如果按钮只需要跳转外部链接,不需要自定义回调,可以直接通过add_item方法添加:
    view = ui.View()
    view.add_item(ui.Button(label="跳转社区", url="自定义链接地址"))
    

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:24:07