Discord.py bot各服务器成员计数仅显示1的问题排查
问题诊断
计数固定显示为1由两处核心错误导致:
- 计数逻辑完全无效:代码中写的
len([discord.client.Guild.members])是把Guild类的成员属性描述符本身放进了一个单元素列表,这个列表的长度永远是1,和真实服务器的成员数据没有任何关联。 - 状态初始化时机错误:你在创建Bot实例的时候就硬编码了Activity内容,这个阶段机器人还没完成和Discord网关的连接,根本拉取不到任何服务器、成员的实时数据,就算计数逻辑写对,这里拿到的也是错误的静态值,后续成员数量变动时也不会自动更新。
修复代码
等机器人触发on_ready就绪事件、完成服务器数据拉取后再设置presence,同时可以绑定成员加入/离开事件实现计数自动更新:
import discord from discord.ext import commands intents = discord.Intents.default() intents.members = True intents.presences = True # 初始化时不传入固定activity,等就绪后动态设置 bot = commands.Bot(command_prefix="!", intents=intents, status=discord.Status.do_not_disturb) @bot.event async def on_ready(): # 多服务器场景替换为目标服务器ID:target_guild = bot.get_guild(你的服务器ID) target_guild = bot.guilds[0] # 确保完整拉取服务器成员列表,避免缓存不全导致计数错误 await target_guild.chunk() activity = discord.Activity( type=discord.ActivityType.watching, name=f"{target_guild.member_count} users" ) await bot.change_presence(activity=activity) # 成员加入时自动更新计数 @bot.event async def on_member_join(member): activity = discord.Activity( type=discord.ActivityType.watching, name=f"{member.guild.member_count} users" ) await bot.change_presence(activity=activity) # 成员离开时自动更新计数 @bot.event async def on_member_remove(member): activity = discord.Activity( type=discord.ActivityType.watching, name=f"{member.guild.member_count} users" ) await bot.change_presence(activity=activity) bot.run("你的机器人Token")
注意:如果你的机器人加入了多个服务器,不要直接使用
bot.guilds[0]取值,提前获取目标服务器的ID通过bot.get_guild()方法指定服务器,避免统计到其他服务器的人数。
内容的提问来源于stack exchange,提问作者asuee
相关产品推荐
相关产品推荐

