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

如何实现用户加入指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:48:00