如何用discord.py区分普通用户与机器人并实现服务器统计命令
解决discord.py区分机器人与普通用户并创建统计频道的方案
核心逻辑:区分机器人与普通用户
discord.py的Member对象自带bot属性,可直接判断成员是否为机器人。注意不要用client.users统计——它是机器人能看到的所有平台用户,而非当前服务器的成员,应使用interaction.guild获取目标服务器的成员数据。
完整实现代码
@client.tree.command(name='stats', description='set up stats for the server (for sheepie or airone only)') async def stats(interaction: discord.Interaction): # 权限校验:仅允许指定用户执行 allowed_user_names = ["SheepieGamer20", "Airone"] if interaction.user.name not in allowed_user_names: await interaction.response.send_message("无权限使用该命令!", ephemeral=True) return guild = interaction.guild if not guild: await interaction.response.send_message("该命令仅支持服务器内使用!", ephemeral=True) return # 统计数据 total_members = guild.member_count bot_count = sum(1 for member in guild.members if member.bot) human_count = total_members - bot_count # 创建统计用语音频道(语音频道名称支持动态更新,适合展示实时数据) channel_configs = [ f"👥 普通成员: {human_count}", f"🤖 机器人: {bot_count}", f"📊 总人数: {total_members}" ] for channel_name in channel_configs: await guild.create_voice_channel(channel_name) await interaction.response.send_message("统计频道创建完成!", ephemeral=True)
关键细节说明
- 用
interaction.guild锁定当前执行命令的服务器,确保统计范围准确 - 遍历
guild.members,通过member.bot筛选机器人并计数 - 利用服务器自带的
member_count属性获取总人数,减去机器人数得到普通用户数 - 添加权限校验逻辑,符合你仅允许指定用户使用的需求
- 选择创建语音频道是因为文本频道名称无法动态修改,后续可通过定时任务更新语音频道名称实现数据实时同步
内容的提问来源于stack exchange,提问作者SheepieGamer20
相关产品推荐
相关产品推荐

