首页 > 解决方案 > 如何从 Google Photos 搜索 API 获得排序结果?

问题描述

我正在使用此处记录的 Google 照片搜索 API 。我希望响应中的结果从最新到最旧排序,但默认情况下,结果是从最旧到最新排序的。有没有办法反转排序?

标签: apisortinggoogle-photosgoogle-photos-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 应用程序。

详细信息可以看官方文档

  1. 在脚本编辑器上,在脚本编辑器的右上角,请点击“点击部署”->“新建部署”。
  2. 请点击“选择类型”->“Web App”。
  3. 请在“部署配置”下的字段中输入有关 Web App 的信息。
  4. 请为“执行为”选择“我” 。
    • 这是此解决方法的重要之处。
  5. 请为“谁有权访问”选择“任何人” 。
    • 在这种情况下,用户不需要使用访问令牌。因此,请将此用作测试用例。
    • 当您想使用访问令牌时,请将其设置为Anyone with Google accountOnly myself。这样,用户可以使用访问令牌访问 Web 应用程序。当您使用访问令牌时,请包括https://www.googleapis.com/auth/drive.readonly或的范围https://www.googleapis.com/auth/drive
  6. 请点击“部署”按钮。
  7. 当显示“Web App 要求您授权访问您的数据”时,请单击“授权访问”。
  8. 自动打开“需要授权”对话框。
    1. 选择自己的帐户。
    2. 在“此应用未验证”中单击“高级”。
    3. 点击“转到###项目名称###(不安全)”
    4. 单击“允许”按钮。
  9. 复制 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

笔记:

  • 虽然当我在谷歌问题跟踪器上搜索这个时,我找不到它。那么如何将其报告为未来的请求呢?参考

参考:


推荐阅读