Автоматизация недельных отчётов через Telegram-бота

Недельная отчётность — одна из тех задач, что выглядят мелкими, но съедают часы. Каждый понедельник кто-то тянет числа из SQL, копирует скриншоты, пишет саммари, кидает в канал. Мы решили автоматизировать это Telegram-ботом. Это decision-log: что получилось, что нет.

Проблема ручных отчётов

У ручной отчётности скрытые издержки:

  • Зависит от одного человека — он в отпуске, отчёта нет.
  • Приходит нерегулярно — то в 9:00, то после обеда.
  • Формат плывёт со временем — то таблица, то текст, то скриншот.
  • Люди копируют числа вместо того, чтобы интерпретировать их.

Главная цена — не часы, а внимание: аналитик тратит фокус на механику вместо разбора показателей.

Что делает бот

Каждый понедельник в 9:00 бот:

  1. Коннектится к хранилищу и прогоняет заранее согласованные SQL-запросы.
  2. Считает изменения неделя к неделе и год к году.
  3. Собирает компактное сообщение с 5–7 ключевыми метриками.
  4. Кидает в командный канал.
  5. Логирует запуск — сбой виден сразу, не через неделю.

Команда /report даёт любому запросить свежую версию вручную. Это страховка от «опубликуй прямо сейчас».

Почему Telegram

Команда уже жила в Telegram. Добавить отчёт туда убрало трение: новый инструмент не нужен, логин не нужен, почтовые фильтры не нужны. Отчёт лежит там, где люди всё равно проверяют сообщения. Отдельный BI-дашборд для еженедельного среза — оверкилл: его никто не откроет в понедельник утром.

На практике

В pet-проекте telegram_bot я собрал минимальный пайплайн: SQL-запрос → scheduletelebot → канал. Без фреймворков и оркестраторов — одна страница кода. Это не прод-система, а проверка концепта: хватает ли Telegram как канал для операционных срезов. Хватает.

Что изменилось

До ботаПосле
Время в понедельник~40 мин на сбор + рассылку~3 мин на беглый просмотр
РегулярностьКогда автор успелВсегда 09:00
ФорматПлыл от недели к неделеСтабильный шаблон
ДоступТолько у автораУ всей команды (/report)
СбоиЗамечали через неделюСразу в логе

Каркас бота:

import telebot
import schedule
import time
from db import run_report_queries

bot = telebot.TeleBot(TOKEN)
CHANNEL = "@team_metrics"

def send_weekly():
    # SQL → словарь метрик с WoW и YoY
    metrics = run_report_queries()
    text = format_report(metrics)
    try:
        bot.send_message(CHANNEL, text, parse_mode="HTML")
        log_run(status="ok")
    except Exception as e:
        # Явный фолбэк: молчание хуже ошибки
        bot.send_message(CHANNEL, "⚠️ Отчёт не собран: "+str(e))
        log_run(status="error", err=str(e))

# Понедельник 09:00
schedule.every().monday.at("09:00").do(send_weekly)

@bot.message_handler(commands=["report"])
def manual(message):
    send_weekly()

while True:
    schedule.run_pending()
    time.sleep(1)

Форматирование сообщения — отдельная аккуратность. Telegram поддерживает HTML-теги, но не всё: <b>, <i>, <code> работают, а цвета и таблицы — нет. Итоговый шаблон:

def format_report(metrics: dict) -> str:
    lines = ["<b>📊 Еженедельный отчёт</b>", f"Период: {metrics['period']}", ""]
    for m in metrics["items"]:
        # ▲ зелёный / ▼ красный — WoW
        arrow = "🟢" if m["wow"] > 0 else "🔴"
        lines.append(
            f"{m['name']}: <b>{m['value']}</b>  "
            f"{arrow} {m['wow']:+.1%} WoW  "
            f"{m['yoy']:+.1%} YoY"
        )
    lines.append("")
    lines.append("ℹ️ /report — свежий срез")
    return "\n".join(lines)

Бейджи ▲▼ и эмодзи-индикаторы работают в Telegram без потери форматирования. Цвет не нужен — его всё равно нет.

Чему научился:

  • Надёжность важнее формата. Сломанный бот разрушает доверие быстрее, чем некрасивый отчёт.
  • Фолбэк обязателен. Если база лежит, бот должен сказать это явно, а не молчать — молчание через неделю обнаруживается как «а где отчёт?».
  • Держите сканируемым. Одно сообщение с 5–7 метриками бьёт длинный документ. Бейджи ▲▼ для WoW, цвет не нужен — Telegram его всё равно порежет.
  • Логируйте запуск. Таблица report_runs(status, ts, err) — первый шаг к мониторингу без мониторинга.
  • SQL отдельно от бота. Запросы — в репозитории, ревьюятся как код. Бот только вызывает и форматирует.

Результат

Бот работает с середины 2024 года. За это время:

  • Ни одного пропущенного понедельника. Единственный сбой — когда упал хост с базой; бот честно написал ⚠️ Отчёт не собран, и команда узнала о проблеме до того, как её заметил админ.
  • Команда перестала ждать отчёт. Он просто есть в канале в 09:01. Новые участники подключаются к каналу и видят историю — онбординг нулевой.
  • Появились запросы на новые метрики. Когда отчёт перестал быть проблемой, люди начали думать, что они хотят видеть, а не как это получить.

Главный сюрприз: бот изменил не процесс, а ритм. Понедельничное утро перестало быть «кто сделал отчёт?» и стало «а что там с метриками?».

Когда не надо:

  • Аудитории нужен глубокий контекст, интерактивные срезы или формальное согласование — бота мало. Это для операционных снепшотов, не для советов директоров.
  • Метрики меняются каждую неделю — бот устареет быстрее, чем окупится.
  • Команда не в Telegram — канал не приживётся, трение не снимется.

Смотрите также

← К статьям