Discord.py调用client.get_user返回None故障排查问询
Discord机器人get_user返回None问题排查与解决方法
1. 修复Bot初始化逻辑错误
你代码中两次对client赋值,第二次创建commands.Bot实例时没有传入你配置好的intents参数,导致你在开发者门户开启的Server Members Intent并未实际生效,这是核心问题之一。正确初始化代码如下:
import discord from discord.ext import commands intents = discord.Intents.default() intents.members = True # 直接给commands.Bot传入配置好的intents,无需重复创建discord.Client实例 client = commands.Bot(command_prefix = "e.", intents=intents)
2. 修正用户参数解析逻辑
当前你命令定义的参数user_id接收的是@用户提及格式的字符串(类似<@!123456789>),不是纯数字ID,而get_user仅支持传入整数类型的纯用户ID,因此会返回None,可选择以下任意一种方案修正:
- 方案一:使用discord.py自带的类型转换器,自动解析提及/ID为用户对象,无需手动调用获取接口:
@client.command() async def duel(ctx, user: discord.User): # 直接拿到解析完成的用户对象 print(user.id) print(user.name)
- 方案二:手动解析提及格式的ID,同时兼容缓存缺失场景:
@client.command() async def duel(ctx, user_id): # 提取提及字符串中的纯数字ID if user_id.startswith("<@") and user_id.endswith(">"): user_id = user_id.strip("<@!>") # 转换为int类型,get_user/fetch_user仅支持整数ID user_id = int(user_id) # 优先从本地缓存取用户,缓存缺失时调用API拉取,避免返回None user = client.get_user(user_id) or await client.fetch_user(user_id) print(user)
3. 确认配置生效
- 重启机器人进程,确保开发者门户开启的Intent配置生效
- 若你的机器人已加入超过100个服务器,需要先向Discord申请Intent权限验证,才能正常使用成员相关接口
额外注意
client.run()的参数需要替换为你自己的Bot Token,不要将明文Token提交到公开代码仓库。
内容的提问来源于stack exchange,提问作者mahdude17
相关产品推荐
相关产品推荐

