Google apps script 谷歌照片api添加照片不工作,上传似乎工作
正在尝试使用谷歌应用程序脚本和谷歌照片API向谷歌照片添加照片。上载似乎有效/返回令牌,但将照片添加到库失败。该过程包括两个步骤:1。按照说明上传照片数据,然后2。如前所述,将照片添加到照片库 第一步。对我来说很有用,因为我得到了一个上传令牌,但是下面的源代码步骤2抛出了一个错误,但是我的呼叫有它需要的一个媒体项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.
{
"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方法
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); }
- 在这种情况下,请使用以下脚本创建新相册,并检索相册ID
- 您希望使用带有Google Apps脚本的照片API将图像文件添加到相册中
- 您已经在API控制台启用了Google Photo API。您的访问令牌可用于使用mediaItems.batchCreate方法
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); }
- 在这种情况下,请使用以下脚本创建新相册,并检索相册ID
如果我误解了你的问题,而这不是你想要的方向,我道歉。找到了!在我提交的代码中没有显示,但仍然添加了修复,因为它可能会帮助其他人犯与我相同的错误。我直接将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()代码>谢谢您的回复