Discord.py Cog代码报错NoneType object has no attribute 'send'如何解决
错误原因及修复方案
错误原因
- 你在Cog文件的全局作用域额外实例化了一个
discord.Client()对象,该对象从未启动登录、没有和Discord服务器建立连接,也没有任何频道缓存,使用它调用get_channel()无法获取到对应频道,返回值为None,调用None.send()就触发了NoneType object has no attribute 'send'报错。 - 你在Cog的
__init__方法中已经将主文件传入的、正常运行的client实例存储为self.bot,但实际获取频道时没有使用这个有效实例,反而调用了全局的无效实例。
修复步骤
- 删除Cog文件中全局声明的
client = discord.Client()行,该声明完全冗余,Cog不需要单独实例化客户端。 - 将
on_message_delete监听器中获取频道的代码替换为使用self.bot实例:
修改前:
channel = client.get_channel(888600482317213786)
修改后:
channel = self.bot.get_channel(888600482317213786)
额外优化建议
可以增加频道存在性判断,避免频道ID错误、bot无频道访问权限时出现同类报错:
channel = self.bot.get_channel(888600482317213786) if channel is not None: deleted.add_field(name="Message", value=message.content) deleted.timestamp = message.created_at await channel.send(embed=deleted)
内容的提问来源于stack exchange,提问作者lancetabler
相关产品推荐
相关产品推荐

