如何使用YT data API v3无需OAuth同意屏向YouTube账号上传视频
实现方案
核心逻辑:要跳过OAuth同意屏,不能走常规前端触发的三方授权流程,需提前为你的个人YouTube账号手动获取长期有效的OAuth 2.0 刷新令牌,后端安全存储该令牌,每次上传前自动用刷新令牌兑换短期访问令牌调用API即可,全程不需要给用户弹出授权窗口。
1. 前置准备(仅需手动操作一次)
- 登录谷歌云控制台,开启YouTube Data API v3服务,创建桌面应用类型的OAuth 2.0客户端凭证,保存生成的客户端ID、客户端密钥
- 手动构造授权链接触发一次授权,授权范围填
https://www.googleapis.com/auth/youtube.upload,链接额外增加access_type=offline、prompt=consent参数,确保返回刷新令牌,拿到刷新令牌后存入后端环境变量,禁止泄露到前端
2. 前端React实现逻辑
前端仅负责视频文件选择、上传到自有后端、进度展示,不需要处理任何YouTube授权相关逻辑:
- 用
<input type="file" accept="video/*">组件获取本地视频文件 - 用FormData封装视频文件、视频标题/描述等自定义参数,调用后端上传接口,可通过axios的
onUploadProgress配置实现上传进度条展示
注意:所有谷歌API相关的密钥、令牌都不能传到前端,和YouTube API的交互必须全部走后端完成
3. 后端Node.js实现逻辑
核心封装令牌自动刷新、YouTube视频上传能力:
- 首先安装官方依赖:
npm install googleapis - 初始化OAuth客户端,提前注入环境变量里的客户端ID、客户端密钥、刷新令牌,官方SDK会自动处理访问令牌过期刷新,不需要手动写兑换逻辑
- 接收前端传的视频文件流后,调用YouTube Data API的
videos.insert接口完成上传,核心代码示例:
const { google } = require('googleapis'); const youtube = google.youtube('v3'); // 初始化OAuth客户端 const oauth2Client = new google.auth.OAuth2( process.env.GOOGLE_CLIENT_ID, process.env.GOOGLE_CLIENT_SECRET ); oauth2Client.setCredentials({ refresh_token: process.env.YOUTUBE_REFRESH_TOKEN }); google.options({ auth: oauth2Client }); // 上传视频核心方法 async function uploadVideo(videoStream, title, description) { const uploadRes = await youtube.videos.insert({ part: 'snippet,status', requestBody: { snippet: { title: title, description: description, tags: ['自定义标签'], categoryId: '22' // 可根据视频内容调整分类ID }, status: { privacyStatus: 'private' // 可选值:public、unlisted、private } }, media: { body: videoStream } }); return uploadRes.data; }
- 对外提供HTTP接口给前端调用,接收前端传的视频文件和自定义参数,调用上述上传方法后将结果返回给前端
注意事项
- 刷新令牌默认长期有效,除非手动撤销谷歌云凭证授权、或连续6个月未使用,定期检查令牌有效性即可
- YouTube API默认配额为每天10000点,单次视频上传消耗1600点配额,即每天最多可上传6个视频,配额不足可去谷歌云控制台申请提额
- 大文件上传建议开启断点续传,SDK支持通过
resumable参数配置分片上传,避免网络波动导致上传失败
内容的提问来源于stack exchange,提问作者Sandeep Gupta
相关产品推荐
相关产品推荐

