【发布时间】:2021-02-25 10:06:14
【问题描述】:
我正在使用记录在 here 的 Google 照片搜索 API。我希望响应中的结果从最新到最旧排序,但默认情况下,结果是从最旧到最新排序的。有没有办法反转排序?
【问题讨论】:
标签: api sorting google-photos google-photos-api
我正在使用记录在 here 的 Google 照片搜索 API。我希望响应中的结果从最新到最旧排序,但默认情况下,结果是从最旧到最新排序的。有没有办法反转排序?
【问题讨论】:
标签: api sorting google-photos google-photos-api
我相信你的目标如下。
不幸的是,在现阶段,Google Photos API 中的“Method: mediaItems.search”方法似乎没有用于对返回值进行排序的参数。另外,“mediaItems.list”的方法中似乎没有这样的参数。
顺便发现,“Method:mediaItems.search”的方法在请求体中使用albumId时,返回值是按升序排列的。如果你使用albumn ID,我认为你的目标可以通过这个来实现。
另一方面,当albumId 未在请求正文中使用时,返回值按降序排序。而且,似乎在请求正文中使用filteres 时,返回的值按降序排序。
根据您的问题,我认为在您的情况下,albumId 可能不会被使用。那么在这种情况下,作为当前的解决方法,在检索到值之后使用脚本对值进行排序怎么样?在这个答案中,我想建议使用 Google Apps Script 创建的 Web Apps 作为包装 API。
Web Apps 的示例脚本是 Google Apps 脚本。所以请创建一个 Google Apps Script 项目。
如果要直接创建,请访问https://script.new/。在这种情况下,如果您没有登录 Google,则会打开登录屏幕。所以请登录谷歌。这样,Google Apps Script 的脚本编辑器就打开了。
关于这个,你可以在here查看详细流程。
另外,请在 API 控制台启用 Google Photos API。
在这种情况下,请将https://www.googleapis.com/auth/photoslibrary的范围添加到the manifest file (appsscript.json)。
请将以下脚本(Google Apps 脚本)复制并粘贴到脚本编辑器中。此脚本适用于 Web 应用程序。此 Web 应用程序用作 API。
function doGet(e) {
const key = "sampleKey"; // This is used for using this Web Apps.
try {
if (e.parameter.key != key) throw new Error("Invalid key.");
const albumId = e.parameter.albumId;
const filters = e.parameter.filters;
const sort = e.parameter.sort;
const headers = {"Authorization": "Bearer " + ScriptApp.getOAuthToken()};
const url = "https://photoslibrary.googleapis.com/v1/mediaItems:search";
let mediaItems = [];
let pageToken = "";
const metadata = {pageSize: 100, pageToken: pageToken};
if (albumId) metadata.albumId = albumId;
if (filters) metadata.filters = JSON.parse(filters);
do {
const params = {
method: "post",
headers: headers,
contentType: "application/json",
payload: JSON.stringify(metadata),
}
const res = UrlFetchApp.fetch(url, params);
const obj = JSON.parse(res.getContentText());
mediaItems = mediaItems.concat(obj.mediaItems);
pageToken = obj.nextPageToken || "";
} while (pageToken);
if (mediaItems.length > 0) {
if (sort && sort == "ascending") {
mediaItems.sort((a, b) => new Date(a.mediaMetadata.creationTime) < new Date(b.mediaMetadata.creationTime) ? -1 : 1);
}
return ContentService.createTextOutput(JSON.stringify({values: mediaItems}));
}
return ContentService.createTextOutput(JSON.stringify({error: "No values."}));
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({error: err.message}));
}
}
详细信息可见the official document。
Anyone with Google account或Only myself。这样,用户可以使用访问令牌访问 Web 应用程序。使用访问令牌时,请包含https://www.googleapis.com/auth/drive.readonly或https://www.googleapis.com/auth/drive的范围。https://script.google.com/macros/s/###/exec。
作为这个 Web Apps 的测试,我想建议使用下面的 curl 命令。请将 https://script.google.com/macros/s/###/exec 替换为您的 Web Apps URL。
在此 curl 命令中,结果值以oldest to newest 的升序返回。
$ curl -GL -d "key=sampleKey" -d "sort=ascending" https://script.google.com/macros/s/###/exec
使用专辑 ID:
当你想使用相册ID时,请使用下面的curl命令。
$ curl -GL -d "albumId=###" -d "key=sampleKey" -d "sort=ascending" https://script.google.com/macros/s/###/exec
-d "sort=ascending",结果值也会以oldest to newest的升序返回。当您想使用过滤器时,请使用以下 curl 命令。
$ curl -GL -d 'filters={"dateFilter":{"ranges":[{"startDate":{"year":2020},"endDate":{"year":2021}}]}}' -d "key=sampleKey" -d "sort=ascending" https://script.google.com/macros/s/###/exec
oldest to newest 的升序返回。【讨论】:
https://script.google.com/macros/s/[letters+numbers_for_my_script]/exec 和 key:[myGooglePhotosAPIkey],albumId:[myAlbumID] 的查询参数这样做时,我得到以下响应:Script function not found: doGet。关于问题是什么的任何建议?你可能会说,我不经常这样做,所以这可能是一些愚蠢的错误。
, if you are using key:[myGooglePhotosAPIkey],albumId:[myAlbumID] 的查询参数作为查询参数时,我认为这是不正确的。在这种情况下,它是https://script.google.com/macros/s/[letters+numbers_for_my_script]/exec?key=###&albumId=###。这个怎么样?
https://script.google.com/macros/s/[letters+numbers_for_my_script]/exec?key=###&albumId=###)也不起作用。我不确定公开分享项目的 URL 是否是个好主意。你能在 tlewis3348 [at symbol] gmail.com 给我发电子邮件吗?
Could you email me at tlewis3348 [at symbol] gmail.com?,我该怎么办?例如,当您想使用电子邮件显示您的 GAS 项目的 URL 时,您可以在 tanaikech.github.io/contact 看到我的联系方式