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();
正在尝试使用 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();