You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord bot将事件改为类中Cog.listener后偶现获取Guild ID报错如何解决

核心问题

  • on_message 事件监听器的传入参数是 Message 对象,不是命令上下文 Context,你将参数命名为ctx属于误用,易混淆用法。
  • 偶发报错的根本原因是:当消息从私聊频道(DM)发送时,Message 对象的 guild 属性会返回 None,此时访问 None.id 会触发属性不存在报错;只有公服频道发送的消息才会正常携带 guild 属性,这就是报错偶发的原因。
  • 若存在Guild is not defined报错,是你代码中直接用到Guild类型的位置没有提前导入对应的类。

修复方案

  1. 修正事件参数命名,明确变量类型,避免逻辑混淆:
# 正确的事件参数定义
@commands.Cog.listener()
async def on_message(self, message):
  1. 访问guild属性前增加非空校验,过滤不需要处理的私聊场景:
# 非服务器消息直接跳过后续逻辑
if not message.guild:
    return
guild_id = message.guild.id
  1. 若需要处理私聊场景的消息,单独写分支逻辑,不要强制访问guild相关属性。
  2. 针对Guild is not defined报错,在代码头部补充对应导入语句即可:
from discord import Guild

内容的提问来源于stack exchange,提问作者Sora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 10:45:04