discord.py中guild.members仅返回机器人自身无法获取全部服务器成员如何解决
问题原因
Discord API v8及更高版本引入了特权网关意图限制,读取服务器成员列表所需的Server Members Intent属于特权权限,默认处于关闭状态;同时你的代码初始化客户端时未显式声明启用成员相关意图,因此接口仅能返回机器人自身的成员信息。另外你代码中继承的discord.client拼写错误,正确类名首字母需大写为discord.Client,否则会直接触发类不存在的报错。
修复步骤
- 第一步:开启开发者后台特权权限
打开Discord开发者平台,进入你当前机器人对应的应用设置页,切换到「Bot」选项卡,下拉找到「Privileged Gateway Intents」区域,打开Server Members Intent的开关即可。如果你的机器人需要读取用户发送的消息内容,也可以同步开启Message Content Intent开关。 - 第二步:修改代码显式声明启用意图
初始化客户端前先构造意图对象,开启成员读取权限,初始化时将意图对象传入客户端,修改后的完整代码示例如下:
import discord # 构造意图对象,默认启用基础通用意图 intents = discord.Intents.default() # 显式开启成员读取权限 intents.members = True # 若需要读取消息内容可以额外加以下配置 # intents.message_content = True class MyClient(discord.Client): async def on_ready(self): print("The bot is ready!") # 此处测试打印已加入服务器的全部成员 for guild in self.guilds: print(f"服务器 {guild.name} 成员列表:") for member in guild.members: print(member.name) async def on_message(self, message): if message.content.startswith("<你的命令名称>"): # 你的命令逻辑 pass if message.content.startswith("<你的命令名称>"): # 你的命令逻辑 pass async def <事件名>(self, <参数>): # 你的事件逻辑 pass # 初始化时传入意图对象 client = MyClient(intents=intents) client.run("<你的机器人token>")
内容的提问来源于stack exchange,提问作者Hobbes
相关产品推荐
相关产品推荐

