discord.py体育提醒Cog交互失败问题求助
必须给组件写回调函数
每个按钮、下拉菜单都得有对应的callback方法,比如做按钮子类的时候,要写async def callback(self, interaction: discord.Interaction):,方法名必须是callback,不能拼错。没写这个方法的话,Discord不知道点了按钮该干啥,直接报错。3秒内必须回应交互
用户点按钮后,你的代码得在3秒内给Discord一个回应,要么直接发消息await interaction.response.send_message("内容");如果处理时间长(比如查数据),先调用await interaction.response.defer(),之后再用await interaction.followup.send("后续内容")。完全不回应的话就会触发交互失败。组件要正确加到View里再发送
不能只创建按钮就完事,要把按钮放到discord.ui.View()实例里,比如:view = discord.ui.View() view.add_item(你的按钮实例) await ctx.send("选择项目", view=view)没把组件加到View里,或者发送消息时没传
view参数,点击后Discord找不到对应逻辑。注意View的超时时间
默认View180秒后就失效,超时后点按钮会报错。如果需要长期能用,创建View时设timeout=None;要是想重启机器人后还能用,得加persistent=True,同时机器人启动时要注册这些持久化组件。检查机器人权限
确保机器人在服务器里有「发送消息」「嵌入链接」这些权限,要是回调里要发消息或者嵌入内容,权限不够的话,交互会失败但PyCharm不会显示错误(Discord不会把权限问题抛到本地日志)。确认discord.py版本是2.0+
discord.ui是discord.py 2.0才正式支持的,旧版本根本用不了。打开终端输pip install -U discord.py更新到最新版。别混用ctx和interaction
在回调函数里,别用ctx.send(),得用interaction相关的方法,比如interaction.response.send_message()或者interaction.followup.send(),用错了会导致逻辑失效。
内容的提问来源于stack exchange,提问作者ar.jorge91

