如何实现用户加入指定Discord语音频道时自动为其分配对应角色
代码存在的问题
- 事件参数错误:
on_voice_state_update事件的标准传参为(member, before, after)三个,你缺少了触发事件的成员对象参数 - 语法过时:discord.py v1.0 及以上版本已弃用
server属性,统一改为guild;语音频道属性也已简化为before.channel/after.channel,无需通过.voice.voice_channel层级调用 - 缺少意图配置:当前 Discord API 要求显式声明使用的意图,语音状态更新、修改成员角色都需要配置对应
intents,同时需要在 Discord 开发者门户的机器人设置页开启「服务器成员意图」「语音状态意图」两个特权意图 - 角色修改方法调用错误:
add_roles/remove_roles是成员对象的实例方法,不能通过client直接调用 - 缺少指定语音频道判断逻辑:现有代码只要用户加入任意语音频道就会分配角色,不符合「加入指定语音频道才触发」的需求
- 打印语句格式错误:
on_ready中的打印字符串没有占位符{},format调用无效
修正后的可运行代码
import discord # 配置项,替换为你自己的对应ID TARGET_VOICE_CHANNEL_ID = 123456789012345678 # 要监听的指定语音频道ID TARGET_ROLE_ID = 987654321098765432 # 要分配的角色ID BOT_TOKEN = "你的机器人Token" # 声明需要的意图 intents = discord.Intents.default() intents.voice_states = True intents.members = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f'Hello! 已登录为 {client.user.name}') @client.event async def on_voice_state_update(member, before, after): # 获取目标角色 target_role = member.guild.get_role(TARGET_ROLE_ID) if not target_role: return # 加入指定语音频道时添加角色 if after.channel and after.channel.id == TARGET_VOICE_CHANNEL_ID: if target_role not in member.roles: await member.add_roles(target_role) # 离开指定语音频道时移除角色 elif before.channel and before.channel.id == TARGET_VOICE_CHANNEL_ID: if target_role in member.roles: await member.remove_roles(target_role) client.run(BOT_TOKEN)
额外注意事项
- 需要先开启 Discord 客户端的开发者模式,右键对应频道/角色即可复制ID,所有ID均为整数类型
- 机器人自身的角色位置需要高于要分配的目标角色,且拥有「管理角色」权限,否则会触发权限报错
内容的提问来源于stack exchange,提问作者Acu
相关产品推荐
相关产品推荐

