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
相关产品推荐
相关产品推荐

