Невыдуманная история с хеппи-эндом, про то, как бот для Telegram увеличил выручку и упорядочил работу команды разработчиков.

Предыстория

Все началось с того, что в рабочем чате Telegram, где мы обмениваемся рабочими, не совсем рабочими и откровенно не рабочими сообщениями, решили делиться оценками качества булочек и пирожков из соседней пекарни. Булки там представлены в большом ассортименте и глаза около прилавка разбегаются.

Договорились, что каждый, кто отведает пирожок, будет отписываться в чат и ставить оценку от 1 до 5. Со временем должна скопиться история дегустаций и мы сможем высчитать среднюю оценку каждой булочки.

Пирожки кушаем, оценки ставим, время идет. Но кроме рейтинга хлебобулочных изделий, в рабочем чате и работа проскакивает, которая засоряет ленту. В итоге оценки булок смешались с обсуждениями задач. Миссия провалена, статистики нет. Но программисты же всегда могут найти решение. Тут мы вспомнили про Telegram-ботов. Можно и себе помощника электронного организовать. Сказано – сделано.  Пару часов и готова первая версия бота, который принимает оценки в общем чате и делится драгоценной статистикой по запросу.

Скриншот общения с ботом:

А что бот может ещё?

После запуска бота начали накидывать идеи, чему бы еще научить нашего электронного помощника. И понеслось. За рабочий день, в коротких перерывах между задачами, добавили несколько мелочей:

  • уведомление, что пора сходить на перекур;

  • уведомление, что пора на обед;

  • уведомление, что пора выпить кофе(с утра) или чаю(файв-о-клок).

Когда наигрались с ботом, задумались о действительно полезных функциях, которые могут упростить рабочий процесс. Вспомнили, что бывают проблемы с продлением SSL-сертификатов и доменов для клиентских сайтов. Не каждый хостинг поддерживает cron или автопродление, приходится регулярно заниматься этим в «ручном режиме». Продлить домен или сертификат не сложно, главное об этом вовремя вспомнить.

Для бота эта задачка оказалась простая:

  • стащить заголовки сайта и определить срок годности SSL-сертификата. Если до часа икс осталось меньше 7 дней, отправить уведомление;

  • сделать запрос в сервис whois, вытащить срок оплаты домена и также сверить с текущей датой. Если домен умрет через неделю, то пора слать уведомление.

Реализация заняла ещё пару часов, но польза от такой фичи уже ощутима. На душе стало спокойнее.

А ещё?

Очевидно, потенциал бота огромный, осталось придумать, какую функцию прикрутить следующей. Покумекали и пришли к выводу, что у нас есть проблема с отчетами и выгрузками таск-менеджера/трекера рабочего времени. Мы используем доработанный напильником Redmine. За последние 3 года дважды пробовали реализовать надстройку для формирования отчётов по задачам, но каждый раз забрасывали, закапывались слишком глубоко, да и пользоваться выгрузками было неудобно. Вдобавок, не все разработчики следят за своими активными таймерами в задачах. За рабочий месяц у нас терялось до 15-20% часов, которые по разным причинам не были отмечены. Бывает, прилетает срочная задача и сразу погружаешься в нее, забыв включить таймер. А случается и простая невнимательность, вспоминаешь про таймер не сразу. Из-за этого собирать ежемесячные отчеты приходилось в полуручном режиме, вспоминая, не потеряли ли часы в задаче. Но восстановить хронологию удаётся не всегда, и месяц закрывается с потерями. При этом все сотрудники загружены на 100%, всегда есть активные задачи на несколько недель вперёд, однако достоверно закрыть все 160 часов не получается.

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

Постойте-ка… Но у нас же есть бот, который может за этим следить и сообщать о нарушении. А раз уж запустили его в таск-менеджер, пусть ещё и за выполнением регламентов присмотрит: какие статусы меняются у задач, какие дедлайны приближаются, как изменились приоритеты задач и т.д.

Быстренько собираем список проблемных мест, объясняем боту и вот у нас уже новая версия помощника. Пора бы и имя ему придумать. Окрестили бота «Железный Феликс», в честь одного знаменитого дядьки, который хорошо умел присмотреть за выполнением регламентов.

Затратив всего 23 рабочих часа, мы научили Железного Феликса:

  1. Проверять активность таймеров программистов. Если таймер не включен, то уведомлять об этом ответственного менеджера и программиста;

  2. Проверять задачи и уведомлять сотрудников, если произошли изменения в приоритетах задач;

  3. Проверять задачи и уведомлять программистов, если вдруг появилась вторая задача со статусом «В работе». Этот статус означает, что задача именно сейчас в работе, две активных одновременно быть не должно;

  4. Напоминать программистам и менеджерам о необходимости добавления комментария к задаче, если в ней фиксировалась активность в течении дня (отмечены трудозатраты) и не поступало текстовых комментариев. Уведомление отправляется в конце рабочего дня и дублируется утром на следующий день, если комментарий все еще не был добавлен;

  5. В конце рабочего дня для каждого программиста проверяется количество отмеченных трудозатрат и уведомляет менеджера, если было отмечено меньше 7 часов;

  6. Через пол часа после завершения рабочего дня проверять активные таймеры. Если такие есть, отправлять уведомление с напоминанием остановить таймер и скорректировать фактическое время. Бонусом приходят соболезнования, если вдруг сотрудник еще работает;

  7. Отправлять уведомление о необходимости начать выполнять задачу, если для неё было заранее установлено напоминание;

  8. Уведомлять ответственного о смене статуса в задачи;

  9. Уведомлять ответственного, если он передал задачу с неправильным статусом или не передал её дальше;

  10. Утром напоминать менеджеру об открытых задачах, в которых давно не было активности;

  11. В конце рабочего дня отправлять отчет менеджеру о трудозатратах всех программистов за день с разбивкой по задачам;

  12. В конце рабочего дня по пятницам отправлять отчет трудозатрат программистов за неделю с разбивкой по проектам;

  13. Уведомлять менеджера, если фактические трудозатраты приближаются к плановым или подходит дедлайн;

  14. За час до конца рабочего дня напоминать всем, что есть «База знаний» и туда нужно что-то добавить, если были интересные/нестандартные ситуации в течении дня;

  15. По запросу бот создает поддомены и разворачивает тестовые сайты. Удобно для верстальщиков – не нужно просить разработчика или сисадмина.

  16. По запросу бот может найти информацию в базе знаний (блог на WordPress с рабочими заметками и регламентами) и отдать ссылку на полное описание

Чтобы считать активность таймеров, пришлось залезть напрямую в базу данных Redmine, поскольку таймтрекер у нас нестандартный, а настроен через плагин. Также пришлось импровизировать, чтобы быстро реагировать на смену статусов задач и перестановку их на scrum-доске. Api Redmine не даёт таких колбеков, а для скрама у нас вообще отдельный модуль. Поэтому колбеки мы добавили сами, немного модернизировав код Redmine. Для всех остальных пунктов были использованы стандартные api таск-менеджера.

Звезды из GTA за проступки

Чтобы было проще выполнять отладку всех функций бота, стали собирать логи событий, которые обрабатывает Железный Феликс. Когда все заработало и все баги были исправлены, логирование решили оставить и даже пустили в дело. За каждую ошибку стали начислять звезды как в GTA. Больше проступков – больше звезд. Все «косяки» обнуляются в конце рабочего дня, но перед уходом домой, в общий чат приходит сообщение со статистикой.

Сперва это было ради шутки, но неожиданно появился азарт и количество ошибок стало уменьшаться. Никто не хотел схлопотать звезду. В первые пару дней работы бота мы собирали по 3-4 звезды каждый, а спустя неделю – 1-3 шт на тестовую группу.

Генерация отчетов

Бот быстро научил сотрудников пользоваться таск-менеджером по регламенту, уже через неделю до минимума сократилось неучтённое рабочее время. А имея корректные фактические часы, можно автоматизировать генерацию отчетов.

Мы не стали делать для этого отдельный интерфейс, реализовали запросы через бота – всё в одном месте. Это и удобнее в использовании, и быстрее в разработке, не нужен фронтенд. За один рабочий день обучили Железного Феликса формировать отчетность в Excel: выгрузка за любой период времени по любым проектам. В отчет попадает полный список задач и трудозатрат, с учетом всех параметров, которые мы используем при формировании сметы.

Хэппи-энд

В первый же месяц, в тестовой группе под присмотром бота, общее количество отмеченных часов в задачах, увеличилось и потери сократились на 12,5%. Это как раз те часы, которые мы всегда теряли. Плюс ко всему, теперь экономится менеджерское время, которое уходило на составление отчетов. В итоге мы не только покрыли трудозатраты на разработку бота, но и увеличили выручку, поскольку с большей частью заказчиков мы работаем с оплатой по факту трудозатрат и каждый час = деньги.

Ну и самое главное, команда научилась работать по регламенту, теперь не путаются статусы задач, приоритеты всегда понятны, а программистам не приходится держать в голове все итерации, которые должны быть у задачи. Если что-то идет не по плану, то бот всегда подскажет и напомнит.

Послесловие

В статье нет технических моментов, старался рассказать только про логику работу бота и поделиться радостью, что иногда простые решения приводят к ощутимому профиту. А интересные идеи могут появиться из совсем дурных и не связанных с работой затей.

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

С наилучшими пожеланиями Ипатов Евгений, руководитель отдела разработки в OWL agency.

Комментарии (12)


  1. C4ET4uK
    28.03.2022 21:25

    Ух ты redmine еще живой


    1. B_bird
      28.03.2022 23:25
      +2

      Живее всех живых, а на фоне ютреков, джир в условных блоках - так еще реинкарнировать может ;)


  1. makar_crypt
    28.03.2022 21:33

    Привет. Спасибо за статью. Пару вопросиков

    1) Есть ли библиотека не для ботов, чтобы зайти под своим логином и паролем и например фильтровать сообщения из всех своих подписок?

    2) Как можно выдернуть урл на медиа ресурсы, например на видео? Мы долго рыскали по API , но не нашли такого функционала. При этом знаем что существуют боты которые формируют эти линки если переслать им сообщение с видео.

    Спасибо.


    1. Ipatov_e Автор
      28.03.2022 21:52

      Привет!

      1. В этой версии бота мы к api делали запросы напрямую, без библиотек. Но все библиотеки работают через апи) А в апи телеграм нет возможности получить текст переписки из чатов. 

      Пару вариантов решения есть:

      • в чаты можно добавлять бота, который будет “слушать”, сохранять и фильтровать все переписки. Запоминая, кто и что написал

      • “руками” экспортировать все переписки и скриптами разобрать данные

      1. Не встречали таких api, скорее всего их нет. Бот может получать файлы, которые ему присылают или пересылают сообщениями, через апи getFile. А с полученным файлом уже можно сделать что угодно, например, сохранить к себе на хост и сделать ссылку на просмотр


  1. zakharoffam
    28.03.2022 21:35

    Отличное применение бота!

    И вопрос: а как вы прикрутили бота в общий чат? Как я понимаю, под общим чатом имеется ввиду канал?


    1. Ipatov_e Автор
      28.03.2022 21:56

      Приветствую! Бот может отправлять сообщения как в личку, так и в общий чат(группу или канал). Работает через api sendMessage, в параметре chat_id можно передавать как идентификатор пользователя, так и идентификатор канала.


  1. B_bird
    28.03.2022 22:56
    +1

    Поэтому колбеки мы добавили сами, немного модернизировав код Redmine

    А можно пример кода плагина, реализующего хуки?


    1. Ipatov_e Автор
      28.03.2022 23:12

      Мы без плагинов делали. В бекенде редмайна добавили немного логики внутри контроллеров - при обновлении задач отправляют post-запросы к бекенду бота. Отправляется id созданной/обновленной задачи и id пользователей, которые являются ответсвенными в задаче. Далее уже в логике бота обрабатываем эти данные. При необходимости дозапрашиваем через api редмайна, недостающую информацию о задаче по ее id. И отправляем уведомление, ответсвенным за задачу, в телеграм.


  1. unsignedchar
    28.03.2022 23:47
    +1

    Для мониторинга ssl сертификатов есть готовый шаблон в zabbix.


    1. Ipatov_e Автор
      29.03.2022 00:01

      Спасибо, изучим этот инструмент мониторинга. Когда писали свою проверку для бота, не планировали делать что-то серьезное и надолго. Поэтому в начале разработки основная идея была "сделать быстро и просто". Запрос через CURL с параметром CURLOPT_CERTINFO, идеально подошел - отдает всю необходимую информацию о сертификате домена, а реализация запроса и обработка данных заняли 15 минут.


  1. yesworldd
    29.03.2022 17:00

    На чем разрабатываете бота? Думаю, это Python.


    1. Ipatov_e Автор
      29.03.2022 17:02

      Этого бота делали на php, а коммерческих уже python.