Pycord机器人重启后无需重发/编辑消息恢复按钮交互功能咨询
Discord机器人重启后按钮交互失效的解决办法
问题描述
开发自定义角色(selfroles)机器人时遇到:每次重启机器人,之前发送的带按钮的消息点击后会显示“This interaction failed”,必须编辑或重发消息才能让按钮恢复正常。
核心原因
Discord的交互组件(按钮、选择菜单等)会和机器人的会话实例绑定。机器人重启后,之前创建的视图(View)和组件的内存引用全部丢失,无法识别旧消息里的组件交互请求,导致报错。
解决方案:使用持久化视图
不需要重发或编辑旧消息,通过持久化视图就能让机器人重启后继续处理旧消息的按钮交互,关键要做好两点:
- 给视图和每个组件设置唯一的
custom_id - 机器人启动时注册持久化视图
修改后的代码示例
- 定义带持久化配置的视图类(替代原来的临时视图):
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)
- 机器人启动时注册视图:
在机器人的启动逻辑或on_ready事件中添加注册代码:
# 假设你的机器人实例是bot @bot.event async def on_ready(): print(f"Logged in as {bot.user}") # 注册持久化视图,机器人重启后会自动绑定对应custom_id的组件 bot.add_view(RequestView())
- 发送带持久化视图的消息:
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
相关产品推荐
相关产品推荐

