如何将fetch_members()返回的ThreadMember转为可用成员列表?
解决Discord线程成员列表获取问题
一、thread.members返回空的原因
先翻译官方文档说明:
此线程中的线程成员列表。
这需要正确配置
Intents.members。但大多数情况下,网关不会主动提供这些数据,因此必须调用fetch_members()方法来主动拉取。
简单来说:即便开启了成员意图,Discord网关也不会自动推送线程成员数据,必须手动调用fetch_members()才能获取到。
二、将fetch_members()返回的ThreadMember对象转为可用成员列表
fetch_members()返回的是ThreadMember对象集合,你可以根据需求提取关键信息,以下是几种常用处理方式:
1. 提取用户ID与加入时间的结构化列表
thread_members = await message.channel.fetch_members() # 转换为包含用户ID和加入时间的字典列表 formatted_members = [ { "用户ID": member.id, "加入线程时间": member.joined_at.strftime("%Y-%m-%d %H:%M:%S UTC") } for member in thread_members ] await channel.send(str(formatted_members))
2. 获取完整用户信息(需开启成员意图)
如果机器人已经开启Intents.members,可以通过用户ID获取完整的Member对象,拿到用户名、昵称等信息:
thread_members = await message.channel.fetch_members() full_member_info = [] for member in thread_members: user = message.guild.get_member(member.id) if user: full_member_info.append({ "用户名": user.name, "显示昵称": user.display_name, "用户ID": user.id, "加入线程时间": member.joined_at.strftime("%Y-%m-%d %H:%M:%S UTC") }) await channel.send(str(full_member_info))
3. 生成可直接@成员的消息内容
如果需要在消息中提及线程成员,可生成提及字符串列表:
thread_members = await message.channel.fetch_members() mention_strings = [f"<@{member.id}>" for member in thread_members] await channel.send(f"线程成员列表:{' '.join(mention_strings)}")
关键注意事项
- 务必开启
Intents.members:在Discord开发者门户的Bot设置中勾选「Server Members Intent」,同时在代码中启用:
intents = discord.Intents.default() intents.members = True client = discord.Client(intents=intents)
- 机器人需具备对应权限:比如查看频道、读取成员信息的权限,否则
fetch_members()可能无法正常返回数据。
内容的提问来源于stack exchange,提问作者Abraya
相关产品推荐
相关产品推荐

