discord.py 如何校验消息是否来自指定服务器及代码失效原因排查
代码失效核心原因
- 调用已废弃属性触发异常中断:
message.channel.server是discord.py 0.x版本的旧API,当前所有受支持的1.x、2.x版本已完全移除该属性,对应的服务器(公会)统一命名为guild,获取消息所属服务器的正确路径是message.guild。原代码在执行属性查找时就会抛出AttributeError,整个事件逻辑直接中断,根本走不到后续的消息内容判断环节。 - 类型不匹配导致判断永远不成立:discord.py返回的所有实体ID为整数类型,原代码中将目标ID写为字符串形式的
'783763061907527',整数和字符串的等值比较永远返回False,哪怕修正了属性路径,判断条件也无法命中。 - 存在隐藏逻辑缺陷:原代码未兼容非服务器私信场景,当用户给bot发送私信时
message.guild值为None,此时强行取所属服务器ID会触发空值报错;同时未跳过bot自身发送的消息,存在循环触发回复、刷爆频道的风险。如果bot配置了内置前缀命令,单独覆写on_message事件时不补充命令处理逻辑,还会导致所有注册的前缀命令完全失效。
正确实现代码
# 定义目标服务器ID为整数类型,不要加引号 TARGET_GUILD_ID = 783763061907527 @bot.event async def on_message(message): # 跳过bot自身发送的消息,避免无限循环触发 if message.author.bot: return # 组合判断:确认消息来自服务器(非私信)+ 属于目标服务器 + 内容匹配指定前缀 if message.guild and message.guild.id == TARGET_GUILD_ID and message.content.startswith('!test'): await message.channel.send('this is a test') # 必须添加该行,否则bot所有注册的前缀命令将无法响应 await bot.process_commands(message)
实现注意点
- 不要从channel对象反查所属服务器,直接通过
message.guild获取即可,写法更简洁也能避免嵌套属性查找出错。 - 所有discord实体ID不要加引号写成字符串,保持和库返回的整数类型一致,从根源上避免类型比较失败。
await bot.process_commands(message)是必加逻辑,只要使用bot内置命令框架,覆写on_message事件就不能漏掉这行。
内容的提问来源于stack exchange,提问作者ssssssssss
相关产品推荐
相关产品推荐

