能否通过用户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定位其所在的语音频道,实现逻辑如下:
- 先从当前服务器中拉取对应用户ID的成员对象
- 校验该成员是否处于活跃的语音频道中
- 后续执行连接、播放逻辑即可
对应示例代码如下:
@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
相关产品推荐
相关产品推荐

