Бот Telegram
Многие ищут способы отправлять оповещения о событиях на инфраструктуре в свои телеграм-группы/чаты — изучают перл с питоном (дело хорошее, но необязательное) да роются по гит-барахолкам в поисках телегоботов, написанных другими.
А меж тем всё довольно просто.
Получение бота
Cгенерим нового телегобота в... генераторе телегоботов, для чего следует:
- Отправить боту-праотцу @BotFather молитву
/newbot
. - Ввести название бота — в этой категории особых ограничений нет.
- Задать техническое имя бота, которое будет отображаться в адресной строке. К нему есть требования — оно должно:
- быть уникальным,
- написано латиницей,
- оканчиваться на bot (так Телега защищается от злыдней, выдающих ботов за людей... замуж).
По завершению сего действа праотец пришлет токен-жетон нового бота в виде:
<10-числовой ИД бота>:ХХХ-<31-цифробуквенный жетон>
Каковой в дальнейшем и задействуем.
Группы-чаты-каналы
Добавив свежеиспечённого бота в скопления людей, куда хочется слать мессаги, следует получить ИДы этих групп. Что легко достижимо копированием ссылки на любое сообщение в нужной группе. К примеру, рандомное сообщение из темы про Альт на публичном Линукс-форуме:
https://t.me/linuxforum_ru/685/ZZZZ
Здесь:
- 685 — (не обязательный) ИД темы,
- ZZZZ — (ненужный) ИД сообщения.
Или в какой-нибудь частной группе:
https://t.me/XXXXXXXXXX/YYYY/ZZZZ
- -100+XXXXXXXXXX — ИД чата (-100XXXXXXXXXX),
- YYYY — ИД темы.
Отправка сообщений
Внесём в баш-скрипт команду (удобнее оформить как функцию — см. в примере ниже), которая при наступлении отслеживаемого события будет слать соответствующий текст по жетону бота и ИДу канала (и темы, если надо) (на куски разбито для удобочитаемости, можно одной строкой):
$ curl -s https://api.telegram.org/bot<Токен>/send<Функция> \ -F "text=Нужное сообщение." \ -F "document=@/путь/к/файлу" \ -F "chat_id=-100ХХХХХХХХХХ" \ -F "reply_to_message_id=YYYY"
Где Функция:
- либо
Message
— тогда поле"text=..."
, - либо
Document
— тогда поле"document=@..."
.
Адрес и поля -F "..."
можно размещать в любом порядке и в одну строку.
Пример скрипта |
---|
#!/bin/bash
WD=/mnt/dumps.psql/daily # Ежедневные дампы на СХД.
DUMP=`ls -1 $WD/$1*|tail -2|head -1|sed 's|.*/||'` # Проверять предпоследнюю ежедневку.
DATE=`echo $DUMP | cut -d, -f2`
Token="10_цифр:???-31_цифробуква" # Токен/жетон созданного для этого бота.
URL="https://api.telegram.org/bot$Token" # API телеги с ИДом бота.
ChatID="-13_цифр" # ИД чатика, куда слать оповещения.
Topic="<ИД темы>" # Например, в тему "Дампы БД".
Notify(){ # Функция отправки оповещений из предварительно сформированного текста.
curl -s $URL/sendMessage -F "chat_id=$ChatID" -F "reply_to_message_id=$Topic" -F "text=$1" 2>&1 >/dev/null
}
case ${DUMP##*.} in
zst) UNPAK=zstdcat ;;
lzo) UNPAK="lzop -dcf" ;;
esac
TESTDB=check_${DUMP%%,*}
Notify "Распаковывается база $TESTDB от $DATE."
# [пере]создадим проверочную базу:
[ `psql -U postgres -c "\l+" | grep -c $TESTDB` -lt 1 ] ||
for DO in drop create; do
${DO}db -U postgres $TESTDB
done
# и распакуем в неё дамп:
$UNPAK $WD/$DUMP | psql -U postgres -d $TESTDB >/dev/null 2>&1
TIME=$(date +%T -ud @$[`date +%s`-START]) # Сколько длился весь процесс.
Notify "$TESTDB распакована за $TIME, можно проверять целостность."
|
У меня таким макаром распаковывается дамп базы для проверки его на целостность.