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

Материал из ALT Linux Wiki
Строка 30: Строка 30:


После чего бота лучше удалить во обеспечение дальнейшей приватности.
После чего бота лучше удалить во обеспечение дальнейшей приватности.
Наверняка есть способ получать ИД таких чатиков посредством тележного API (Акакий ведь это как-то делает), однако разбираться с этим сейчас некогда, а вышеприведённый вариант работает надёжно.


=Отправка сообщений=
=Отправка сообщений=

Версия от 09:16, 26 января 2023

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

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

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

Cгенерим нового телегобота в... генераторе телегоботов, для чего следует:

  1. Отправить боту-праотцу @BotFather молитву /newbot.
  2. Ввести название бота — в этой категории особых ограничений нет.
  3. Задать техническое имя бота, которое будет отображаться в адресной строке. К нему есть требования — оно должно:
    • быть уникальным,
    • написано латиницей,
    • оканчиваться на bot (так Телега защищается от злыдней, выдающих ботов за людей).

По завершению сего действа праотец пришлет токен-жетон нового бота в виде:

<10-числовой ИД бота>:ХХХ-<31-цифробуквенный жетон>

Каковой в дальнейшем и задействуем.

Внимание: Токен бота (тот, что после двоеточия) храним пуще зеницы ока, поскольку всяк, кому оный вéдом, может невозбранно слать непотребства от имени того!

Группы-чаты-каналы

Добавив свежеиспечённого бота в скопления людей, куда нужно слать мессаги, нужно получить ИДы этих групп, имеющие вид 13-значного числа с предваряющим его дефисом. Существует сервис по определению ИДа — однако:

  • не проверял, умеет ли он в приватные чатики,
  • и неизвестно, как долго он будет доступен.

Так что лучше оставлю здесь на будущее уже проверенные методы.

Публичные

Тут всё просто — с помощью нашего жетона-токена запросим их либо через браузер, либо командой вида:

curl https://api.telegram.org/bot<бот:жетон>/getChat?chat_id=@ИмяГруппы

На что будет выводиться ответ, одним из первых полей в котором и станет искомый ИД.

Частные

Здесь посложнее — понадобится:

  • добавить в чатик бота @olegonbot по имени Акакий Акваланг и
  • задать в этом чатике безадресный вопрос «Акваланг?»

На что он через несколько секунд выдаст ответ, первым же полем которого и будет потребный ИД.

После чего бота лучше удалить во обеспечение дальнейшей приватности.

Наверняка есть способ получать ИД таких чатиков посредством тележного API (Акакий ведь это как-то делает), однако разбираться с этим сейчас некогда, а вышеприведённый вариант работает надёжно.

Отправка сообщений

Внесём в баш-скрипт команду (удобнее оформить как функцию — см. в примере ниже), которая при наступлении отслеживаемого события будет слать соответствующий текст по жетону бота и ИДу канала (на куски разбито для удобочитаемости, можно одной строкой):

curl -s -X POST -H 'Content-Type: application/json' \
    -d '{"chat_id": "ИД_чатика", "text": "текст сообщения", "disable_notification": true}' \
    https://api.telegram.org/bot<токен бота>/sendMessage

Пример скрипта

У меня таким макаром распаковывается дамп базы для проверки его на целостность:

#!/bin/bash

WD=/mnt/dumps.psql/daily                           # Ежедневные дампы на СХД.
DUMP=`ls -1 $WD/$1*|tail -2|head -1|sed 's|.*/||'` # Проверять предпоследнюю ежедневку.
DATE=`echo $DUMP | cut -d, -f2`
ChatID="-13_цифр"                                  # ИД чатика, куда слать оповещения.
BoTokn="10_цифр:???-31_цифробуква"                 # Токен/жетон созданного для этого бота.

Notify(){ # Функция отправки оповещений, предварительно формирующая текст.
    curl -s -X POST -H 'Content-Type: application/json' \
         -d "{\"chat_id\": \"$ChatID\", \"text\": \"$1\", \"disable_notification\": true}" \
         https://api.telegram.org/bot$BoTokn/sendMessage 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, можно проверять целостность."

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