You need to enable JavaScript to run this app. discord.py首次调用!music命令报NoneType无play属性报错如何修复
优惠活动
大模型
产品
解决方案
定价
更多

discord.py首次调用!music命令报NoneType无play属性报错如何修复

问题原因

首次执行命令时,你检测到voice为空或未连接后仅执行了加入语音频道的操作,没有将channel.connect()返回的语音客户端实例赋值给voice变量,此时voice仍为初始的None值,调用play方法自然会抛出属性错误。第二次执行命令时机器人已经加入语音频道,discord.utils.get可以正常获取到已存在的语音客户端实例,所以可以正常播放。

修复代码

仅需要修改加入频道的逻辑,将连接返回的实例赋值给voice即可,以下是优化后的完整代码:

@client.command()
async def music(ctx,song : str):
    # 前置判断:避免用户未加入语音频道时报错
    if not ctx.author.voice:
        await ctx.send("你需要先加入一个语音频道")
        return
    channel = ctx.author.voice.channel
    voice = discord.utils.get(client.voice_clients, guild=ctx.guild)
  
    if voice is None or not voice.is_connected():
      # 核心修复:把连接返回的语音客户端实例赋值给voice
      voice = await channel.connect()
      
    
    song_there = os.path.isfile("Music/{}.mp3".format(song))
    if song_there == True:
      # 新增播放状态判断,避免重复调用play方法报错
      if not voice.is_playing():
          voice.play(discord.FFmpegPCMAudio(('Music/{}.mp3'.format(song))))
          await ctx.send('{} playing! <:white_check_mark:853651360666877972>'.format(song))
      else:
          await ctx.send("当前已有音乐正在播放")
    else:
      await ctx.send("This file does not exists")

额外优化建议

  • 如果需要支持连续播放,可以添加音乐队列逻辑,当前歌曲播放完毕后自动加载下一首
  • 可以补充暂停、切歌、调整音量、显示播放列表等常用功能提升使用体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 23:15:04