如何在discord.py的Embed中获取并展示在线成员列表?
在discord.py的Embed中展示所有在线成员列表
你的代码问题在于每次遍历到在线成员时都会创建新的Embed并发送,所以每个成员对应一条独立消息,每个Embed只显示一个成员。要实现单个Embed展示所有在线成员,需要先收集所有在线成员数据,再统一构建Embed后发送。
修正后的代码
import discord from discord.ext import tasks # 务必开启成员意图,否则无法获取完整成员列表 intents = discord.Intents.default() intents.members = True client = discord.Client(intents=intents) @tasks.loop(seconds=60) async def sendmessage(): channel = client.get_channel(channel_id) # 替换为你的频道ID # 初始化一个Embed容器 embed = discord.Embed(title="谁在线?", description="当前所有服务器的在线成员统计", color=0x00ff00) for guild in client.guilds: # 筛选当前服务器的在线成员(排除离线状态) online_members = [member.name for member in guild.members if member.status != discord.Status.offline] # 格式化成员列表:用换行分隔每个成员 if online_members: member_list = "\n".join(online_members) else: member_list = "暂无在线成员" # 为每个服务器添加一个字段,展示在线成员 embed.add_field(name=f"服务器:{guild.name}", value=member_list, inline=False) # 一次性发送包含所有数据的Embed await channel.send(embed=embed) # 启动任务(示例) @client.event async def on_ready(): print(f"已登录为 {client.user}") sendmessage.start() client.run("你的Bot令牌")
关键说明
- 成员权限配置:必须开启
Intents.members意图,否则discord.py无法获取服务器成员列表。同时需要在Discord开发者后台的Bot设置中,开启"Server Members Intent"权限。 - 数据收集逻辑:先遍历每个服务器,收集该服务器下所有在线成员的名称,再将这些名称拼接成字符串,添加到Embed的字段中。
- 单次发送Embed:所有服务器的在线成员数据都添加到同一个Embed后,只调用一次
await channel.send(embed=embed),确保只发送一条消息展示全部内容。
内容的提问来源于stack exchange,提问作者yassin
相关产品推荐
相关产品推荐

