如何通过API从Hipchat获取房间的所有消息历史记录?

时间:2014-08-10 06:34:28

标签: ruby hipchat

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

我意识到这有点笨重。它将JSON拉成一个字符串,然后我必须将它形成一个哈希值,所以我知道我没有做到这一点就好了,但这里大致是我快速做的只是为了测试{{ 1}} API的方法:

history

显然,对此的扩展只是诅咒所需范围内的日期(使用: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 ),但同样,我只获得了房间历史的一小部分。我是否缺少一些额外的参数,以使其按预期工作?

1 个答案:

答案 0 :(得分: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媒体资源,删除时区,然后使用更新的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属性,但它不会给出你完整的历史。在根据statistics.messages_sent的历史记录中包含9166条消息的聊天室中,它只返回了3217条消息。所以不要使用它。您可以使用statistics.messages_sent作为完整性检查,以确定是否收到所有消息。

哦是的,last_active调用中的/v2/room属性无法信任,因为当通知消息发布到会议室时,它不会更新。