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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过API从Hipchat获取房间的所有消息历史记录?相关的知识,希望对你有一定的参考价值。

我今天使用了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')),但同样,我只获得了房间历史的一小部分。我是否缺少一些额外的参数,以使其按预期工作?

答案

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

首先以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参数重新提交上述URL:

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属性不可信,因为当通知消息发布到房间时它不会更新。

以上是关于如何通过API从Hipchat获取房间的所有消息历史记录?的主要内容,如果未能解决你的问题,请参考以下文章

python 从hipchat房间获取详细聊天记录

HipChat Nodejs Bot - 无法接收房间消息

sh 使用api的v1通过cURL向HipChat发送HTML消息

markdown 自动按字母顺序排列HipChat房间和人

如何通过环聊 API 删除一个环聊/聊天室中的所有消息?

从 Forge api 获取房间/区域信息