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

Discord.py 如何实现成员加入Support-Room语音频道时发送私信通知

原有代码问题定位
  • 事件注册方式错误:on_member_join是discord.py内置的「新成员加入服务器」事件,不能通过@bot.command()当作指令注册,所有框架内置事件必须通过@bot.event装饰器挂载才能正常触发
  • 事件类型不匹配:原代码使用的on_member_join事件仅监听用户加入服务器的行为,完全不覆盖语音频道进出的场景,对应适配语音频道监听的正确内置事件是on_voice_state_update
  • 触发逻辑缺失:原代码仅遍历查找名为Support-Room的频道,没有校验触发行为对应的用户是否真的进入了该频道,实际运行时没有有效触发点
  • 业务逻辑不全:完全没有对接你已有的JSON值班信息存储逻辑,无法实现“告知用户在岗Support人数”的核心需求
可落地实现代码

首先需要提前在Discord开发者后台的Bot配置页,开启Server Members Intent和Voice States Intent两项权限,否则无法获取语音频道的状态更新数据。

import json
import discord
from discord.ext import commands

# 初始化Bot时加载所需权限意图
intents = discord.Intents.default()
intents.voice_states = True
intents.members = True
bot = commands.Bot(command_prefix="!", intents=intents)

# 对接现有JSON值班数据的读取函数,可根据实际JSON存储结构调整取值逻辑
def count_on_duty_support():
    try:
        with open("support_duty.json", "r", encoding="utf-8") as f:
            duty_data = json.load(f)
        # 示例逻辑:若JSON存储的是在岗SupportID构成的列表,直接返回列表长度
        return len(duty_data.get("on_duty_list", []))
    except Exception:
        return 0

# 语音状态更新事件监听
@bot.event
async def on_voice_state_update(member, before, after):
    # 跳过Bot自身的语音状态变化,避免无效触发
    if member.bot:
        return
    
    # 在当前服务器内查找目标Support-Room语音频道
    target_channel = discord.utils.get(member.guild.voice_channels, name="Support-Room")
    if not target_channel:
        return
    
    # 触发条件:用户从其他位置进入了Support-Room频道(排除用户在同频道内静音、调整状态等操作的误触发)
    if after.channel == target_channel and before.channel != target_channel:
        on_duty_count = count_on_duty_support()
        notice_content = f"您好,您已接入客服支援频道。当前在岗值班的支援人员共{on_duty_count}位,请您在频道内稍作等待,值班人员会尽快前来为您提供协助。"
        # 尝试发送私信,做权限异常兜底
        try:
            await member.send(notice_content)
        except discord.Forbidden:
            # 用户关闭私信权限时,在当前频道内@用户发送提示,10秒后自动删除减少频道噪音
            await target_channel.send(f"{member.mention} {notice_content}", delete_after=10)
调试注意事项
  • 若事件无触发,优先检查开发者后台的两个意图权限是否开启,同时确保Bot已经获得对应服务器的管理员角色或频道查看、发送私信的权限
  • JSON读取逻辑需要和你之前写的值班上报功能的存储结构完全对齐,避免出现人数计算错误

内容的提问来源于stack exchange,提问作者LordLazor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 19:36:04