api - 如何从 Google Photos 搜索 API 获得排序结果?
问题描述
我正在使用此处记录的 Google 照片搜索 API 。我希望响应中的结果从最新到最旧排序,但默认情况下,结果是从最旧到最新排序的。有没有办法反转排序?
解决方案
我相信你的目标如下。
- 您想从“方法:mediaItems.search”的方法中对结果值进行排序。
- 您希望将值从最旧到最新排序。
问题和解决方法:
不幸的是,在当前阶段,Google Photos API 中的“Method:mediaItems.search”方法似乎没有用于对返回值进行排序的参数。此外,“mediaItems.list”的方法中似乎不存在此类参数。
顺便发现,albumId
在请求体中使用“Method:mediaItems.search”的方法时,返回值是按升序排列的。如果你使用albumn ID,我认为你的目标可以通过这个来实现。
另一方面,当albumId
在请求正文中未使用时,返回值按降序排序。而且,似乎filteres
在请求正文中使用时,返回的值按降序排序。
从你的问题来看,我认为在你的情况下,albumId
可能不会使用。那么在这种情况下,作为当前的解决方法,在检索到值之后使用脚本对值进行排序怎么样?在这个答案中,我想建议使用 Google Apps Script 创建的 Web Apps 作为包装 API。
用法:
1. 新建 Google Apps Script 项目。
Web Apps 的示例脚本是 Google Apps 脚本。所以请创建一个 Google Apps Script 项目。
如果要直接创建,请访问https://script.new/。在这种情况下,如果您没有登录 Google,则会打开登录屏幕。所以请登录谷歌。至此,Google Apps Script 的脚本编辑器被打开。
2. 将 Cloud Platform Project 链接到 Google Apps Script Project。
关于这一点,您可以在此处查看详细流程。
另外,请在 API 控制台启用 Google Photos API。
3. 添加范围。
在这种情况下,请将 的范围https://www.googleapis.com/auth/photoslibrary
添加到清单文件 ( 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. 部署 Web 应用程序。
详细信息可以看官方文档。
- 在脚本编辑器上,在脚本编辑器的右上角,请点击“点击部署”->“新建部署”。
- 请点击“选择类型”->“Web App”。
- 请在“部署配置”下的字段中输入有关 Web App 的信息。
- 请为“执行为”选择“我” 。
- 这是此解决方法的重要之处。
- 请为“谁有权访问”选择“任何人” 。
- 在这种情况下,用户不需要使用访问令牌。因此,请将此用作测试用例。
- 当您想使用访问令牌时,请将其设置为
Anyone with Google account
或Only myself
。这样,用户可以使用访问令牌访问 Web 应用程序。当您使用访问令牌时,请包括https://www.googleapis.com/auth/drive.readonly
或的范围https://www.googleapis.com/auth/drive
。
- 请点击“部署”按钮。
- 当显示“Web App 要求您授权访问您的数据”时,请单击“授权访问”。
- 自动打开“需要授权”对话框。
- 选择自己的帐户。
- 在“此应用未验证”中单击“高级”。
- 点击“转到###项目名称###(不安全)”
- 单击“允许”按钮。
- 复制 Web App 的 URL。就像
https://script.google.com/macros/s/###/exec
。- 当您修改 Google Apps 脚本时,请重新部署为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。
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
。
笔记:
- 虽然当我在谷歌问题跟踪器上搜索这个时,我找不到它。那么如何将其报告为未来的请求呢?参考
参考:
推荐阅读
- django - 有没有办法在 django 的 extra_context 字典中使用路径参数?
- python - 'NoneType' 对象没有属性 '_jvm' pandas split
- android - firebase google 登录结果代码始终为 0
- python - 涉及easygui窗口的Python Pynput热键问题
- npm - 将 vega-embed 与 parcel 一起使用会出错
- python - 如何在运行 py.test -sv B/ 时读取命令行参数
- jquery - jQuery命令放置在选择元素之后时无法创建表
- jsf - 如何为 ui:param 设置动态值
- bluetooth-lowenergy - 在设备之间共享蓝牙连接
- pandas - 如何根据 pandas datetimeindex 划分我的“时间消耗”功能