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

Discord嵌入消息添加角色分配按钮失败:按钮不显示求助

Discord按钮不显示问题的修复方案

核心问题分析

你的代码里按钮无法显示主要有两个关键原因:

  • RoleRequestView类定义在on_message事件内部,Discord.py无法正确识别并注册这个设置了timeout=None的持久化视图
  • 未给按钮绑定回调逻辑,也没有全局注册视图实例

修复步骤及代码修改

1. 将View类移到全局作用域

把RoleRequestView从on_message函数内移出,放在代码全局区域(客户端实例定义后),确保Discord.py能全局识别这个视图类。

2. 为按钮添加回调函数

给每个按钮绑定callback方法,实现分配角色的核心逻辑,同时要确保机器人拥有管理角色的权限。

3. 全局注册持久化视图

在机器人启动完成后,用client.add_view()注册视图,保证机器人重启后按钮依然能正常响应。

完整修复后的代码

import discord
from discord.ext import commands

# 开启必要的意图
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

# 全局定义视图类
class RoleRequestView(discord.ui.View):
    def __init__(self, user):
        super().__init__(timeout=None)
        self.user = user

    # Stable角色分配按钮回调
    @discord.ui.button(label="stable", style=discord.ButtonStyle.gray, custom_id="stable_button")
    async def stable_btn_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
        # 替换为你的stable角色ID
        stable_role = interaction.guild.get_role(123456789012345678)
        if stable_role and self.user in interaction.guild.members:
            await self.user.add_roles(stable_role)
            await interaction.response.send_message(f"已为{self.user.mention}分配stable角色", ephemeral=True)
        else:
            await interaction.response.send_message("角色不存在或用户已离开服务器", ephemeral=True)

    # Nightly角色分配按钮回调
    @discord.ui.button(label="nightly", style=discord.ButtonStyle.gray, custom_id="nightly_button")
    async def nightly_btn_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
        # 替换为你的nightly角色ID
        nightly_role = interaction.guild.get_role(987654321098765432)
        if nightly_role and self.user in interaction.guild.members:
            await self.user.add_roles(nightly_role)
            await interaction.response.send_message(f"已为{self.user.mention}分配nightly角色", ephemeral=True)
        else:
            await interaction.response.send_message("角色不存在或用户已离开服务器", ephemeral=True)

@client.event
async def on_ready():
    print(f'已登录为 {client.user}')
    # 注册持久化视图
    client.add_view(RoleRequestView(user=None))

@client.event
async def on_message(message):
    if message.author.bot:
        return

    if message.channel.id == 1089250195042214039:
        if message.attachments:
            attachment_url = message.attachments[0].url
            admin_channel = client.get_channel(1065572523548344381)
            
            view = RoleRequestView(message.author)
            embed = discord.Embed(title="[Send photo] Role request ~ ", description=f"Requester: {message.author.mention}")
            embed.set_image(url=attachment_url)
            
            await admin_channel.send(embed=embed, view=view)

    await client.process_commands(message)

# 替换为你的机器人Token
client.run('YOUR_BOT_TOKEN')

额外注意事项

  • 必须替换代码中的stable_role和nightly_role对应的ID为你服务器的实际角色ID
  • 在Discord开发者平台的Bot设置中开启消息内容意图,否则机器人无法读取消息附件
  • 确保机器人拥有管理角色的服务器权限,否则无法执行角色分配操作
  • 你的discord.py版本必须是2.0及以上,旧版本不支持按钮组件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:07:16