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

Discord机器人Wavelink播放命令异常,执行后直接结束无播放

问题分析与解决方案

问题原因

  1. 交互响应已过期:on_wavelink_track_end事件中尝试调用player.interaction.response.send_message,但原交互已经在play命令中被响应过,此时调用会触发异常,导致播放器流程中断,直接进入曲目结束逻辑。
  2. 播放器状态关联缺失:未给播放器绑定用于发送通知的文本频道,后续曲目切换时的消息发送逻辑依赖已失效的交互对象,引发异常中断播放。

修复步骤

1. 修改play命令,绑定通知频道

在连接播放器时,保存当前交互的文本频道,用于后续曲目切换时发送通知:

@client.tree.command(name="play", description="Play some music")
@app_commands.describe(musicname="The name of the music you want to play")
async def play(interaction:Interaction, musicname:str):
    '''Play music'''
    # 新增搜索结果校验
    search = await wavelink.YouTubeTrack.search(query=musicname, return_first=True)
    if not search:
        return await interaction.response.send_message("未找到匹配的音乐", ephemeral=True)
    
    if not getattr(interaction.user.voice, "channel", None):
        return await interaction.response.send_message("你不在语音频道中", ephemeral=True)
    
    if not interaction.guild.voice_client:
        voiceclient: wavelink.Player = await interaction.user.voice.channel.connect(cls=wavelink.Player, self_deaf=True)
        # 绑定用于发送通知的文本频道
        voiceclient.text_channel = interaction.channel
    else:
        voiceclient: wavelink.Player = interaction.guild.voice_client

    if not voiceclient.is_playing():
        await voiceclient.play(search)
        await interaction.response.send_message(f"正在播放:`{search.title}`")
    else:
        await voiceclient.queue.put_wait(search)
        await interaction.response.send_message(f"已添加到队列:`{search.title}`")

使用绑定的文本频道发送通知,避免依赖已失效的交互对象:

@client.event
async def on_wavelink_track_end(player:wavelink.Player, track:wavelink.YouTubeTrack, reason:str):
    '''When track ends'''
    if player.loop:
        return await player.play(track)
    
    if not player.queue.is_empty:
        next_song = player.queue.get()
        await player.play(next_song)
        # 通过绑定的文本频道发送曲目切换通知
        if hasattr(player, 'text_channel'):
            await player.text_channel.send(f"正在播放:`{next_song.title}`")
    else:
        print("播放队列已清空")
        # 可选:播放完成后自动断开语音连接
        # await player.disconnect()

3. 额外错误处理(可选)

在搜索环节添加异常捕获,避免因搜索失败导致的流程中断:

# 在play命令的搜索部分替换为以下代码
try:
    search = await wavelink.YouTubeTrack.search(query=musicname, return_first=True)
except Exception as e:
    print(f"搜索出错:{e}")
    return await interaction.response.send_message("音乐搜索失败", ephemeral=True)

其他检查点

  • 确保Wavelink库为最新版本,旧版本可能存在兼容性问题。
  • 确认机器人拥有「连接语音频道」「在语音频道发言」的权限。
  • 排查是否有其他代码修改了播放器的队列或状态属性,导致逻辑冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:01:44