【问题标题】:using youtube API with Google Apps Scripts将 youtube API 与 Google Apps 脚本一起使用
【发布时间】:2021-12-14 04:18:54
【问题描述】:

我无法测试我的脚本。 如果您可以在此处提供代码帮助 - 它不起作用 根据文档 - 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=parameter}]}}

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

关于如何添加媒体或视频的任何想法? 必须在有效负载中的哪个位置添加视频 blob?

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

【问题讨论】:

  • 这能回答你的问题吗? Youtube API unexpected part on Update Message {0}
  • 我确实读过。这并不能解决任何问题。
  • 在您的目标中,您希望将带有标题、说明等的电影文件上传到您的 YouTube 频道。我的理解正确吗?如果我的理解是正确的,是否需要使用 UrlFetchApp 直接向端点请求?例如,如何将 YouTube API 与高级 Google 服务一起使用?
  • @RatanNahn 哦,我的错,我很抱歉它没有为你解决任何问题,我希望它可以帮助你
  • @Tanaike 我想使用谷歌高级服务。但我得到未经授权的错误。但适用于 UrlFetchApp。我是否缺少开始使用 Google 高级服务的内容??

标签: google-apps-script youtube-data-api


【解决方案1】:

我相信你的目标如下。

  • 您想将带有标题、说明等的电影文件上传到您的 YouTube 频道。
  • 电影文件已放入您的 Google 云端硬盘。
  • 您希望通过使用UrlFetchApp 直接向端点请求来实现此目的。

这样的话,下面修改的脚本怎么样?

修改脚本:

在使用此脚本之前,请启用 YouTube Data API v3 并添加https://www.googleapis.com/auth/youtube 的范围。并且请将您Google Drive中电影文件的文件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 Drive 上的电影文件会上传到 YouTube。

注意:

  • 在当前阶段,即使使用"privacyStatus": "public",上传的视频也不公开。关于这一点,可以在官方文档中看到如下。 Ref

    从 2020 年 7 月 28 日之后创建的未经验证的 API 项目通过 videos.insert 端点上传的所有视频都将被限制为私人观看模式。要解除此限制,每个 API 项目都必须经过审核,以验证是否符合服务条款。有关详细信息,请参阅 API 修订历史记录。

  • 在高级 Google 服务中使用 YouTube API 时,可以使用以下简单脚本。 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);
      }
    

参考资料:

【讨论】:

  • 我正在尝试这种多部分方式,但无法使其工作。谢谢它现在正在工作。另外我想使用@Tanaike 答案底部提到的简单脚本。但我得到未经授权的错误。实际上我正在尝试连接我的品牌帐户。我认为使用品牌帐户的高级 Google 服务可能存在限制。请告诉我应该如何开始使用 YouTube 的高级 Google 服务。此外,正如我所允许的,该视频的公共访问权限将适用于该项目。非常感谢
  • @Ratan Nahn 感谢您的回复。我很高兴你的问题得到了解决。关于 Advanced Google services 的 YouTube API 和“品牌帐户”之间的关系,虽然我不确定I get unauthrised error 的细节,例如,当您使用 Google Apps Script 与 Cloud Platform Project 链接时,会产生什么结果你会得到吗?如果这不是直接的解决方案,我想建议使用我的第一个脚本。这是因为我的技术不好。我对此深表歉意。如果您能原谅我的拙劣技能,我将不胜感激。
  • 不差,你是个亲……@Tanaike ...如果我们能以某种方式联系,请告诉我
  • @Ratan Nahn 感谢您的回复。我认为 UrlFetchApp 和 Advanced Google 服务之间的请求值是相同的。但是,我看不到高级 Google 服务的内部请求。我为此道歉。而且,当我测试这两个脚本时,都没有发生错误。那么,例如,当您使用 Google Apps Script 与 Cloud Platform Project 链接时,您将获得什么结果?而且,当你在请求正文中包含频道 ID 时,你会得到什么结果?
  • 嗯...我在谷歌云中做了一个项目。设置凭据和 Oauth 屏幕。重定向 URI 包含 Google 电子表格详细信息。这就是我链接 GCP 和 GAS 的方式。执行脚本时出现 Oauth 同意屏幕。我授予我的帐户权限,然后连接品牌帐户 - 成功完成。我可以通过你解释的更长的方法发布视频,但不能通过简短的方法。它给出了如下未经授权的错误:GoogleJsonResponseException: API call to youtube.videos.insert failed with error: Unauthorized...it off my head
猜你喜欢
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2014-08-25
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
相关资源
最近更新 更多