Discord bot将事件改为类中Cog.listener后偶现获取Guild ID报错如何解决
核心问题
on_message事件监听器的传入参数是Message对象,不是命令上下文Context,你将参数命名为ctx属于误用,易混淆用法。- 偶发报错的根本原因是:当消息从私聊频道(DM)发送时,
Message对象的guild属性会返回None,此时访问None.id会触发属性不存在报错;只有公服频道发送的消息才会正常携带guild属性,这就是报错偶发的原因。 - 若存在
Guild is not defined报错,是你代码中直接用到Guild类型的位置没有提前导入对应的类。
修复方案
- 修正事件参数命名,明确变量类型,避免逻辑混淆:
# 正确的事件参数定义 @commands.Cog.listener() async def on_message(self, message):
- 访问
guild属性前增加非空校验,过滤不需要处理的私聊场景:
# 非服务器消息直接跳过后续逻辑 if not message.guild: return guild_id = message.guild.id
- 若需要处理私聊场景的消息,单独写分支逻辑,不要强制访问
guild相关属性。 - 针对
Guild is not defined报错,在代码头部补充对应导入语句即可:
from discord import Guild
内容的提问来源于stack exchange,提问作者Sora
相关产品推荐
相关产品推荐

