You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.py报错'User'对象无joined_at属性如何解决?

报错触发原因

discord.py 中将用户相关数据分为两类对象:

  • User:是Discord全平台通用的用户实体,仅存储所有服务器共享的用户属性,比如你之前正常调用的created_at(账号创建时间)就属于该对象的属性,可以通过client.get_user()直接获取。
  • Member:是用户在某一特定服务器内的实体,存储和当前服务器相关的专属属性,joined_at(用户加入当前服务器的时间)就属于Member对象独有的属性。

你代码里用client.get_user()获取到的是User对象,自然不存在joined_at属性,所以会抛出AttributeError异常。

修复方案

你需要先获取目标服务器的Guild对象,再通过Guild实例的方法获取对应服务器内的Member对象,即可调用joined_at属性。

代码修改示例

  1. 首先获取你当前操作的服务器实例,可通过服务器ID直接获取,也可以从指令上下文(比如ctx.guild)中取:
# 替换下方的xxx为实际的服务器ID
guild = client.get_guild(xxx)
  1. 修改原有循环内的逻辑,同时增加空值判断避免成员不存在导致报错:
if answers['member_older'] != None:
    guild = client.get_guild(替换为你的服务器ID)
    for x in id:
        # 从服务器缓存中获取Member对象
        account_memb = guild.get_member(x)
        # 缓存中找不到成员时,可调用异步接口拉取,注意要在async函数中使用await
        if not account_memb:
            try:
                account_memb = await guild.fetch_member(x)
            except:
                # 成员不在服务器内,直接移除出列表
                target_user = client.get_user(x)
                if target_user in users:
                    users.remove(target_user)
                continue
        joined = account_memb.joined_at
        new_date_memb = datetime.today() - joined
        member_old = new_date_memb.days
        if member_old < answers["member_older"]:
            users.pop(users.index(account_memb))
            print(users)

注意:使用成员相关接口需要你在Discord开发者后台的机器人设置页开启「Server Members Intent」,同时代码中初始化client时要开启对应的intent配置,否则无法正常获取Member对象。

内容的提问来源于stack exchange,提问作者Hiresh Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:09:02