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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:45:02