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

pytube获取stream下载地址 云函数直传阿里云OSS无本地下载方案

错误原因

你的代码报错是因为把stream.download这一pytube内置的「下载文件到本地磁盘」的方法对象传给了requests.get,requests.get要求接收字符串类型的链接,自然会报类型不匹配的错误。

核心实现逻辑
  1. 获取视频真实下载地址:pytube的Stream对象自带url属性,直接读取stream.url即可拿到对应的视频资源直链,不需要调用download()方法
  2. 不落地上传OSS:直接请求拿到视频的二进制内容,再调用OSS的put_object接口上传即可,不需要在本地生成临时文件
修改后可运行的代码
import time
import requests
import oss2
from datetime import datetime
from pytube import YouTube
import pytz

# 初始化YouTube对象并获取指定清晰度的流
yt = YouTube('https://www.youtube.com/watch?v=xLiRkW5Qjy4')
stream = yt.streams.get_by_itag(22)

# 生成时间前缀、初始化OSS客户端
t = datetime.fromtimestamp(int(time.time()), pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H.%M.%S')
auth = oss2.Auth('替换为你的AccessKey','替换为你的AccessKeySecret')
bucket = oss2.Bucket(auth, 'https://oss-cn-XXXX.aliyuncs.com', '替换为你的桶名')

# 直接请求视频资源获取二进制内容
video_content = requests.get(stream.url, timeout=120).content
# 文件名用YouTube视频标题,替换掉特殊字符避免OSS路径报错
file_name = yt.title.replace('/', '_').replace('\\', '_').replace(':', '_')
# 上传到OSS
bucket.put_object(f"{t}/{file_name}.mp4", video_content)
注意事项
  • 你原来的代码缺少time、requests依赖导入,需要补充
  • 原代码中name变量未定义,这里直接用YouTube自带的视频标题作为文件名,同时做了特殊字符替换避免OSS路径识别异常
  • 可以根据云函数的超时限制调整requests.get的timeout参数,避免大视频下载超时

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:02