Автоматизация недельных отчётов через Telegram-бота
Недельная отчётность — одна из тех задач, что выглядят мелкими, но съедают часы. Каждый понедельник кто-то тянет числа из SQL, копирует скриншоты, пишет саммари, кидает в канал. Мы решили автоматизировать это Telegram-ботом. Это decision-log: что получилось, что нет.
Проблема ручных отчётов
У ручной отчётности скрытые издержки:
- Зависит от одного человека — он в отпуске, отчёта нет.
- Приходит нерегулярно — то в 9:00, то после обеда.
- Формат плывёт со временем — то таблица, то текст, то скриншот.
- Люди копируют числа вместо того, чтобы интерпретировать их.
Главная цена — не часы, а внимание: аналитик тратит фокус на механику вместо разбора показателей.
Что делает бот
Каждый понедельник в 9:00 бот:
- Коннектится к хранилищу и прогоняет заранее согласованные SQL-запросы.
- Считает изменения неделя к неделе и год к году.
- Собирает компактное сообщение с 5–7 ключевыми метриками.
- Кидает в командный канал.
- Логирует запуск — сбой виден сразу, не через неделю.
Команда /report даёт любому запросить свежую версию вручную. Это страховка от «опубликуй прямо сейчас».
Почему Telegram
Команда уже жила в Telegram. Добавить отчёт туда убрало трение: новый инструмент не нужен, логин не нужен, почтовые фильтры не нужны. Отчёт лежит там, где люди всё равно проверяют сообщения. Отдельный BI-дашборд для еженедельного среза — оверкилл: его никто не откроет в понедельник утром.
На практике
В pet-проекте telegram_bot я собрал минимальный пайплайн: SQL-запрос → schedule → telebot → канал. Без фреймворков и оркестраторов — одна страница кода. Это не прод-система, а проверка концепта: хватает ли 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 — канал не приживётся, трение не снимется.