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属性。
代码修改示例
- 首先获取你当前操作的服务器实例,可通过服务器ID直接获取,也可以从指令上下文(比如
ctx.guild)中取:
# 替换下方的xxx为实际的服务器ID guild = client.get_guild(xxx)
- 修改原有循环内的逻辑,同时增加空值判断避免成员不存在导致报错:
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
相关产品推荐
相关产品推荐

