Google Apps Script调用YouTube API上传视频报错及参数问题咨询
问题解答
1. 待上传视频文件的存放位置
你当前仅提交了视频元数据,所以才会生成空的视频条目。YouTube Data API的videos.insert接口要求使用multipart/related格式的请求体,请求体分为两个部分:
- 第一部分:
Content-Type: application/json,存放视频的snippet、status等元数据,也就是你现在写在data变量里的内容 - 第二部分:
Content-Type: video/*,存放视频文件的二进制Blob数据
在Google Apps Script中,你需要先获取视频的Blob对象(例如从Google Drive读取的话用DriveApp.getFileById('你的视频文件ID').getBlob()),再按照multipart格式组装payload,同时要把请求头的contentType从原来的application/json改为带分隔符的multipart/related格式。
2. 400 unexpectedPart报错解决
这个报错的直接原因是你请求URL中的part参数配置错误:
- 你在请求体中传入了
status字段,但是URL的part参数没有包含status - 你额外传入了
contentDetails、statistics这两个仅用于视频查询接口的part参数,上传接口不识别这两个值
修正方案:把URL中的part参数改为part=snippet,status即可,删除多余的contentDetails、statistics,移除不需要的mine=true参数(上传接口不需要该参数)。
修正后可运行代码示例
if (serviceYT.hasAccess()) { // 调整part参数,删除无效的contentDetails、statistics、mine参数 const url = 'https://youtube.googleapis.com/youtube/v3/videos?part=snippet,status&key='+ API_KEY; // 视频元数据 const metadata = { snippet: { title: "testtitle", description: "testdes", categoryId: "19", tags: ["asdf", "sadfds"] }, status: { privacyStatus: "public" } }; // 获取视频Blob,这里以从Google Drive读取为例,替换为你自己的视频来源 const videoBlob = DriveApp.getFileById('替换为你的Google Drive视频文件ID').getBlob(); // 自定义分隔符 const boundary = '-------YouTubeBoundary123456'; // 组装multipart请求体 let payload = `--${boundary}\r\n`; payload += 'Content-Type: application/json; charset=UTF-8\r\n\r\n'; payload += JSON.stringify(metadata) + '\r\n'; payload += `--${boundary}\r\n`; payload += `Content-Type: ${videoBlob.getContentType()}\r\n\r\n`; const options = { headers: { 'Authorization': 'Bearer ' + serviceYT.getAccessToken() }, // 修改contentType为multipart/related contentType: `multipart/related; boundary=${boundary}`, method : 'POST', // 拼接二进制内容作为最终payload payload: Utilities.newBlob(payload).getBytes().concat(videoBlob.getBytes()).concat(Utilities.newBlob(`\r\n--${boundary}--`).getBytes()), muteHttpExceptions : true }; // 执行请求 const response = UrlFetchApp.fetch(url, options); const responseCode = response.getResponseCode(); const result = JSON.parse(response.getContentText()); Logger.log(result); }
内容的提问来源于stack exchange,提问作者Ratan Nahn
相关产品推荐
相关产品推荐

