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

如何用Discord.py创建可执行随机回复命令的角色专属按钮

Discord机器人按钮功能优化:重新执行命令+角色权限限制

你的原代码存在两个核心问题:Embed和按钮分开发送,且按钮没有绑定重新执行逻辑与权限限制。下面是修改后的完整实现方案:

核心改动点

  • 把Embed和按钮整合到同一条回复中,避免消息拆分
  • 给按钮添加回调逻辑,点击后重新随机选择Embed并更新当前消息
  • 加入角色权限校验,仅允许指定角色用户触发按钮

修改后的完整代码

import random
import discord
from discord.ext import commands

# 替换为你要限制的目标角色ID(整数类型)
ALLOWED_ROLE_ID = 123456789012345678

bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())

class RefreshButton(discord.ui.Button):
    def __init__(self):
        super().__init__(label="刷新", style=discord.ButtonStyle.primary)
    
    async def callback(self, interaction: discord.Interaction):
        # 检查用户是否拥有指定角色
        if not any(role.id == ALLOWED_ROLE_ID for role in interaction.user.roles):
            await interaction.response.send_message("你没有权限使用这个按钮!", ephemeral=True)
            return
        
        # 重新随机生成Embed内容
        items = [
            discord.Embed(title="this is for a test"),
            discord.Embed(title="this is the second test"),
            discord.Embed(title="this is the third test"),
            discord.Embed(title="this is the fourth test"),
            discord.Embed(title="this is the fifth test"),
            discord.Embed(title="this is the sixth test"),
            discord.Embed(title="this is the seventh test"),
            discord.Embed(title="this is the eighth test")
        ]
        random_item = random.choice(items)
        
        # 更新当前消息的Embed内容
        await interaction.response.edit_message(embed=random_item)

@bot.command()
async def button(ctx):
    # 初始化按钮视图
    view = discord.ui.View()
    view.add_item(RefreshButton())
    
    # 生成初始随机Embed
    items = [
        discord.Embed(title="this is for a test"),
        discord.Embed(title="this is the second test"),
        discord.Embed(title="this is the third test"),
        discord.Embed(title="this is the fourth test"),
        discord.Embed(title="this is the fifth test"),
        discord.Embed(title="this is the sixth test"),
        discord.Embed(title="this is the seventh test"),
        discord.Embed(title="this is the eighth test")
    ]
    random_item = random.choice(items)
    
    # 发送带按钮的Embed消息
    await ctx.reply(embed=random_item, view=view)

bot.run("你的机器人TOKEN")

关键细节说明

  1. 权限校验逻辑:在按钮回调中遍历用户角色列表,对比目标角色ID,无权限时发送仅用户可见的提示(ephemeral=True)。
  2. 消息更新方式:通过interaction.response.edit_message直接修改原消息的Embed,避免重复发送新消息,提升交互体验。
  3. 按钮类封装:将按钮逻辑封装为自定义类,代码结构更清晰,后续扩展功能也更方便。

注意:记得把ALLOWED_ROLE_ID替换为实际的角色ID,同时确保机器人已开启服务器成员相关Intents权限,否则无法正确获取用户角色信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:15:18