You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将旧版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:03:19