You need to enable JavaScript to run this app. 如何开发当用户加入语音频道时自动@指定角色的Discord机器人
优惠活动
大模型
产品
解决方案
定价
更多

如何开发当用户加入语音频道时自动@指定角色的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 01:45:03