通过频道ID获取文本频道所有用户仅返回本人和机器人如何解决
问题解决:Discord频道全量用户列表拉取
根因说明
Discord.NET 库中IChannel.Users属性默认读取本地缓存数据,仅包含已被客户端同步过的用户(通常是在线状态触发缓存、或和机器人有过交互的用户),不会主动拉取服务器全量成员,因此默认只能返回少量用户。
修复步骤
前置配置校验
- 前往Discord开发者平台的机器人管理页,开启
Server Members Intent网关意图,该开关是拉取全量成员的必要前提,仅配置频道/服务器权限无法生效 - 确认机器人在目标服务器持有
查看成员权限,且拥有目标文本频道的查看频道权限
代码修改
将原有逻辑调整为主动拉取全量成员后再读取,示例代码如下:
var channel = ctx.Guild.GetChannel(id); // 主动拉取服务器全量成员到本地缓存 await ctx.Guild.DownloadUsersAsync(); var users = channel.Users; foreach (var item in users) { Console.WriteLine(item); }
额外优化(可选)
如果需要严格筛选实际有权限访问该频道的用户,可以额外增加权限判断:
var validUsers = users.Where(u => channel.GetPermissionOverwrite(u).HasValue ? channel.GetPermissionOverwrite(u).Value.ViewChannel == PermValue.Allow : u.PermissionsIn(channel).ViewChannel);
内容的提问来源于stack exchange,提问作者viesel
相关产品推荐
相关产品推荐

