C# 基于DSharp获取文本频道所有用户仅返回自身与机器人的问题
问题原因
channel.Users读取的是机器人本地缓存的用户数据,默认只会缓存和机器人有过交互、或者当前在线的少量用户,不会同步服务器全量成员。- Discord平台对机器人做了网关推送限制,未开启「服务器成员特权意图」的机器人,无法拉取到服务器全量成员列表,仅能获取到有限的缓存用户。
解决方案
步骤1:开启特权网关权限
登录Discord开发者后台,进入当前机器人的应用管理页,切换到「Bot」标签,下拉找到Privileged Gateway Intents区域,开启Server Members Intent选项。
步骤2:代码初始化时启用对应意图
以Discord.Net库为例,初始化机器人配置时需要显式声明启用成员相关的网关意图,示例代码:
var socketConfig = new DiscordSocketConfig { // 基础权限叠加成员访问权限 GatewayIntents = GatewayIntents.AllUnprivileged | GatewayIntents.GuildMembers }; var client = new DiscordSocketClient(socketConfig);
步骤3:调整业务代码使用全量拉取接口
不要直接读取本地缓存的Users属性,改用官方提供的异步拉取全量用户的接口,修正后的代码如下:
var channel = ctx.Guild.GetChannel(id); // 异步拉取当前频道内的全量用户数据 var users = await channel.GetUsersAsync().FlattenAsync(); foreach (var item in users) { Console.WriteLine(item); }
如果后续需要频繁读取成员数据,也可以先执行await ctx.Guild.DownloadUsersAsync();把当前服务器全量成员缓存到本地,之后再读取channel.Users也能获取到完整列表。
内容的提问来源于stack exchange,提问作者alije
相关产品推荐
相关产品推荐

