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

Python开发Discord Bot下载YouTube视频无法发送到服务器报错求解

报错原因
  • 直接引用了stream.download方法对象而非返回值:stream.download()是执行下载操作的方法,调用后会返回下载完成的视频文件路径,你代码里没有加括号调用,直接把方法本身传给了open()函数,触发类型错误。
  • 事件注册逻辑错误:在on_message事件内部再次嵌套注册on_message事件,会导致后续收到消息时重复触发、逻辑混乱。
  • 冗余的文件读取操作:discord.File可以直接传入文件路径,不需要额外手动开文件句柄。
修复后代码
from pytube import YouTube
import discord
import os
from discord.ext import commands

# 配置消息读取权限
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
# 状态标记:记录是否在等待用户输入链接
waiting_for_link = False

@client.event
async def on_ready():
  print("We have logged in as {0.user}".format(client))

@client.event
async def on_message(message):
  global waiting_for_link
  if message.author == client.user:
    return

  # 收到下载指令,标记等待输入链接
  if message.content.startswith("/download") and not waiting_for_link:
    waiting_for_link = True
    await message.channel.send("Please Type the Link")
    return

  # 处理用户输入的链接
  if waiting_for_link:
    waiting_for_link = False
    link = message.content
    video = YouTube(link)
    stream = video.streams.get_highest_resolution()
    # 调用下载方法,接收返回的本地文件路径
    video_path = stream.download()
    # 直接发送视频文件
    await message.channel.send(file=discord.File(video_path))
    # 可选:发送后删除本地文件,节省存储空间
    if os.path.exists(video_path):
      os.remove(video_path)

client.run("TOKEN")
额外注意事项
  • 需要先在Discord开发者后台开启Message Content Intent权限,否则bot无法读取用户发送的消息内容。
  • Discord普通服务器默认上传文件上限为8MB,超过大小的视频会发送失败,可自行调整下载的分辨率适配大小限制。
  • 多用户同时使用的场景下,建议用用户ID绑定等待状态,避免全局变量导致的指令冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:06:04