Отправляем себе сообщения в телеграмм через питон. Как это может быть полезно в работе аналитика?
Детектив Данных
Немного предыстории: есть у меня один регулярный ежедневный отчёт, который грузится самым первым, еще до начала рабочего дня. Отчёт состоит из нескольких тяжелых SQL запросов, и по ним я обычно с помощью команды %%time отслеживал скорость загрузки данных. В запросы могут быть внесены изменения, и хочется отследить повлияло ли это на быстродействие выгрузки. И вообще понять - а как сегодня работает сервер, будем ли мы летать или пол дня выгружать "select * from table".
И вот однажды я наткнулся на статью как собственно отправить сообщение себе в телегу через питон - первое, что пришло на ум - уведомление о окончании загрузки.
Ты можешь быть на созвоне, есть, спать в конце концов - а тут сообщение на часах "отчёт Х загружен". Отлично, сейчас поставлю следующую выгрузку а с этими данными можно начинать работать.

Или что поинтереснее "запрос Y выполнен за пятнадцать минут" Хм... А так то он обычно выгружается по сорок - значит пора бить тревогу и идти смотреть - а что там произошло? а что-то да произошло раз время сократилось. А ты вовремя пришёл, поправил и поставил заново - не потеряв драгоценные часы работы, и поиск места ошибок постфактум окончания выгрузки с неполными данными.
Порядок такой:
- создаём своего бота, берём с него всю инфу
- пишем код на отправку сообщений
- нюансы и доделки
Создаём бота
Открываем поиск и ищем
@BotFather

Придумываем название бота (должно оканчиваться на bot), пусть будет detective_test_report_bot
Вам будет выдан токен примерно такого вида, сохраняем его
1234567894:HUJRhjh_sPoO135eQz4EwbFBKJkTcIGBMCM66
В целом больше ничего тут не нужно, кроме пожалуй аватарки бота, которую можно загрузить прямо тут через команду
/setuserpic
Переходим в уже наш созданный бот и жмём/вводим команду
/start
И обязательно пишем боту любой текст
hello world
С телегой закончили, начинаем питонить:
import requests
TOKEN = "В КАВЫЧКИ ВСТАВЛЯЕМ СВОЙ ТОКЕН"
url = f"https://api.telegram.org/bot{TOKEN}/getUpdates"
print(requests.get(url).json())
В результате выполнения кода вы увидите информацию о последнем отправленном сообщении боту, среди всей информации вы увидите кусок
…'chat': {'id'4815162342,…. Вот это число id нам и нужно это наш чат айди
Сохраняем ваш чат айди в переменную
Готово. Уже сейчас мы можем отправить себе первое сообщение:
import requests
report_name = 'Ежедневный мониторинг'
bot_token = '1234567894:HUJRhjh_sPoO135eQz4EwbFBKJkTcIGBMCM66'
chat_id = ‘4815162342’
send_message_url = f'https://api.telegram.org/bot{bot_token}/sendMessage'
message_text = f'Отчёт {report_name} - загрузка окончена'
payload = {
'chat_id': chat_id,
'text': message_text
}
response = requests.post(send_message_url, data=payload)
message_text
Результат мы увидим после выполнения ячейки, и смотрим в телегу. Всё работает.

Давайте теперь подумаем как мы можем улучшить и сделать сообщения более полезными и содержательными
1. Время загрузки отчетов
2. Небольшое условное форматирование, смайлики
3. Отправка сообщений нескольким пользователям
4. Графики
Поехали сначала - время запроса
Перед запросом, или отчётом фиксируем текущее время
import time
start_time = time.time()
после отчета или его части фиксируем время окончания, и округляем получившуюся разницу :
end_time = time.time()
elapsed_time = end_time - start_time
elapsed_minutes_end = round(elapsed_time / 60)
Теперь мы можем добавить в сообщение время выполнения запроса, или загрузки отчета в целом. Просто редактируем наш message_text заодно выполнив два переноса строки с помощью «\n\n» не забыв взять сообщение в скобки
message_text = (f'Запрос 3 - данные загружены за {elapsed_minutes_3} минут\n\n'
f'Отчёт {report_name} загружен за {elapsed_minutes_end} минут ')
Супер. Отчет стал полезнее, давайте поколдуем что-бы он стал немного нагляднее:
Добавим новый атбирут в payload:
'parse_mode': 'Markdown' – теперь мы можем просто поставить ** в тексте и шрифт выделится жирным, ну или
'parse_mode': 'HTML' если вы как и я (используем свои знаниями из 2005 года) хотите использовать теги <b> </b>
Что-то не хватает – смайликов! Помогут отделить один вид сообщений от других – как ни странно ничего выдумывать не надо, просто копируете понравившийся смайлик и вставляете в свой текст в питоне. Можно вставить напрямую, а можно использовать юникод код например «\u2198\ufe0f» для стрелки (юникод можно посмотреть в теле ссылки например telegram.org/a/img-apple-64/2198-fe0f.png или найти любую таблицу с кодами)

Может случиться необходимость когда сообщение с бота нужно отправить нескольким коллегам – всё просто отправляем коллегу писать сообщение бота и смотрим его чат айди, с помощью первого кода в статье, а дальше запускаем самый стандартный цикл отправки через for, теперь оба айди сохраняем в переменную
chat_ids = ['151675936', '463459322']
и сам цикл
for chat_id in chat_ids:
payload = {'chat_id': chat_id, 'text': message_text, 'parse_mode': 'Markdown' }
response = requests.post(send_message_url, data=payload)
message_text -- в конце (уже вне цикла) я вывожу себе одно сообщение для проверки.

Вот и всё, ничего сложного и довольно удобно. Но отправлять можно не только сообщения, но и небольшие файлы и фото, например графики (только аккуратно, данные составляющие коммерческую тайну через телегу я бы не советовал никуда отправлять без предварительных согласований), а что-то нейтральное - вроде времени отработки запроса - почему бы и нет? В следующем посте - создадим мини базу для хранения времени загрузки отчётов, настроим её обновление, отрисуем график с помощью библиотеки matplotlib, покопаемся в мелочах и отправим себе удобную картинку с анализом нашей загрузки. Жду ваших эмоций к посту, комментариев - и до скорой встречи в новых статьях!