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

如何实现DiscordBot在特定用户加入语音频道时播放指定音频?

实现特定用户加入语音频道时播放自定义音频

嘿,这个需求其实挺常见的,我来一步步帮你搞定!咱们用discord.py来实现,这是目前最流行的Discord Bot开发库,核心思路就是监听用户的语音状态变化事件,然后匹配用户ID,最后播放对应音频。

第一步:准备工作

首先得搞定依赖和权限配置:

  • 安装带语音支持的discord.py:pip install discord.py[voice]
  • 确保你的系统安装了FFmpeg(播放音频的必备工具):
    • Windows:下载FFmpeg后把它的bin目录加到系统环境变量里
    • Linux:用sudo apt install ffmpeg安装
    • macOS:用brew install ffmpeg安装
  • 去Discord开发者门户,给你的Bot启用服务器成员意图和语音状态意图,不然Bot没法获取用户的语音状态变化和成员信息。

第二步:核心代码实现

下面是完整的示例代码,我会在后面拆解关键部分:

import discord
import asyncio
from discord.ext import commands
from discord import VoiceClient

# 替换成你的Bot令牌
BOT_TOKEN = "你的Bot令牌"
# 定义用户ID和对应音频文件的映射表
USER_AUDIO_PAIRS = {
    "19923Example": "Hello.mp3",  # 你的ID和对应音频
    "Bob的用户ID": "John.mp3"       # Bob的ID和对应音频
}

# 设置Bot的意图,必须开启成员和语音状态意图
intents = discord.Intents.default()
intents.members = True
intents.voice_states = True

# 初始化Bot
bot = commands.Bot(command_prefix="!", intents=intents)

# Bot启动成功的提示
@bot.event
async def on_ready():
    print(f"✅ Bot已登录,当前账号:{bot.user.name}")

# 监听用户语音状态变化事件
@bot.event
async def on_voice_state_update(member, before, after):
    # 判断用户是不是刚加入一个语音频道(之前不在任何频道,现在进入了某个频道)
    if before.channel is None and after.channel is not None:
        # 获取用户ID并转成字符串,方便和映射表匹配
        user_id = str(member.id)
        
        # 检查当前用户是否在我们的自定义列表里
        if user_id in USER_AUDIO_PAIRS:
            target_audio = USER_AUDIO_PAIRS[user_id]
            voice_client = None
            
            try:
                # 连接到用户加入的语音频道
                voice_client = await after.channel.connect()
                # 加载并播放音频文件
                voice_client.play(discord.FFmpegPCMAudio(target_audio))
                
                # 等待音频播放完成后自动断开连接
                while voice_client.is_playing():
                    await asyncio.sleep(1)
                await voice_client.disconnect()
            
            except discord.ClientException:
                # 如果Bot已经在这个频道里了,直接播放音频,不用重复连接
                voice_client = member.guild.voice_client
                if voice_client and not voice_client.is_playing():
                    voice_client.play(discord.FFmpegPCMAudio(target_audio))
            except Exception as e:
                print(f"❌ 播放音频时出错:{str(e)}")

# 启动Bot
bot.run(BOT_TOKEN)

关键部分解释

  1. 监听语音状态事件:on_voice_state_update是discord.py提供的事件,会在用户的语音状态(比如加入/离开频道、静音/取消静音)变化时触发。我们通过对比before.channel(变化前的频道)和after.channel(变化后的频道),精准判断用户是刚加入频道。
  2. 判断用户ID:member.id是用户的唯一数字ID,转成字符串后和USER_AUDIO_PAIRS里的预设ID匹配,就能找到对应的音频文件。
  3. 连接频道与播放音频:用await after.channel.connect()连接到用户所在的频道,通过FFmpegPCMAudio加载音频文件,再用voice_client.play()播放。播放完成后自动断开连接,避免Bot一直占用语音频道。
  4. 异常处理:如果Bot已经在目标频道里,就直接播放音频不用重复连接;其他错误(比如音频文件不存在)会打印错误信息,方便排查问题。

注意事项

  • 音频文件要和Bot脚本放在同一个目录,或者你可以写完整的文件路径(比如C:/audio/Hello.mp3)。
  • 确保Bot在服务器里有连接语音频道和说话的权限。
  • 用户ID必须是Discord用户的真实数字ID,你可以在Discord里开启开发者模式后,右键用户复制ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:34:12