Google apps script 谷歌照片api添加照片不工作,上传似乎工作

Google apps script 谷歌照片api添加照片不工作,上传似乎工作,google-apps-script,google-photos,google-photos-api,Google Apps Script,Google Photos,Google Photos Api,正在尝试使用谷歌应用程序脚本和谷歌照片API向谷歌照片添加照片。上载似乎有效/返回令牌,但将照片添加到库失败。该过程包括两个步骤:1。按照说明上传照片数据,然后2。如前所述,将照片添加到照片库 第一步。对我来说很有用,因为我得到了一个上传令牌,但是下面的源代码步骤2抛出了一个错误,但是我的呼叫有它需要的一个媒体项 { "error": { "code": 400, "message": "Request must have at least one newMediaItem.

正在尝试使用谷歌应用程序脚本和谷歌照片API向谷歌照片添加照片。上载似乎有效/返回令牌,但将照片添加到库失败。该过程包括两个步骤:1。按照说明上传照片数据,然后2。如前所述,将照片添加到照片库

第一步。对我来说很有用,因为我得到了一个上传令牌,但是下面的源代码步骤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 Photo API。您的访问令牌可用于使用mediaItems.batchCreate方法
如果我的理解是正确的,那么这个答案呢?请把这看作是几个可能的答案之一

用法: 1.将云平台项目链接到Google Apps脚本项目: 关于这一点,您可以在中查看详细流程

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

虽然我认为从你的问题来看,上面的第一步和第二步已经完成了,但我添加了它们,因为我认为这可能对其他用户有用

3.示例脚本: 在您的脚本中,我看不到
uploadToken
的详细信息。但是在您的问题中,我可以确认您已经检索到了
uploadToken
的值。因此,当您想使用脚本检索
uploadToken
时,请将
uploadToken
替换为您的脚本。作为脚本的修改点,1。包括相册ID.2。UrlFetchApp没有
正文
属性。3.请对有效负载使用
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 Drive中
注:
  • 如果出现
    无权将媒体项添加到此相册中的错误。
    请使用脚本创建相册。官方文件如下

    只能在应用程序创建的相册中创建媒体项

    • 在这种情况下,请使用以下脚本创建新相册,并检索相册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);
      }
      
参考资料:
如果我误解了你的问题,而这不是你想要的方向,我道歉。

  • 您希望使用带有Google Apps脚本的照片API将图像文件添加到相册中
  • 您已经在API控制台启用了Google Photo API。您的访问令牌可用于使用mediaItems.batchCreate方法
如果我的理解是正确的,那么这个答案呢?请把这看作是几个可能的答案之一

用法: 1.将云平台项目链接到Google Apps脚本项目: 关于这一点,您可以在中查看详细流程

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

虽然我认为从你的问题来看,上面的第一步和第二步已经完成了,但我添加了它们,因为我认为这可能对其他用户有用

3.示例脚本: 在您的脚本中,我看不到
uploadToken
的详细信息。但是在您的问题中,我可以确认您已经检索到了
uploadToken
的值。因此,当您想使用脚本检索
uploadToken
时,请将
uploadToken
替换为您的脚本。作为脚本的修改点,1。包括相册ID.2。UrlFetchApp没有
正文
属性。3.请对有效负载使用
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 Drive中
注:
  • 如果出现
    无权将媒体项添加到此相册中的错误。
    请使用脚本创建相册。官方文件如下

    只能在应用程序创建的相册中创建媒体项

    • 在这种情况下,请使用以下脚本创建新相册,并检索相册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“,选项)

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


uploadToken=UrlFetchApp.fetch(“https://photoslibrary.googleapis.com/v1/uploads,选项)。getContentText()

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

uploadToken=UrlFetchApp.fetch(“https://photoslibrary.googleapis.com/v1/uploads“,选项)

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

uploadToken=UrlFetchApp.fetch(“https://photoslibrary.googleapis.com/v1/uploads,选项)。getContentText()

谢谢您的回复