Python编写的Discord音乐机器人无法播放YouTube链接音频求解
Discord Python 音乐机器人YouTube播放故障修复方案
核心问题定位
你当前的代码存在两个核心问题:
- 依赖的
youtube-dl已经停止维护多年,无法适配YouTube最新的反爬机制和接口变动 - 音频链接提取分支存在逻辑错误,单个视频场景下会调用不存在的
entries字段直接报错
分步修复方案
1. 替换依赖库
卸载旧的youtube-dl,安装活跃维护的兼容分支yt-dlp,执行命令:
pip uninstall youtube-dl pip install yt-dlp
代码导入部分修改为:
import yt_dlp as youtube_dl
原有YoutubeDL相关的调用逻辑无需修改即可兼容。
2. 修正提取逻辑与配置参数
调整YDL_OPTIONS配置,修复音频链接提取的分支错误,修复后完整代码如下:
@commands.command() async def play(self,ctx,*,url): # 新增未连接语音频道时的自动连接逻辑 if not ctx.voice_client: await ctx.author.voice.channel.connect() ctx.voice_client.stop() FFMPEG_OPTIONS = { 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5 -referer https://www.youtube.com/', 'options': '-vn' } YDL_OPTIONS = { 'format':"bestaudio/best", 'noplaylist': True, 'quiet': True } vc = ctx.voice_client with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl: info = ydl.extract_info(url, download=False) # 修复分支逻辑错误 if 'entries' in info: # 处理搜索结果/播放列表场景,取第一个条目 entry = info["entries"][0] else: # 处理单个视频场景 entry = info url2 = entry["formats"][0]['url'] source = discord.FFmpegOpusAudio(url2, **FFMPEG_OPTIONS) vc.play(source)
3. 额外注意事项
- 该方案仅适合私人小范围服务器使用,公开大规模投放会触发YouTube的IP封禁规则
- 如果出现偶发播放失败,可检查服务器网络是否可以正常访问YouTube,或者升级
yt-dlp到最新版本
内容的提问来源于stack exchange,提问作者Timothy Yuri Kartika
相关产品推荐
相关产品推荐

