如何修复Discord机器人获取用户ID时的NoneType错误并返回字符串ID
Discord机器人用户ID查询NoneType报错修复
常见错误根因
- 存在未定义变量:代码中尝试拆分的
ID没有实际赋值,实际应该拆分用户发送的指令内容message.content - 状态残留问题:
flist设置为全局变量,多次触发指令时会持续追加内容不重置,最终查询匹配的值完全错乱 - 缩进逻辑错误:获取用户ID的打印代码没有放入
?ID指令的判断分支内,未触发指令时也会执行空值查询、列表索引操作 - 空值无防护:
discord.utils.get查询不到匹配成员时会直接返回None,强行访问.id属性就会触发NoneType类型错误 - 权限配置缺失:没有开启成员读取的特权意图,接口无法返回全量成员列表,自然匹配不到目标用户
- 类型不匹配:
discord.Member.id为整数类型,没有做字符串转换就无法输出要求的字符串格式ID
修复后可运行代码
import discord import os # 初始化特权意图,需同步到Discord开发者平台开启Server Members Intent开关 intents = discord.Intents.default() intents.members = True client = discord.Client(intents=intents) @client.event async def on_message(message): # 忽略机器人自身发送的消息 if message.author == client.user: return if message.content.startswith('?ID'): # 初始化临时存储列表,避免历史内容残留 temp_match_list = [] # 拆分指令内容 command_parts = message.content.split() # 校验输入格式 if len(command_parts) < 2 or '#' not in command_parts[1]: print("请输入正确格式:?ID 用户名#4位专属后缀") return # 拆分用户名和4位Discriminator标识 for part in command_parts[1].split('#'): temp_match_list.append(part) print(temp_match_list) # 查询当前指令所在服务器的成员列表匹配目标用户 target_member = discord.utils.get( message.guild.members, name=temp_match_list[0], discriminator=temp_match_list[1] ) # 匹配不到时做防护,避免NoneType报错 if target_member is None: print("未找到匹配的用户") return # 将整数ID转为字符串类型输出 user_id_str = str(target_member.id) print(user_id_str) # 替换为你自己的机器人Token client.run(os.getenv("TOKEN"))
关键改动说明
- 替换未定义的
ID变量为实际的消息内容message.content,确保拆分的是用户真实输入的指令 - 将存储匹配参数的列表改为函数内的临时变量,每次触发指令时重新初始化,彻底避免历史查询内容残留
- 对齐所有查询、打印逻辑的缩进,全部移入
?ID指令的判断分支内,避免无关消息触发错误操作 - 增加空值判断逻辑:如果接口未返回匹配的成员,直接输出提示并退出逻辑,不强行访问不存在的属性
- 补充intents配置:开启成员读取权限,需同步在Discord开发者平台的机器人配置页打开Server Members Intent特权开关,否则接口无法返回完整成员列表
- 用当前服务器的成员列表
message.guild.members替代跨服务器遍历的client.get_all_members(),提升查询效率和准确性 - 用
str()方法将整数格式的用户ID转为字符串,满足字符串类型ID的输出要求 - 增加输入格式校验,避免用户输入不完整指令时触发列表索引越界错误
内容的提问来源于stack exchange,提问作者Hassan Dia
相关产品推荐
相关产品推荐

