【问题标题】:Google photos api adding photos not working, upload seems to work谷歌照片API添加照片不起作用,上传似乎工作
【发布时间】:2020-06-07 13:42:12
【问题描述】:

尝试使用 Google Apps 脚本和 Google Photos API 将照片添加到 Google Photos。上传似乎工作/返回一个令牌,但随后将照片添加到库中失败。该过程包括两个步骤: 1. 按照here 的描述上传照片数据,然后 2. 按照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-script google-photos google-photos-api


    【解决方案1】:
    • 您想通过 Google Apps 脚本使用 Photo API 将图像文件添加到相册。
    • 您已经在 API 控制台启用了 Google Photo API。并且您的访问令牌可用于使用 mediaItems.batchCreate 的方法。

    如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

    用法:

    1。将 Cloud Platform 项目链接到 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 Drive 中。

    注意:

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

      只能在您的应用创建的相册中创建媒体项目。

      • 在这种情况下,请通过以下脚本创建新专辑,并请检索专辑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);
        }
        

    参考资料:

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

    【讨论】:

    • 感谢您的回答。我的appsscript.json 文件中有这个范围“googleapis.com/auth/photoslibrary”,但我的日志中不断出现错误[20-02-23 18:14:41:084 PST] { "error": { "code": 400, "message": "No permission to add media items to this album.", "status": "INVALID_ARGUMENT" } }
    • 你知道,我真正想知道的是你是怎么学会这一切的?你真的是老头吗?或者也许真的很聪明?
    • @Cooper 感谢您的回复。我带来的不便表示歉意。关于No permission to add media items to this album.,在这种情况下,请通过脚本创建新专辑。看来这是谷歌方面的规范。我也遇到了同样的问题。所以我准备了脚本来解决这个问题。您可以在我的回答中的Note: 部分查看有关通过脚本创建新专辑的脚本。从创建的新专辑中获取专辑ID后,请再次测试脚本。
    • 是的,我要感谢你。我只是能够通过脚本创建一个相册,现在我要看看是否可以上传一些图片。
    • @Cooper 谢谢你的评论。就我而言,当我查看谷歌资源时,我经常查看谷歌网站的官方文档和 GitHub 上官方库的脚本。我认为 GitHub 上官方库的脚本为解决问题提供了很多信息。根据他们的信息,我想到了问题和解决方案。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多