Как получить всю историю сообщений от Hipchat для комнаты через API?

Сегодня я использовал 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')), но опять же, я получал только часть истории для комнаты. Есть ли какие-то дополнительные параметры, которые мне не хватает, чтобы заставить его работать должным образом?


person ylluminate    schedule 10.08.2014    source источник


Ответы (1)


У меня это сработало, но это была большая боль.

Начните с отправки запроса с текущим временем в формате 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 нельзя доверять, потому что оно не обновляется, когда уведомления публикуются в комнате.

person andrewdotn    schedule 26.06.2015
comment
Хороший. Можете ли вы поместить свой исходный код в качестве плагина, чтобы другие тоже могли его использовать. - person dev123; 27.08.2015