Discord.py开发斜杠命令与按钮时出现custom_id KeyError报错求解
问题原因
- 多交互组件库冲突:你同时初始化了
discord_buttons_plugin的ButtonsClient和discord-components的DiscordComponents,两个库都会监听Discord的socket响应事件,当斜杠命令触发非按钮类的交互事件时,discord_buttons_plugin的事件监听器会强制读取不存在的custom_id字段,触发报错。 - 链接按钮本身无custom_id:你代码中使用了
style=5的Link类型按钮,这类按钮Discord官方不会返回custom_id字段,discord_buttons_plugin没有做兼容校验,碰到这类交互直接抛出KeyError。 - 代码存在缩进错误:
play_voice函数中await SeagamiCommandsListening.commands_Listening.play_(ctx, 링크)行缩进异常,会导致逻辑执行不符合预期。
解决方案
方案1(推荐):统一使用单个交互组件库
删除冗余的discord_buttons_plugin相关代码,全量使用discord-components处理按钮交互,避免库冲突:
- 删除所有
from discord_buttons_plugin import *导入语句,删除buttons = ButtonsClient(seagami)初始化代码 - 将原有
ButtonsClient的按钮定义、发送、回调逻辑替换为discord-components的对应写法,该库原生支持所有按钮类型、斜杠命令交互,不存在字段兼容问题。
方案2:保留现有库,删除冲突初始化
如果要继续使用discord_buttons_plugin,删除on_ready事件中的DiscordComponents(seagami)初始化语句,避免两个库同时监听socket事件。同时需要手动给discord_buttons_plugin打兼容补丁:找到库源码的soclistener方法,在读取custom_id前增加字段存在性判断:
# 修改discord_buttons_plugin/__main__.py第17行附近代码 if "custom_id" in data["data"]: await self.emit(data["data"]["custom_id"], data)
额外修复
修正play_voice函数的缩进错误,保证业务逻辑正确执行。
内容的提问来源于stack exchange,提问作者Yuna
相关产品推荐
相关产品推荐

