公会成员不再填充,不能 GetUserAsync 因为它只返回机器人而没有其他人

Posted

技术标签:

【中文标题】公会成员不再填充,不能 GetUserAsync 因为它只返回机器人而没有其他人【英文标题】:Guild members are not populated anymore, cannot GetUserAsync as it only returns the bot and no one else 【发布时间】:2021-02-10 09:58:09 【问题描述】:

由于某种原因,我无法再从机器人所在的公会中获得任何成员。

为了确保我有用户,我用

构建它
        DiscordSocketConfig config = new DiscordSocketConfig  AlwaysDownloadUsers = true ;
        client = new DiscordSocketClient(config);

我响应的事件是在它连接很久之后。它会从机器人所在行会的频道中获取消息,因此它已连接、工作并且可以看到所有成员。

我浏览了所有成员,并尝试使用一些调试代码将它们打印出来:

        Console.WriteLine("Users:");
        foreach (IGuildUser? u in Guild.GetUsersAsync().Result)
            Console.WriteLine($"    u.Username (u.Id)");

它只打印自己。

我在代码中使用它的方式是:

Guild.GetUserAsync(user.Id)  // user is valid, this is empty for anyone who is not the bot

公会对象上的私有字段 _members 有 1 个元素(它本身就是机器人),但所有其他东西(例如:_emojis_channels、任何其他缓存的东西)都已完全填充.该机器人也可以与所有用户在频道中交谈并在频道中接收消息,所以我不知道为什么它无法获得所有成员。

最让我困惑的是,这一切都在工作,然后神奇地在一夜之间停止工作。公会已经有100多名成员了,所以我不明白为什么现在突然失败了。

最重要的是,机器人拥有我拥有的所有角色,所以它不可能神奇地看不到成员。我可以排除机器人的任何视觉问题。

有什么办法可以调试这个吗?我错过了什么吗?如何让公会的所有成员重新工作?

【问题讨论】:

【参考方案1】:

这是 Discord 强制执行 intents 的结果。

Intent 允许您选择加入某些网关事件。目前,GUILD_MEMBERS 和 GUILD_PRESENCES 意图是“特权意图”,具有以下效果:

GUILD_MEMBER_[ADD|UPDATE|REMOVE] 需要接收 GUILD_MEMBERS 意图 PRESENCE_UPDATE 要求接收 GUILD_PRESENCES 意图 REQUEST_GUILD_MEMBERS 需要 GUILD_PRESENCES Intent 才能设置 Presences=true 需要 GUILD_MEMBERS 意图来请求整个列表(query='',limit=0 仅限于请求 1 个 guild_id 使用前缀时限制为 100 个成员 (query='prefix', limit=1 GUILD_CREATE 需要 GUILD_PRESENCES 意图来包含不仅仅是机器人和语音成员 列出公会成员需要 GUILD_MEMBERS 意图才能访问

默认情况下禁用特权意图。要启用它们:

访问https://discord.com/developers/applications 点击您希望启用特权意图的机器人 导航到左侧的“Bot”标签 滚动到特权网关意图部分 启用您想要的意图

如果您的机器人在超过 100 个公会中,您需要验证您的机器人:https://dis.gd/bot-verification。如果您的机器人已经过验证,但需要请求意图许可,请联系 Discord 支持:https://dis.gd/contact。

【讨论】:

以上是关于公会成员不再填充,不能 GetUserAsync 因为它只返回机器人而没有其他人的主要内容,如果未能解决你的问题,请参考以下文章

如何获取大型公会 discord.js 的所有成员

Discord.js 如何感知公会成员何时更改活动

如何获取公会 Discord.js 中的成员列表

无法通过 Discordjs v13 获取所有公会成员

成员加入公会时如何添加角色

Discord Py - 如何使用文本命令向公会的所有成员添加多个角色