discord.py在服务器内运行时ctx.message.guild返回None如何修复?
问题根因
- 该报错由Discord机器人的网关意图配置缺失导致。从discord.py 1.5版本开始,官方默认关闭了服务器相关的特权网关意图,未开启对应权限的情况下,机器人无法在上下文对象中获取到服务器实例,
ctx.message.guild就会返回None,调用id属性就会触发属性不存在的报错。 - 排除场景:确认命令是在服务器的公开/私有频道内触发,私聊机器人的场景下
ctx.message.guild本身就会返回None,属于正常逻辑。
修复步骤
- 打开Discord开发者平台,进入对应机器人的设置页,找到「Privileged Gateway Intents」模块,开启
Guilds Intent开关,如果需要用到成员相关能力还可以同步开启Server Members Intent。 - 调整机器人初始化代码,显式声明你需要用到的网关意图,示例代码如下:
import discord from discord.ext import commands # 初始化意图配置 intents = discord.Intents.default() intents.guilds = True # 如果你的机器人用的是前缀触发命令,discord.py 2.0及以上版本需要额外开启消息内容意图 intents.message_content = True # 实例化机器人时传入意图参数 bot = commands.Bot(command_prefix='你设置的命令前缀', intents=intents)
- 保存修改后重启机器人,在服务器内重新触发命令即可正常获取到服务器ID。
内容的提问来源于stack exchange,提问作者real trappa
相关产品推荐
相关产品推荐

