如何从 Google 相册搜索 API 获取排序结果? 1.创建 Google Apps 脚本的新项目2.将 Cloud Platform 项目链接到 Google Apps 脚本项目3.添加范围4.脚本5.部署网络应用6.测试

问题描述

我正在使用记录为 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

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

参考:

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...