Discord.py调用cogs命令无响应,附完整代码求问题排查
错误原因
- 客户端实例冲突
自定义的BotClient继承了discord.Client,但又在__init__方法内部单独创建了一个commands.Bot实例,所有cog加载、前缀配置都在这个内部实例上完成,但最终调用run方法启动的是父类discord.Client的实例,该实例没有任何命令配置和cog加载,自然不会响应命令。 - 缺少必要的消息内容权限
discord.py v2.0及以上版本必须手动开启message_contentIntent才能读取用户发送的消息内容,进而触发前缀命令,当前配置仅开启了membersIntent,没有开启message_content,就算客户端配置正确也无法触发命令。 - 初始化逻辑错误
调用父类__init__方法之前就执行了大量初始化操作,不符合类继承的初始化逻辑,同时super().run()是阻塞方法,执行后不会返回有效客户端实例,将其赋值给self.client没有任何意义。
修复方案
直接简化main.py逻辑,不需要额外继承discord.Client,直接使用commands.Bot实例即可,修改后代码如下:
from dotenv import load_dotenv import discord from discord.ext import commands import os load_dotenv() intents = discord.Intents.default() intents.members = True intents.message_content = True # 开启消息内容权限 client = commands.Bot(command_prefix="-", intents=intents) extensions = ['cogs.music'] for extension in extensions: try: client.load_extension(extension) print(f"{extension} 加载成功") except Exception as e: exc = f"{type(e).__name__}: {e}" print(f"加载扩展 {extension} 失败\n{exc}") if __name__ == "__main__": try: client.run(os.getenv("TOKEN"), reconnect=True) except (KeyboardInterrupt, RuntimeError): pass
注意:代码修改完成后,还需要进入Discord开发者平台的对应Bot设置页,开启
Message Content Intent的开关,否则权限不会生效。
内容的提问来源于stack exchange,提问作者flow.
相关产品推荐
相关产品推荐

