如何将旧版discord.py语音频道成员列表代码迁移至新版本?
嗨,我之前也帮朋友处理过discord.py升级后的命令适配问题,v2.x的API变化确实挺多的,尤其是成员和频道相关的接口,给你整理好能直接用的解决方案:
适配discord.py v2.x的语音频道成员考勤命令方案
先搞懂核心API变化
- 旧版的
ch.voice_members已经被移除,现在改用ch.members来获取语音频道内的所有成员 - 查找指定频道的方式推荐用
discord.utils.get(),比手动遍历更简洁高效 - 必须开启成员意图和消息内容意图,否则bot无法获取成员列表和接收命令
完整可运行的命令代码
import discord from discord.ext import commands # 配置bot需要的意图,这步很关键! intents = discord.Intents.default() intents.members = True # 开启成员意图,才能获取频道成员信息 intents.message_content = True # 开启消息内容意图,才能接收用户的命令 bot = commands.Bot(command_prefix='!', intents=intents) @bot.command(name='attendance') async def check_attendance(ctx, target_channel: str): # 按名称查找目标语音频道 voice_channel = discord.utils.get(ctx.guild.voice_channels, name=target_channel) if not voice_channel: await ctx.send(f"找不到名为`{target_channel}`的语音频道哦!") return # 遍历频道成员,筛选带有guest标签的用户 guest_members = [] for member in voice_channel.members: # 这里假设"guest"是角色名称,根据你的实际情况调整判断逻辑 if any(role.name.lower() == 'guest' for role in member.roles): guest_members.append(member.display_name) # 格式化输出结果 if guest_members: member_list = "\n- ".join(guest_members) await ctx.send(f"📋 语音频道`{target_channel}`中的Guest成员列表:\n- {member_list}") else: await ctx.send(f"😯 语音频道`{target_channel}`里没有找到带有Guest标签的成员!") # 替换成你的机器人Token bot.run('YOUR_BOT_TOKEN_HERE')
重要注意事项
- 一定要去Discord开发者门户的机器人设置里,开启Privileged Gateway Intents下的
Server Members Intent和Message Content Intent,否则代码会失效 - 如果你的"guest"标签不是角色名称(比如是自定义状态或其他标识),只需要修改
if any(...)里的判断条件就行 voice_channel.members返回的是完整的成员对象,你可以根据需求获取member.name(用户名)、member.id(用户ID)等其他属性
内容的提问来源于stack exchange,提问作者Taerpe
相关产品推荐
相关产品推荐

