【问题标题】:Why i am getting empty array in Users.history:list API为什么我在 Users.history:list API 中得到空数组
【发布时间】:2023-03-17 00:44:01
【问题描述】:

我正在尝试使用带有 historyId 的 Users:History API 在 gmail 帐户中完成更改的历史记录。但不知何故,它会在完成几秒或几分钟的更改后返回数据。

代码

function listHistory($service, $userId, $startHistoryId) {
  $opt_param = array('startHistoryId' => $startHistoryId);
  $pageToken = NULL;
  $histories = array();

  do {
    try {
      if ($pageToken) {
        $opt_param['pageToken'] = $pageToken;
      }
      $historyResponse = $service->users_history->listUsersHistory($userId, $opt_param);
      if ($historyResponse->getHistory()) {
        $histories = array_merge($histories, $historyResponse->getHistory());
        $pageToken = $historyResponse->getNextPageToken();
      }
    } catch (Exception $e) {
      print 'An error occurred: ' . $e->getMessage();
    }
  } while ($pageToken);


  return $histories;
}

参考:https://developers.google.com/gmail/api/v1/reference/users/history/list

【问题讨论】:

    标签: php gmail-api


    【解决方案1】:

    如果自该历史 ID 标识的特定时间点以来用户的电子邮件箱没有发生任何更改,则对于给定的 startHistoryId,您将得到一个空结果。这是正确的行为。

    如果您等待(按照您的建议,秒或分钟)并使用相同的起始历史 ID 再次调用并获得结果,那么这些就是在中间时间段内发生的变化(新消息等)。

    如果您不想等待,并且您可以访问 Gmail 帐户进行测试,您可以向该帐户发送消息(或删除帐户中的消息),您应该会看到相应的更改接下来打电话Users.history.list。

    对于推送通知提供的historyId 值,请注意提供的 ID 是新(当前)历史 ID。见:https://developers.google.com/gmail/api/guides/push

    HTTP POST 正文是 JSON 和实际的 Gmail 通知负载 在 message.data 字段中。该 message.data 字段是 base64url 编码的字符串,解码为包含 用户的电子邮件地址和新邮箱历史 ID:

    {"emailAddress": "user@example.com", "historyId": "9876543210"} 你 然后可以使用 history.list() 获取用户的更改详细信息 根据同步指南,自他们最后一个已知的 historyId 以来。

    (强调添加)。要获取更新,您必须使用上一个历史 ID。 Google 无法知道您的应用程序跟踪的最新历史记录,因此您可以自行跟踪自上次执行 history.list() 操作以来的历史记录 ID。

    【讨论】:

    • 我同意你的看法。但是我已经实现了谷歌推送通知,当电子邮件地址收到新电子邮件时会发送通知。在推送通知中,我收到了historyId,通过它我可以使用Users.history.list API 获得收到的电子邮件的threadId。但是当谷歌当时向我的端点发送推送通知时,API 返回空响应,所以我无法在推送通知中获取新消息的详细信息
    • 答案已更新,以获取有关使用推送通知提供的历史 ID 的更多信息。
    • 同意@payne
    • 非常感谢!你救了我:)
    【解决方案2】:

    您需要将historyId 存储在推送通知中的某处,并创建一个cron 作业,该作业将获取(使用Users.history.list API)您存储的historyId 特定帐户的历史记录,直到它不返回响应为止。

    【讨论】:

      猜你喜欢
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2012-03-12
      • 2018-01-24
      相关资源
      最近更新 更多