咨询:在网站展示Discord在线用户及频道的实现方案
Discord频道与活跃用户展示实现方案(.NET Core 8)
核心思路
Discord没有官方提供类似tsviewer的直接嵌入组件,需通过Discord Bot API结合自定义后端接口实现:用Bot获取服务器(Guild)的频道列表和在线用户数据,再通过.NET Core API将数据暴露给前端展示。
具体步骤
1. 创建并配置Discord Bot
- 登录Discord开发者平台,创建新应用并添加Bot账户
- 为Bot分配必要权限:
View Channels(查看频道)、Guild Members(获取服务器成员)、Guild Presences(获取用户状态) - 生成并保存Bot令牌(Token),记录你的Discord服务器ID(GuildId)
2. .NET Core后端集成Discord.NET库
- 安装NuGet包:
Discord.Net - 在Program.cs中配置Bot服务:
using Discord; using Discord.WebSocket; var builder = WebApplication.CreateBuilder(args); // 配置Discord客户端网关意图 var discordConfig = new DiscordSocketConfig { GatewayIntents = GatewayIntents.Guilds | GatewayIntents.GuildMembers | GatewayIntents.GuildPresences }; var discordClient = new DiscordSocketClient(discordConfig); // 登录并启动Bot await discordClient.LoginAsync(TokenType.Bot, builder.Configuration["Discord:BotToken"]); await discordClient.StartAsync(); // 将客户端注册为单例服务 builder.Services.AddSingleton(discordClient); var app = builder.Build(); // 其他Web应用配置... app.Run();
3. 创建API端点暴露数据
- 编写控制器提供频道和在线用户接口:
[ApiController] [Route("api/discord")] public class DiscordController : ControllerBase { private readonly DiscordSocketClient _discordClient; private readonly ulong _targetGuildId; public DiscordController(DiscordSocketClient discordClient, IConfiguration config) { _discordClient = discordClient; _targetGuildId = ulong.Parse(config["Discord:GuildId"]); } [HttpGet("channels")] public IActionResult GetChannelList() { var guild = _discordClient.GetGuild(_targetGuildId); if (guild == null) return NotFound("目标服务器未找到"); var channelData = guild.Channels .Where(c => c.Type != ChannelType.Category) // 排除分类频道,可按需调整 .Select(c => new { c.Id, c.Name, ChannelType = c.Type.ToString(), OnlineUserCount = c.Users.Count(u => u.Status != UserStatus.Offline) }) .ToList(); return Ok(channelData); } [HttpGet("online-users")] public IActionResult GetOnlineUsers() { var guild = _discordClient.GetGuild(_targetGuildId); if (guild == null) return NotFound("目标服务器未找到"); var userData = guild.Users .Where(u => u.Status != UserStatus.Offline && !u.IsBot) .Select(u => new { u.Id, u.Username, u.AvatarUrl, Status = u.Status.ToString() }) .ToList(); return Ok(userData); } }
4. 前端展示实现
- 调用后端API获取数据,用HTML/CSS/JavaScript渲染频道列表(显示名称、在线人数)和在线用户列表(显示头像、用户名、状态)
- 可设置定时刷新(如每30秒)保持数据实时性
注意事项
- 权限控制:给API端点添加访问限制,比如IP白名单或API密钥验证,避免数据泄露
- 限流处理:Discord API有限流规则,可缓存频道和用户数据,减少请求频率
- 意图启用:需在Discord开发者平台的Bot设置中手动开启
Guild Members和Guild Presences意图,否则无法获取用户状态数据
内容的提问来源于stack exchange,提问作者JaggenSWE
相关产品推荐
相关产品推荐

