如何开发当用户加入语音频道时自动@指定角色的Discord机器人
Discord 语音入渠自动@角色通知实现方案
前置配置
- 在Discord开发者后台给机器人开通所需权限:
发送消息、提及所有人/角色、查看频道,同时在Bot设置页开启所有网关意向,尤其是服务器成员意向、语音状态意向,否则无法捕获语音频道变动事件 - 提前准备三个核心配置值:需要@的服务器角色ID、通知消息要发送到的目标文本频道ID、机器人自身的运行Token
- 确保机器人在服务器内的角色权限等级高于需要@的目标角色,否则@只会显示为纯文本,无法真正触发提醒
核心实现逻辑(以主流的discord.py 2.0+ 适配环境为例)
- 核心触发事件为
on_voice_state_update,该事件会自动传回变动的成员对象、变动前的语音状态、变动后的语音状态三个参数 - 事件触发判断规则:
- 过滤所有机器人自身的语音状态变动,避免无效触发
- 对比变动前后的频道,仅当成员从无频道/其他频道进入新的语音频道时,才执行通知逻辑,避免成员换频道、离开频道时误发消息
- 按照预设格式组装消息:角色提及格式为
<@&角色ID>,用户提及格式为<@用户ID>,语音频道名用内联代码块包裹做视觉区分
注:示例格式里的
<code>为HTML标签语法,Discord消息系统不支持识别这类标签,实际要实现代码块高亮效果,直接用反引号包裹频道名称即可。
- 可直接运行的示例代码:
import discord from discord.ext import commands # 替换为你自己的配置值 TARGET_ROLE_ID = 123456789012345678 NOTIFY_CHANNEL_ID = 987654321098765432 BOT_TOKEN = "你的机器人运行Token" # 初始化意向配置 intents = discord.Intents.default() intents.voice_states = True intents.members = True bot = commands.Bot(command_prefix="!", intents=intents) @bot.event async def on_voice_state_update(member: discord.Member, before: discord.VoiceState, after: discord.VoiceState): # 跳过机器人触发的变动 if member.bot: return # 判断是否为新加入语音频道 if before.channel != after.channel and after.channel is not None: # 获取目标通知频道 notify_channel = bot.get_channel(NOTIFY_CHANNEL_ID) if not notify_channel: return # 组装为要求格式的消息 notify_content = f"<@&{TARGET_ROLE_ID}> {member.mention} 已加入 `{after.channel.name}` 语音频道。" await notify_channel.send(notify_content) bot.run(BOT_TOKEN)
常见避坑
- 不要直接向语音频道发送消息,Discord的语音频道不支持接收文本消息,必须指定对应的关联文本频道作为通知接收端
- 可增加简易防抖逻辑:对同一用户15秒内进出同一频道的重复触发做拦截,避免频繁切频道导致的消息刷屏
- 如果需要区分不同语音频道的通知规则,可以在判断逻辑里匹配
after.channel.id,给不同频道配置不同的@角色、不同的通知文案
内容的提问来源于stack exchange,提问作者InNovAqua
相关产品推荐
相关产品推荐

