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

能否通过用户Discord ID让discord.py机器人接入语音频道播放音频

问题解决说明

现有代码问题修复

你贴出的代码存在以下可直接导致运行错误的问题:

  • 重复调用连接方法:第2行已经执行await channel.connect()完成频道加入,第6行的channel.connect()既没有加await异步等待,也属于重复调用,会直接抛出连接冲突异常,这行代码直接删除即可
  • 缺少前置校验逻辑:如果当前触发命令的用户未加入任何语音频道,ctx.message.author.voice会返回None,调用.channel属性会直接抛出AttributeError,需要先做合法性判断
  • 依赖校验:FFmpegPCMAudio依赖本地安装的FFmpeg工具,需要确保运行环境已安装FFmpeg并配置到系统环境变量中,否则会抛出找不到可执行文件的错误

修正后的基础可用代码如下:

# 先校验用户是否在语音频道
if not ctx.author.voice:
    await ctx.send("你当前未加入任何语音频道")
    return
channel = ctx.author.voice.channel
# 校验机器人是否已经在该频道
if ctx.voice_client:
    await ctx.voice_client.move_to(channel)
else:
    voice = await channel.connect()
source = FFmpegPCMAudio('source.wav')
voice.play(source)

通过用户ID定位语音频道的实现方案

可以直接通过用户Discord ID定位其所在的语音频道,实现逻辑如下:

  1. 先从当前服务器中拉取对应用户ID的成员对象
  2. 校验该成员是否处于活跃的语音频道中
  3. 后续执行连接、播放逻辑即可

对应示例代码如下:

@bot.command()
async def join_and_play(ctx, user_id: int):
    # 拉取对应ID的成员对象
    try:
        member = await ctx.guild.fetch_member(user_id)
    except:
        await ctx.send("未找到对应用户")
        return
    # 校验用户是否在语音频道
    if not member.voice or not member.voice.channel:
        await ctx.send("该用户当前未加入任何语音频道")
        return
    target_channel = member.voice.channel
    # 处理机器人连接逻辑
    if ctx.voice_client:
        await ctx.voice_client.move_to(target_channel)
    else:
        voice = await target_channel.connect()
    # 播放音频
    source = FFmpegPCMAudio('source.wav')
    voice.play(source)

额外注意事项

  • 机器人需要拥有目标语音频道的「连接」和「说话」权限,否则会抛出权限不足异常
  • 传入的用户ID需要是整数类型,不能加引号包裹
  • 如果需要在多个服务器使用该功能,需要开启机器人的「服务器成员 intent」权限,在Discord开发者后台的机器人设置页中开启即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:45:02