Антон Рябов bio photo

Антон Рябов

Не люблю бриться и у меня умный взгляд.

Email Twitter Telegram Github PGP RSS

Hubot скрипт для developerslife.ru

Я работаю в проекте Imhonet - это технически сложная система, у которой под капотом математический рекомендательный движок, а прикрыто все веб-мордой на PHP. К слову, сейчас команда активно переписывает фронтенд на стек Node.js/React/Webpack, а PHP будет только плеваться JSON-ом на запросы первого.




Но данный пост не об этом. Я работаю системным администратором и являюсь евангелистом СhatOps. Если коротко, суть в том, чтобы различные админские (и не только) задачи запускать простыми текстовыми командами из чата и туда же получать результаты. Не всем подходит эта мета, не буду сейчас расписывать плюсы и минусы. Я уделяю chatOps время, которое остается от выполнения основных задач, поэтому развиваю нашего бота не так быстро как хотелось бы, но так или иначе, он у нас есть.

Также, в данной записи я не буду подробно расписывать что умеет наш бот, потому что это либо интеграции с внутренними сервисами, либо что-то костыльное, либо то, про что я не могу здесь писать. Но я с легкостью могу написать про простой скрипт для работы с API сайта developerslife.ru. И разработчики и админы любят смотреть на смешные гифки, особенно в тематике своей работы. Поэтому я реализовал следующие функции:

  • dev me - присылает одну рандомную гифку
  • dev me last - присылает последние 5 гифок
  • live update - раз в 10 минут скрипт проверяет наличие новых записей и если такие есть, присылает в заданную комнату
module.exports = (robot)->

  # метод для проверки новых постов
  getDevGifsDigest = ->
    # получаем id комнаты, в которую будем слать новые гифки
    room = process.env.HUBOT_ROOM_FOR_DEV_GIFS

    robot.logger.info "Start method sendDevGifDigest"
    # дергаем из персистент (по дефолту redis) id последнего поста
    last_gif_id = robot.brain.get "developerslife_last"
    # если таковой нет, например первый раз запускается метод
    if last_gif_id == null
      url = "http://developerslife.ru/latest/0?json=true"
      # дергаем последние 5 постов
      robot.http( url ).get() (err, res, body)->
        # парсим JSON
        life = JSON.parse body
        # сохраняем id последнего поста, здесь можно впихнуть его отправку в комнату также
        robot.brain.set "developerslife_last", life.result[0].id
        robot.logger.info "Last gif is #{life.result[0].id}"
    else
      # иначе, если id поста есть, дергаем последние 50 (на этом сайте за 10 минут больше 50ти не появляется...пока)
      url = "http://developerslife.ru/latest/0?json=true&pageSize=50"
      robot.http( url ).get() (err, res, body)->
        life = JSON.parse body
        # обходим ответ и если id больше (на сайте id инкрементальный) чем тот, который записан у нас, то шлем эту гифку в заданную комнату
        for k,v of life.result
          if v.id > last_gif_id
            robot.messageRoom room, "#{v.description}: #{v.gifURL}" unless err
        # сбрасываем последний id и сетем новый последний id
        robot.brain.set "developerslife_last", ""
        robot.brain.set "developerslife_last", life.result[0].id
        robot.logger.info "Last gif is #{life.result[0].id}"

  # запускаем наш метод для получения новых постов раз в 10 минут (время в ms)
  setInterval((-> getDevGifsDigest()), 600000)

  # простой метод для получения рандомной гифки по запросу
  robot.respond /dev\s+me$/i, (msg)->
    url = "http://developerslife.ru/random?json=true"
    msg.http( url ).get() (err, res, body)->
      life = JSON.parse body
      msg.send "#{life.description}: #{life.gifURL}" unless err

  # простой метод для получения последних 5 постов по запросу
  robot.respond /dev\s+me\s+last$/i, (msg)->
    url = "http://developerslife.ru/latest/0?json=true"
    msg.http( url ).get() (err, res, body)->
      life = JSON.parse body
      for k,v of life.result
        msg.send "#{v.description}: #{v.gifURL}" unless err

Код простой, но я его прокомментировал, в любом случае вы можете задавать вопросы, контакты в меню слева.



#ChatOps #Imhonet #TechAndDev