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

如何在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令牌")

关键说明

  1. 成员权限配置:必须开启Intents.members意图,否则discord.py无法获取服务器成员列表。同时需要在Discord开发者后台的Bot设置中,开启"Server Members Intent"权限。
  2. 数据收集逻辑:先遍历每个服务器,收集该服务器下所有在线成员的名称,再将这些名称拼接成字符串,添加到Embed的字段中。
  3. 单次发送Embed:所有服务器的在线成员数据都添加到同一个Embed后,只调用一次await channel.send(embed=embed),确保只发送一条消息展示全部内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:20:40