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

Pycord机器人重启后无需重发/编辑消息恢复按钮交互功能咨询

Discord机器人重启后按钮交互失效的解决办法

问题描述

开发自定义角色(selfroles)机器人时遇到:每次重启机器人,之前发送的带按钮的消息点击后会显示“This interaction failed”,必须编辑或重发消息才能让按钮恢复正常。

核心原因

Discord的交互组件(按钮、选择菜单等)会和机器人的会话实例绑定。机器人重启后,之前创建的视图(View)和组件的内存引用全部丢失,无法识别旧消息里的组件交互请求,导致报错。

解决方案:使用持久化视图

不需要重发或编辑旧消息,通过持久化视图就能让机器人重启后继续处理旧消息的按钮交互,关键要做好两点:

  • 给视图和每个组件设置唯一的custom_id
  • 机器人启动时注册持久化视图

修改后的代码示例

  1. 定义带持久化配置的视图类(替代原来的临时视图):
import discord

class RequestModal(discord.ui.Modal):
    # 这里假设你的RequestModal已正确定义,示例如下
    def __init__(self):
        super().__init__(title="Make a Request")
        self.add_item(discord.ui.TextInput(label="Your Request", style=discord.TextStyle.long))

class RequestView(discord.ui.View):
    def __init__(self):
        # 设置timeout为None,让视图永久有效
        super().__init__(timeout=None)

    # 用装饰器定义按钮,必须指定唯一的custom_id
    @discord.ui.button(label="make a request", custom_id="persistent_request_button")
    async def request_button_callback(self, interaction: discord.Interaction, button: discord.ui.Button):
        modal = RequestModal()
        await interaction.response.send_modal(modal)
  1. 机器人启动时注册视图:
    在机器人的启动逻辑或on_ready事件中添加注册代码:
# 假设你的机器人实例是bot
@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")
    # 注册持久化视图,机器人重启后会自动绑定对应custom_id的组件
    bot.add_view(RequestView())
  1. 发送带持久化视图的消息:
embed = discord.Embed(description="Title\nDescription")
await requestschannel.send(embed=embed, view=RequestView())

注意事项

  • custom_id必须全局唯一,不能和其他组件重复;如果是动态生成的组件(比如多个不同的请求按钮),要确保每个按钮的custom_id带唯一标识(比如加上用户ID或频道ID前缀)
  • 必须使用discord.py 2.0及以上版本,旧版本不支持持久化视图
  • 如果后续需要修改按钮的逻辑或样式,只要保持custom_id不变,重启机器人后旧消息的按钮会自动绑定新的逻辑,无需重发消息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:39:40