discord.py运行play命令报AttributeError: 'NoneType'无channel属性如何解决
错误原因
该报错的触发原因是调用play命令的用户未加入任何语音频道,此时ctx.message.author.voice会返回None,你直接访问该空对象的channel属性就会抛出属性不存在的错误。
修复步骤
- 第一步:添加用户语音状态校验,提前判断用户是否加入语音频道,未加入时直接返回提示
- 第二步:修正语音客户端逻辑,避免机器人已加入频道时
player变量为空的问题 - 第三步:确保系统已安装FFmpeg依赖,音频解码需要用到该工具
依赖安装命令(Zorin OS适用)
sudo apt update && sudo apt install ffmpeg -y
修正后的完整代码
@bot.command(aliases=['p', 'pla']) async def play(ctx, url: str = 'http://stream.radioparadise.com/rock-128'): # 先校验用户是否在语音频道 if not ctx.author.voice: await ctx.send("请先加入一个语音频道再使用播放命令") return channel = ctx.author.voice.channel global player # 判断机器人是否已经连接了语音频道 if ctx.voice_client: player = ctx.voice_client else: try: player = await channel.connect() except Exception as e: await ctx.send(f"加入语音频道失败:{str(e)}") return # 停止当前正在播放的内容,避免重复播放报错 if player.is_playing(): player.stop() # 使用传入的url参数,不要硬编码广播地址 player.play(FFmpegPCMAudio(url))
其他注意事项
- 确保你的机器人已开启
Voice State Intent权限,在Discord开发者后台的Bot设置页开启该开关 - 确保机器人拥有当前语音频道的
连接、说话权限
内容的提问来源于stack exchange,提问作者The_Roboters
相关产品推荐
相关产品推荐

