You need to enable JavaScript to run this app. 如何修复Discord机器人获取用户ID时的NoneType错误并返回字符串ID
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.11 10:15:11