discord.py如何提及服务器随机成员?代码及成员意图问题求助
解决discord.py中无法获取服务器所有成员的问题
问题原因
interaction.guild.members仅返回机器人自身,是因为discord.py v2.x版本后,即便开启了成员意图,默认也不会自动缓存服务器的所有成员——这个属性只返回已经被机器人缓存的成员。
解决步骤
1. 确认Discord开发者平台的意图设置
登录Discord开发者门户,进入你的机器人应用:
- 切换到「Bot」标签页
- 找到「Privileged Gateway Intents」区域,确保Server Members Intent(服务器成员意图)和Presence Intent(在线状态意图)都已开启
- 保存更改
2. 代码层面的修复
使用guild.fetch_members()从Discord API主动拉取服务器成员列表,而非依赖本地缓存。以下是完整的tinder命令示例:
import discord from discord import app_commands import random # 初始化意图 intents = discord.Intents.all() # 显式开启成员意图(intents.all()已包含,此处写出来更清晰) intents.members = True bot = discord.Client(intents=intents) tree = app_commands.CommandTree(bot) @tree.command(name="tinder", description="随机匹配并提及服务器成员") async def tinder_command(interaction: discord.Interaction): # 检查机器人是否有查看成员的权限 if not interaction.guild.me.guild_permissions.view_channel: await interaction.response.send_message("我没有查看服务器成员的权限,请先给我分配对应权限!", ephemeral=True) return # 拉取服务器所有成员,并过滤掉机器人 all_members = await interaction.guild.fetch_members(limit=None).flatten() human_members = [member for member in all_members if not member.bot] if not human_members: await interaction.response.send_message("服务器里没有非机器人成员哦!", ephemeral=True) return # 随机选择成员并提及 random_member = random.choice(human_members) await interaction.response.send_message(f"你的匹配对象:{random_member.mention}") @bot.event async def on_ready(): await tree.sync() print(f"机器人已登录:{bot.user.name}") bot.run("你的机器人令牌")
补充说明
fetch_members(limit=None)会拉取服务器所有成员,小服务器可直接使用;如果是超大服务器,建议按需设置limit或分页拉取,避免触发API限流。- 若希望依赖缓存获取成员,可在初始化客户端时添加
member_cache_flags参数,让机器人自动缓存更多成员,但这种方式在机器人刚启动时可能存在缓存不全的问题:bot = discord.Client(intents=intents, member_cache_flags=discord.MemberCacheFlags.all())
内容的提问来源于stack exchange,提问作者nevi
相关产品推荐
相关产品推荐

