问题描述
我正在使用记录为 here 的 Google 相册搜索 API。我希望响应中的结果从最新到最旧排序,但默认情况下,结果从最旧到最新排序。有没有办法反转排序?
解决方法
我相信你的目标如下。
- 您想对“方法:mediaItems.search”的方法中的结果值进行排序。
- 您想将值从最旧到最新排序。
问题和解决方法:
遗憾的是,在现阶段,Google Photos API 中的“Method: mediaItems.search”方法的返回值似乎没有排序参数。另外,“mediaItems.list”的方法中似乎不存在这样的参数。
顺便发现,在“Method:mediaItems.search”这个方法的请求体中使用albumId
时,返回的值是按照升序排列的。如果你使用专辑ID,我认为你的目标可以通过这个实现。
另一方面,当请求正文中未使用 albumId
时,返回值按降序排序。而且,似乎在请求正文中使用 filteres
时,返回的值按降序排序。
根据您的问题,我认为在您的情况下,可能不会使用 albumId
。那么在这种情况下,作为当前的解决方法,在检索值后使用脚本对值进行排序如何?在这个答案中,我想建议使用由 Google Apps Script 创建的 Web Apps 作为包装器 API。
用法:
1.创建 Google Apps 脚本的新项目。
Web Apps 的示例脚本是 Google Apps 脚本。所以请创建一个 Google Apps Script 项目。
如果您想直接创建它,请访问https://script.new/。在这种情况下,如果您未登录 Google,则会打开登录屏幕。所以请登录谷歌。这样,Google Apps Script 的脚本编辑器就打开了。
2.将 Cloud Platform 项目链接到 Google Apps 脚本项目。
关于此,您可以在 here 查看详细流程。
另外,请在 API 控制台启用 Google Photos API。
3.添加范围。
在这种情况下,请将 https://www.googleapis.com/auth/photoslibrary
的范围添加到 the manifest file (appsscript.json
)。
4.脚本。
请将以下脚本(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}));
}
}
5.部署网络应用。
详细信息见the official document。
- 在脚本编辑器中,在脚本编辑器的右上角,请点击“单击部署”->“新建部署”。
- 请点击“选择类型”->“网络应用”。
- 请在“部署配置”下的字段中输入有关 Web 应用程序的信息。
- 请为“执行为”选择“我”。
- 这是此变通方法的重要之处。
- 请为“谁有权访问”选择“任何人”。
- 在这种情况下,用户不需要使用访问令牌。所以请将此作为测试用例。
- 当您要使用访问令牌时,请将其设置为
Anyone with Google account
或Only myself
。通过这种方式,用户可以使用访问令牌访问 Web 应用程序。使用访问令牌时,请包括https://www.googleapis.com/auth/drive.readonly
或https://www.googleapis.com/auth/drive
的范围。
- 请点击“部署”按钮。
- 当显示“Web 应用程序要求您授权访问您的数据”时,请点击“授权访问”。
- 自动打开“需要授权”对话框。
- 选择自己的帐户。
- 在“此应用未经验证”处点击“高级”。
- 点击“转到###项目名称###(不安全)”
- 点击“允许”按钮。
- 复制 Web 应用程序的 URL。就像
https://script.google.com/macros/s/###/exec
。- 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反映到 Web Apps 中。请注意这一点。
6.测试。
作为这个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
- 在此命令中,2020 - 2021 的值作为
oldest to newest
的升序返回。
注意:
- 虽然当我在 Google 问题跟踪器上搜索此内容时,我找不到相关信息。那么如何将此报告为未来的请求呢? Ref