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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:12:41