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

Discord音乐机器人使用youtube_dl时触发IndexError数组越界错误求解

报错根因

报错触发在'outtmpl': "file/" + url.split('=')[1] + '.mp3'这行的url.split('=')[1]调用,你默认输入的YouTube链接一定包含=字符,拆分后至少有2个元素,才可以取索引为1的内容当文件名,但以下两种情况会导致拆分后的列表长度只有1,触发越界:

  • 输入的是YouTube短链接(格式为https://youtu.be/xxxxxx),链接中没有=字符
  • 输入的链接是其他不带=参数的YouTube分享格式,比如移动端分享的去参数链接

你修改输出格式为mp3之前没有触发报错,只是因为此前你输入的所有链接都是带v=参数的长链接,近期刚好碰到了不符合格式的链接才触发问题,和修改输出格式没有直接关联。

修复方案

不要通过拆分URL的方式获取视频标识,直接调用youtube_dl的extract_info方法拿到视频的唯一id作为文件名,兼容所有YouTube链接格式,同时避免重复拆分URL的冗余代码。
另外你当前代码里先执行下载再提取信息的顺序可以调整,先提取信息拿到视频id再构造下载配置,逻辑更合理,同时额外加了命令格式校验,避免没输入链接时也触发越界报错。

修复后的核心代码段

if message.content.startswith('핑크야 재생'):
    for vc in client.voice_clients:
        if vc.guild == message.guild:
            voice = vc
    # 校验是否输入了链接,避免取split[1]也触发越界
    msg_parts = message.content.split(" ")
    if len(msg_parts) < 2:
        await message.channel.send("请附带要播放的视频链接")
        return
    url = msg_parts[1]

    # 先提取视频信息拿到唯一id
    with youtube_dl.YoutubeDL({'format': 'bestaudio/best'}) as ydl:
        info = ydl.extract_info(url, download=False)
        video_id = info['id']
        title = info["title"]

    # 用视频id构造下载配置
    option = {
        'format': 'bestaudio/best', 
        'postprocessors': [{
            'preferredcodec': 'mp3', 
            'key': 'FFmpegExtractAudio', 
            'preferredquality': '320', 
        }],
        'outtmpl': f"file/{video_id}.mp3"
    }

    # 执行下载
    with youtube_dl.YoutubeDL(option) as ydl:
        ydl.download([url])

    voice.play(discord.FFmpegPCMAudio(f"file/{video_id}.mp3"))
    await message.channel.send(title + "재생할게!")

额外提醒:你当前公开的代码里直接写明了机器人的登录token,所有看到这段代码的人都可以操控你的机器人,请立刻前往Discord开发者平台重置你的bot token,避免被滥用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 18:45:07