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

Discord.py音乐机器人报错:Unable to extract uploader id 求助

解决Discord音乐机器人Error: Unable to extract uploader id问题

这个报错的核心原因是youtube-dl已停止维护,YouTube页面结构更新后,它无法再正确解析视频数据——哪怕更新youtube-dl也没用,因为项目已经不再迭代。解决办法是替换为持续维护的分支项目yt-dlp,下面是具体步骤:

1. 替换依赖

卸载旧的youtube-dl,安装yt-dlp:

pip uninstall youtube-dl -y
pip install yt-dlp

2. 修改代码中的配置与导入

将原代码中所有youtube_dl相关的引用替换为yt_dlp,同时优化部分配置项(yt-dlp兼容大部分youtube-dl配置,新增参数提升兼容性):

修改后的YouTube配置设置

import yt_dlp
import discord
import asyncio

yt_dlp.utils.bug_reports_message = lambda: ''

ytdl_format_options = {
    'format': 'bestaudio/best',
    'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s',
    'restrictfilenames': True,
    'noplaylist': True,
    'nocheckcertificate': True,
    'ignoreerrors': False,
    'logtostderr': False,
    'quiet': True,
    'no_warnings': True,
    'default_search': 'auto',
    'source_address': '0.0.0.0',
    # yt-dlp新增参数,优化解析逻辑
    'extract_flat': False,
}

ffmpeg_options = {
    'options': '-vn',
}

ytdl = yt_dlp.YoutubeDL(ytdl_format_options)


class YTDLSource(discord.PCMVolumeTransformer):
    def __init__(self, source, *, data, volume=0.5):
        super().__init__(source, volume)

        self.data = data
        self.title = data.get('title')
        self.url = data.get('url')
        self.duration = data.get('duration')
        # 增加空值判断,避免无缩略图时索引报错
        self.image = data.get("thumbnails", [{}])[0].get("url", "")

    @classmethod
    async def from_url(cls, url, *, loop=None, stream=False):
        loop = loop or asyncio.get_event_loop()
        # yt-dlp的extract_info用法与youtube-dl完全兼容,直接替换即可
        data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream))

        if 'entries' in data:
            data = data['entries'][0]
        
        filename = data['url'] if stream else ytdl.prepare_filename(data)
        return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data)

3. 修复代码小错误

你的播放命令示例存在拼写错误:sessionChanel应改为sessionChannel,修正后:

sessionChannel = message.author.voice.channel
await sessionChannel.connect()
url = matched.group(1)
player = await YTDLSource.from_url(url, loop=client.loop, stream=True)
sessionChannel.guild.voice_client.play(player, after=lambda e: print(
                                       f'Player error: {e}') if e else None)

4. 测试运行

完成上述修改后重启机器人,尝试播放YouTube链接即可正常工作。若出现FFmpeg相关报错,确保系统已安装FFmpeg且可通过环境变量访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:56