使用 youtube API 和 Google Apps 脚本

using youtube API with Google Apps Scripts

我无法测试我的脚本。 如果您可以在此处帮助处理代码 - 它无法正常工作 根据文档 - https://developers.google.com/youtube/v3/docs/videos/insert

  if (serviceYT.hasAccess()) {
  url = 'https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&mine=true&key='+ API_KEY;
  var data;
  data = '{"snippet":{"title":"testtitle","description":"testdes","categoryId":"19","tags":["asdf","sadfds"]},"status":{"privacyStatus":"public"}}';

  var options =  {
    'headers': {
      'Authorization': 'Bearer ' + serviceYT.getAccessToken()
      ,'Accept': 'application/json'
    },
    'contentType': 'application/json',
    'method' : 'POST',
    'payload' : data,
    'muteHttpExceptions' : true
  };
  
  //execute and handle the response
  var response = UrlFetchApp.fetch(url, options);
  var responseCode = response.getResponseCode();
  var result = JSON.parse(response.getContentText());
  Logger.log(result);

}

我的问题-

  1. 将视频放在哪里?
  2. 解决我遇到的错误:

{error={message='status', code=400.0, errors=[{reason=unexpectedPart, domain=youtube.part, message='status', location=part, locationType =参数}]}}

一个 youtube object(基本上是一个空视频)已成功添加到可以通过工作室看到的 youtube。它是一个空视频,但标题、描述、状态等...其他设置正确。

关于如何添加媒体或视频有什么想法吗?? 视频 blob 必须添加到负载中的什么位置?

我无法在文档中找到它。 https://developers.google.com/youtube/v3/docs/videos/insert

我相信你的目标如下。

  • 您想将包含标题、说明等的电影文件上传到您的 YouTube 频道。
  • 电影文件已放入您的 Google 驱动器中。
  • 您想通过使用 UrlFetchApp 直接向端点请求来实现此目的。

在这种情况下,下面的修改脚本怎么样?

修改后的脚本:

在使用此脚本之前,请启用 YouTube 数据 API v3 并添加 https://www.googleapis.com/auth/youtube 的范围。并且请将您 Google 驱动器中的电影文件的文件 ID 设置为 const fileId = "###";

serviceYT.getAccessToken() 来自您的脚本。

function myFunction() {
  const fileId = "###"; // Please set the file ID of movie file on the Google Drive.
  const metadata = {
    "snippet": { "title": "testtitle", "description": "testdes", "categoryId": "19", "tags": ["asdf", "sadfds"] },
    "status": { "privacyStatus": "public" }
  };

  const url = 'https://www.googleapis.com/upload/youtube/v3/videos?part=snippet%2Cstatus';
  const file = DriveApp.getFileById(fileId);
  const boundary = "xxxxxxxxxx";
  let data = "--" + boundary + "\r\n";
  data += "Content-Type: application/json; charset=UTF-8\r\n\r\n";
  data += JSON.stringify(metadata) + "\r\n";
  data += "--" + boundary + "\r\n";
  data += "Content-Type: " + file.getMimeType() + "\r\n\r\n";
  const payload = Utilities.newBlob(data).getBytes().concat(file.getBlob().getBytes()).concat(Utilities.newBlob("\r\n--" + boundary + "--").getBytes());
  const options = {
    method: "post",
    contentType: "multipart/form-data; boundary=" + boundary,
    payload: payload,
    headers: { 'Authorization': 'Bearer ' + serviceYT.getAccessToken() },
    muteHttpExceptions: true,
  };
  const res = UrlFetchApp.fetch(url, options).getContentText();
  console.log(res);
}
  • 在您的脚本中,您正在使用 url = 'https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&mine=true&key='+ API_KEY; 的端点。您的 data 具有 snippetstatus 的属性。在这种情况下,需要使用https://www.googleapis.com/upload/youtube/v3/videos?part=snippet%2Cstatus.

    的端点
  • 要上传电影文件,需要用multipart/form-data请求。

  • 当此脚本为 运行 时,Google 驱动器上的电影文件被上传到 YouTube。

注:

  • 现阶段即使使用"privacyStatus": "public",上传的视频也不是public。关于这个,大家可以在官方文档中看到,如下。 Ref

    All videos uploaded via the videos.insert endpoint from unverified API projects created after 28 July 2020 will be restricted to private viewing mode. To lift this restriction, each API project must undergo an audit to verify compliance with the Terms of Service. Please see the API Revision History for more details.

  • 当您使用 YouTube API 高级 Google 服务时,您可以使用以下简单脚本。 Ref

      function myFunction2() {
        const fileId = "###"; // Please set the file ID of movie file on the Google Drive.
        const res = YouTube.Videos.insert({
          "snippet": { "title": "testtitle", "description": "testdes", "categoryId": "19", "tags": ["asdf", "sadfds"] },
          "status": { "privacyStatus": "public" }
        }, ["snippet", "status"], DriveApp.getFileById(fileId).getBlob());
        console.log(res);
      }
    

参考文献: