Python开发Discord机器人触发NoneType无mentioned_in属性报错如何解决
问题原因分析
- 报错
AttributeError: 'NoneType' object has no attribute 'mentioned_in'的核心原因是midway变量为空值:client.get_user()方法没有匹配到目标用户,返回了None,对空值调用方法就会触发该错误。 - 导致
get_user返回空的常见原因有三个:- 方法要求传入整数类型的用户ID,如果传入的是带引号的字符串格式ID,会直接匹配失败
get_user从机器人本地缓存拉取数据,如果机器人启动后还没缓存到目标用户信息,也会返回空- discord.py v2.0及以上版本默认关闭成员相关权限,没有开启对应意图的情况下无法正常获取用户数据
修复方案
- 先进入Discord开发者后台,在你的机器人应用的「Bot」设置页,开启「Server Members Intent」权限
- 按照下方示例修正代码,补充意图声明、空值判断、缓存 fallback 逻辑:
import discord import os # 显式声明需要的权限意图 intents = discord.Intents.default() intents.members = True intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_message(message): # 跳过机器人自身发送的消息,避免循环触发 if message.author == client.user: return # 替换为目标用户的整数ID,不要加引号包裹 target_user_id = 替换为midway的实际数字ID midway = client.get_user(target_user_id) # 本地缓存无数据时,从线上拉取用户信息 if not midway: try: midway = await client.fetch_user(target_user_id) except discord.NotFound: # 找不到用户直接结束逻辑,避免报错 return if midway.mentioned_in(message): await message.channel.send('你的预设消息内容') client.run(os.environ['environ'])
额外注意事项
- 机器人必须和目标midway账号在同一个服务器内,否则无法正常拉取用户信息
- 需要给机器人开放对应频道的发消息权限,否则触发回复时会抛出权限错误
内容的提问来源于stack exchange,提问作者DeductiveFan01
相关产品推荐
相关产品推荐

