Отправка уведомлений на почту и в Telegram

При написании shell-скриптов, работающих по cron, иногда бывает нужно отправить пользователю уведомление о какой-то ситуации. Простейший способ — отправить EMail с помощью команды mail (работает, если на сервере установлен какой-либо MTA, например, postfix, и пакет mailutils; если MTA нет, можно воспользоваться утилитой msmtp, которая отправляет почту через внешний почтовый сервер):

echo "Текст сообщения" | mail -s "Тема сообщения" admin@example.com

Но иногда требуется сообщить о чем-либо более оперативно, чтобы уведомление пришло на мобильный телефон. Лучшим решением в этом случае является отправка SMS через шлюз EMail=>SMS, но бесплатных шлюзов сейчас не осталось. Поэтому я нашел другое решение: отправлять сообщения в Telegram с помощью Bot API. Делается это так:


  1. Идем на @BotFather и регистрируем нового бота, получаем его access token — строку вида число:длинный_набор_букв
  2. Боты не могут сами начинать диалог, поэтому пишем созданному боту команду /start. Никакого ответа не будет, это нормально. 
  3. Получаем идентификатор чата. Для этого делаем запрос curl https://api.telegram.org/bot<Token>/getUpdates, где вместо <Token> нужно подставить полученный на первом шаге access token. В ответ приходит JSON, в котором описано наше первое сообщение боту, отправленное на втором шаге. В нем нужно найти строку вида "chat":{"id":число. Это число и есть идентфиикатор.
    Упросить его поиск можно с помощью такой команды: curl https://api.telegram.org/bot<Token>/getUpdates | grep -P -o '"chat":{"id":\d+,'
  4. Вставляем в скрипт команду отправки уведомления: 
    curl "https://api.telegram.org/bot<Token>/sendMessage" -d 'chat_id=<ChatID>&text=Что-то случилось!'
    Вместо <Token> опять подставляем access token с первого шага, вместо <ChatID> — идентификатор с третьего шага, после text= пишем свой текст. Если в тексте есть апострофы, их нужно заэкранировать вот таким образом: \'

Вот и все! Теперь можно оперативно получать уведомления в Telegram-клиент на мобильнике!