【问题标题】:How do I get sorted results from the Google Photos search API?如何从 Google Photos 搜索 API 获得排序结果?
【发布时间】:2021-02-25 10:06:14
【问题描述】:

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

【问题讨论】:

    标签: api sorting google-photos google-photos-api


    【解决方案1】:

    我相信你的目标如下。

    • 您希望对“Method: mediaItems.search”方法的结果值进行排序。
    • 您希望将值从最旧到最新排序。

    问题和解决方法:

    不幸的是,在现阶段,Google Photos API 中的“Method: mediaItems.search”方法似乎没有用于对返回值进行排序的参数。另外,“mediaItems.list”的方法中似乎没有这样的参数。

    顺便发现,“Method:mediaItems.search”的方法在请求体中使用albumId时,返回值是按升序排列的。如果你使用albumn 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。部署 Web 应用程序。

    详细信息可见the official document

    1. 在脚本编辑器上,在脚本编辑器的右上角,请点击“点击部署”->“新建部署”。
    2. 请点击“选择类型”->“Web App”。
    3. 请在“部署配置”下的字段中输入有关Web App的信息。
    4. 请为“执行为”选择“我”
      • 这是此解决方法的重点。
    5. 请为“谁有权”选择“任何人”
      • 在这种情况下,用户不需要使用访问令牌。所以请将此作为测试用例。
      • 当您要使用访问令牌时,请将其设置为Anyone with Google accountOnly myself。这样,用户可以使用访问令牌访问 Web 应用程序。使用访问令牌时,请包含https://www.googleapis.com/auth/drive.readonlyhttps://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 的升序返回。

    注意:

    • 虽然当我在 Google 问题跟踪器中搜索此内容时,我找不到它。那么如何将其报告为未来的请求呢? Ref

    参考资料:

    【讨论】:

    • 感谢您提供如此详细的回复!我一直在通过 HTTP 请求访问 API。当我使用 URL https://script.google.com/macros/s/[letters+numbers_for_my_script]/execkey:[myGooglePhotosAPIkey],albumId:[myAlbumID] 的查询参数这样做时,我得到以下响应:Script function not found: doGet。关于问题是什么的任何建议?你可能会说,我不经常这样做,所以这可能是一些愚蠢的错误。
    • @tlewis3348 感谢您的回复。我带来的不便表示歉意。关于`当我使用 URL script.google.com/macros/s/[letters+numbers_for_my_script]/exec 和 key:[myGooglePhotosAPIkey],albumId:[myAlbumID],, if you are using key:[myGooglePhotosAPIkey],albumId:[myAlbumID] 的查询参数作为查询参数时,我认为这是不正确的。在这种情况下,它是https://script.google.com/macros/s/[letters+numbers_for_my_script]/exec?key=###&amp;albumId=###。这个怎么样?
    • @tlewis3348 但是,根据您的错误消息,我担心在您的情况下,Web 应用程序可能无法正确部署。因为当我测试上面的流程时,没有发生错误。我对此深表歉意。如果上述修改不是您当前问题的直接解决方案,为了正确了解您当前的情况,您可以分享您当前的脚本吗?借此,我想确认一下。
    • 没问题。听起来部署存在问题,因为您建议的 URL(即https://script.google.com/macros/s/[letters+numbers_for_my_script]/exec?key=###&amp;albumId=###)也不起作用。我不确定公开分享项目的 URL 是否是个好主意。你能在 tlewis3348 [at symbol] gmail.com 给我发电子邮件吗?
    • @tlewis3348 感谢您的回复。我不得不为我糟糕的英语水平道歉。关于Could you email me at tlewis3348 [at symbol] gmail.com?,我该怎么办?例如,当您想使用电子邮件显示您的 GAS 项目的 URL 时,您可以在 tanaikech.github.io/contact 看到我的联系方式
    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多