3

我今天稍微使用了Hipchat API (v2),遇到了一个奇怪的问题,我无法真正提取房间的所有历史记录。例如,当我查询特定日期时,它似乎只会检索给定日期的一小部分历史记录。我曾计划简单地遍历房间的所有日期,以我可以使用的格式提取历史记录,但最终遇到了这个问题,现在我不确定是否真的可以完全提取历史记录。

我意识到这有点笨拙。它将 JSON 作为字符串提取,然后我必须将其形成为哈希,所以我知道我没有做到最好,但这大致是我快速做的,只是为了测试history方法API:

api_token = "MY_TOKEN"

client = HipChat::Client.new(api_token, :api_version => 'v2')
history = client['ROOM_NAME'].history

history = JSON.parse(history)

history.each do |key, history|
  if history.is_a? Array
    history.each do |message|
      if message.is_a? Hash
        puts "#{message['from']['name']}: #{message['message']}"
      end
    end
  end
end

显然,对此的扩展只是诅咒所需范围内的日期(使用:)client['ROOM_NAME'].history(:date => '2010-11-19', :timezone => 'PST'),但同样,我只得到了房间历史的一小部分。我是否缺少一些其他参数以使其按预期工作?

4

1 回答 1

6

我得到了这个工作,但这是一个很大的痛苦。

首先以 UTC 格式发送带有当前 时间的查询,但不包括时区,作为开始日期:

https://internal-hipchat-server/v2/room/2/history?reverse=false&date=2015-06-25T20:42:18.658439&max-results=1000&auth_token=XXX

这是非常繁琐的:

  • 如果您只指定当前日期而不指定时区,如 API 中所述,则它会被解释为昨晚的午夜,并且您只会收到昨天或更早的消息。
  • 如果您尝试指定明天的日期,则响应为400 Bad Request This day has not yet come to pass.
  • 如果您将时间指定为 2015-06-25T20:42:18.658439+00:00,这是 HipChat API 响应中的时间格式,HipChat 的解析器似乎失败并将其解释为昨晚的午夜。

当您收到响应时,获取最旧的属性,剥离时区,然后使用更新的参数items.date重新提交上述 URL :date

https://internal-hipchat-server/v2/room/2/history?reverse=false&date=2015-06-17T19:56:34.533182&max-results=1000&auth_token=XXX

一定要包括微秒,以防通知在同一秒内将多条消息发布到同一个房间。

这将为您提供下一页的消息。继续这样做,直到收到的消息少于max-results回复。

start-index在完成上述工作之前,我尝试传递一个参数,它会给你几页结果,响应缺少links.next属性,但它不会给你完整的历史记录。根据 ,在一个历史上有 9166 条消息的聊天室上statistics.messages_sent,它只返回了 3217 条消息。所以不要使用它。您可以将statistics.messages_sent其用作是否收到所有消息的健全性检查。

哦,是的,通话中的last_active属性/v2/room不能被信任,因为当通知消息发布到房间时它不会更新。

于 2015-06-26T02:56:55.553 回答