Google 照片 api 添加照片无效,上传似乎有效

Google photos api adding photos not working, upload seems to work

正在尝试使用 Google Apps 脚本和 Google 照片 API 将照片添加到 Google 照片。上传似乎有效/returns 一个令牌,但随后将照片添加到图库失败。该过程包括两个步骤: 1. 按照 here, then 2. Add the photo to photo library as described here.

所述上传照片数据

第 1 步对我有用,因为我获得了一个上传令牌,但下面的源代码的第 2 步会引发错误,但我的调用有它需要的一个媒体项。

{
  "error": {
    "code": 400,
    "message": "Request must have at least one newMediaItem.",
    "status": "INVALID_ARGUMENT"
  }
}

我的代码在下面的上传步骤之后。我试图将请求主体字符串化并将其传递给有效负载而不是主体,但没有任何效果。由于错误看起来很具体,我觉得我只是忽略了一件小事,但是什么???谁有一段有效的代码,最好是在我可以查看的应用程序脚本中?

    requestHeader = {
      "authorization": "Bearer " + photos.getAccessToken(),
      "Content-Type": "application/json"
    }

    var requestBody = {
      "newMediaItems": [
        {
          "description": "Photo description",
          "simpleMediaItem": {
            "fileName": fileName,
            "uploadToken": uploadToken
          }
        }
      ]
    }

    var options = {
      "muteHttpExceptions": true,
      "method" : "post",
      "headers": requestHeader,
      "body" : requestBody
    };


      var response = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate", options);

      Logger.log("raw: " + response);
  • 您想使用带有 Google Apps 脚本的照片 API 将图像文件添加到相册。
  • 您已经在 API 控制台启用了 Google 照片 API。您的访问令牌可用于使用 mediaItems.batchCreate.
  • 的方法

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。

用法:

1。将云平台项目链接到 Google Apps 脚本项目:

关于这个,你可以在here看到详细流程。

2。添加范围:

在这种情况下,请将 https://www.googleapis.com/auth/photoslibrary 的范围添加到清单文件 (appsscript.json)。

虽然我认为根据您的问题,上面的步骤 1 和 2 已经完成,但我添加了它们,因为我认为这可能对其他用户有用。

3。示例脚本:

在你的脚本中,我看不到 uploadToken 的细节。但在你的问题中,我可以确认你已经检索到 uploadToken 的值。因此,当您想要使用您的脚本来检索 uploadToken 时,请将 uploadToken 替换为您的脚本。作为脚本的修改点, 1. 包含专辑 ID。 2.UrlFetchApp没有body属性。 3. payload请使用JSON.stringify()

function getUplaodToken_(imagefileId) {
  var headers = {
    "Authorization": "Bearer " + ScriptApp.getOAuthToken(),
    "X-Goog-Upload-File-Name": "sampleFilename",
    "X-Goog-Upload-Protocol": "raw",
  };
  var options = {
    method: "post",
    headers: headers,
    contentType: "application/octet-stream",
    payload: DriveApp.getFileById(imagefileId).getBlob()
  };
  var res = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/uploads", options);
  return res.getContentText()
}

// Please run this.
function myFunction() {
  var imagefileId = "###";  // Please set the file ID of the image file.
  var albumId = "###";  // Please set the album ID.
  var uploadToken = getUplaodToken_(imagefileId);

  var requestHeader = {Authorization: "Bearer " + ScriptApp.getOAuthToken()};
  var requestBody = {
    "albumId": albumId,
    "newMediaItems": [{
      "description": "Photo description",
      "simpleMediaItem": {
      "fileName": "sampleName",
      "uploadToken": uploadToken
    }}]
  };
  var options = {
    "muteHttpExceptions": true,
    "method" : "post",
    "headers": requestHeader,
    "contentType": "application/json",
    "payload" : JSON.stringify(requestBody)
  };
  var response = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate", options);
  Logger.log(response);
}
  • 在这个脚本中,假设图像文件放在 Google 驱动器中。

注:

  • 如果出现No permission to add media items to this album.的错误,请通过脚本创建相册。官方文档是这样说的

    Media items can be created only within the albums created by your app.

    • 在这种情况下,请通过以下脚本创建新相册,并检索相册ID。

      function createNewAlbum() {
        var options = {
          headers: {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
          payload: JSON.stringify({album: {title: "sample title"}}),
          contentType: "application/json",
          method: "post"
        };
        var res = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/albums", options);
        Logger.log(res);
      }
      

参考文献:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

找到了!未在我提交的代码中显示,但仍在添加修复程序,因为它可能会帮助其他人犯与我相同的错误。我直接将 UrlFetchApp 的响应指定为上传令牌,如下所示:

uploadToken = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/uploads", options);

但需要对其调用 .getContentText() 以将其作为字符串获取,如下所示:

uploadToken = UrlFetchApp.fetch("https://photoslibrary.googleapis.com/v1/uploads", options).getContentText();