Бот Telegram: различия между версиями

Материал из ALT Linux Wiki
Строка 47: Строка 47:
WD=/mnt/dumps.psql/daily                          # Ежедневные дампы на СХД.
WD=/mnt/dumps.psql/daily                          # Ежедневные дампы на СХД.
DUMP=`ls -1 $WD/$1*|tail -2|head -1|sed 's|.*/||'` # Проверять предпоследнюю ежедневку.
DUMP=`ls -1 $WD/$1*|tail -2|head -1|sed 's|.*/||'` # Проверять предпоследнюю ежедневку.
DATE=`echo $DUMP | cut -d, -f2`
DATE=${DUMP%,*}                                    # Дампы имеют вид 'база,гггг-мм-дд,чч-мм-сс.тип'
Token="10_цифр:???-31_цифробуква"                  # Токен/жетон созданного для этого бота.
TEST=check_${DUMP%%,*}
URL="https://api.telegram.org/bot$Token"          # API телеги с ИДом бота.
ChatID="-13_цифр"                                  # ИД чатика, куда слать оповещения.
Topic="<ИД темы>"                                  # Например, в тему "Дампы БД".


Notify(){ # Функция отправки оповещений из предварительно сформированного текста.
Notify(){ # Функция отправки оповещений из предварительно сформированного текста.
    Token="10_цифр:???-31_цифробуква"              # Токен/жетон созданного для этого бота.
    URL="https://api.telegram.org/bot$Token"      # API телеги с ИДом бота.
    ChatID="-13_цифр"                              # ИД чатика, куда слать оповещения.
    Topic="<ИД темы>"                              # Например, в тему "Дампы БД".
     curl -s $URL/sendMessage -F "chat_id=$ChatID" -F "reply_to_message_id=$Topic" -F "text=$1" 2>&1 >/dev/null
     curl -s $URL/sendMessage -F "chat_id=$ChatID" -F "reply_to_message_id=$Topic" -F "text=$1" 2>&1 >/dev/null
}
}


case ${DUMP##*.} in
case ${DUMP##*.} in
     zst) UNPAK=zstdcat     ;;
    lzo) UNPAK="lzop -dcf";;
     lzo) UNPAK="lzop -dcf" ;;
     zst) UNPAK=zstdcat   ;;
     sql) UNPAK="cat"     ;;
esac
esac


TESTDB=check_${DUMP%%,*}
Notify "Распаковывается база $TEST от ${DATE#*,}."
 
Notify "Распаковывается база $TESTDB от $DATE."


# [пере]создадим проверочную базу:
# [пере]создадим проверочную базу:
[ `psql -U postgres -c "\l+" | grep -c $TESTDB` -lt 1 ] ||
[ `psql -U postgres -c "\l+" | grep -c $TEST` -lt 1 ] ||
     for DO in drop create; do
     for DO in drop create; do
         ${DO}db -U postgres $TESTDB
         ${DO}db -U postgres $TEST
     done
     done
# и распакуем в неё дамп:
# и распакуем в неё дамп:
$UNPAK $WD/$DUMP | psql -U postgres -d $TESTDB >/dev/null 2>&1
$UNPAK $WD/$DUMP | psql -U postgres -d $TEST >/dev/null 2>&1
TIME=$(date +%T -ud @$[`date +%s`-START])          # Сколько длился весь процесс.
TIME=$(date +%T -ud @$[`date +%s`-START])          # Сколько длился весь процесс.


Notify "$TESTDB распакована за $TIME, можно проверять целостность."
Notify "$TEST распакована за $TIME, можно проверять целостность."
</source>
</source>
|}
|}

Версия от 16:27, 29 ноября 2023

Многие ищут способы отправлять оповещения о событиях на инфраструктуре в свои телеграм-группы/чаты — изучают перл с питоном (дело хорошее, но необязательное) да роются по гит-барахолкам в поисках телегоботов, написанных другими.

А меж тем всё довольно просто.

Получение бота

Cгенерим нового телегобота в генераторе (внезапно!) телегоботов, для чего следует:

  1. Отправить боту-праотцу @BotFather молитву /newbot.
  2. Ввести название бота — в этой категории особых ограничений нет.
  3. Задать техническое имя бота, которое будет отображаться в адресной строке. К нему есть требования — оно должно:
    • быть уникальным,
    • написано латиницей,
    • оканчиваться на 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=${DUMP%,*}                                    # Дампы имеют вид 'база,гггг-мм-дд,чч-мм-сс.тип'
TEST=check_${DUMP%%,*}

Notify(){ # Функция отправки оповещений из предварительно сформированного текста.
    Token="10_цифр:???-31_цифробуква"              # Токен/жетон созданного для этого бота.
    URL="https://api.telegram.org/bot$Token"       # API телеги с ИДом бота.
    ChatID="-13_цифр"                              # ИД чатика, куда слать оповещения.
    Topic="<ИД темы>"                              # Например, в тему "Дампы БД".
    curl -s $URL/sendMessage -F "chat_id=$ChatID" -F "reply_to_message_id=$Topic" -F "text=$1" 2>&1 >/dev/null
}

case ${DUMP##*.} in
    lzo) UNPAK="lzop -dcf";;
    zst) UNPAK=zstdcat    ;;
    sql) UNPAK="cat"      ;;
esac

Notify "Распаковывается база $TEST от ${DATE#*,}."

# [пере]создадим проверочную базу:
[ `psql -U postgres -c "\l+" | grep -c $TEST` -lt 1 ] ||
    for DO in drop create; do
        ${DO}db -U postgres $TEST
    done
# и распакуем в неё дамп:
$UNPAK $WD/$DUMP | psql -U postgres -d $TEST >/dev/null 2>&1
TIME=$(date +%T -ud @$[`date +%s`-START])          # Сколько длился весь процесс.

Notify "$TEST распакована за $TIME, можно проверять целостность."

Обратная связь