Python开发的Discord机器人播放首歌后无响应,无法执行指令
问题分析与解决方案
你的机器人播完第一首歌后没反应,核心问题出在每次调用play命令时都会重复尝试加入语音频道——当机器人已经在频道里时,这个操作会静默失败,导致后续创建播放器的代码根本没执行,所以看起来机器人没响应。
原代码的问题点
- 不管机器人是否已经在当前服务器的语音频道中,
play命令都会执行await wb.join_voice_channel(channel),重复加入操作会引发内部冲突,但没有抛出可见错误 - 缺少对用户是否在语音频道的检查,万一用户没在频道里,机器人也会出错
修复后的代码
@wb.command(pass_context=True) async def play(ctx, url): author = ctx.message.author # 先检查用户是否在语音频道里 if not author.voice_channel: await wb.say("你得先加入一个语音频道才能点歌哦!") return # 查找机器人是否已经在当前服务器的语音频道中 existing_vc = None for client in wb.voice_clients: if client.server == ctx.message.server: existing_vc = client break # 如果没找到现有连接,才加入用户的频道 vc = existing_vc if existing_vc else await wb.join_voice_channel(author.voice_channel) # 创建并启动播放器 player = await vc.create_ytdl_player(url) player.start() @wb.command(pass_context=True) async def leavevoice(ctx): for x in wb.voice_clients: if x.server == ctx.message.server: return await x.disconnect()
关键改动说明
- 用户状态检查:先判断调用命令的用户是否在语音频道,避免无效操作
- 复用现有连接:先遍历机器人的语音客户端,找到当前服务器的连接就直接复用,不再重复执行加入操作
- 逻辑容错:只有当机器人不在当前服务器的语音频道时,才执行加入频道的操作
额外提示
- 你用的是旧版discord.py(v0.16.x系列),如果后续想升级到v1.x+版本,API会有较大变化(比如
pass_context被移除、语音连接的方式改为VoiceClient类等) - 可以给播放器添加结束回调,比如
player.on_end = lambda: print("歌曲播放完毕"),方便调试或给用户反馈
内容的提问来源于stack exchange,提问作者Veestire
相关产品推荐
相关产品推荐

