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

Материал из ALT Linux Wiki
Нет описания правки
Нет описания правки
Строка 4: Строка 4:


А меж тем всё довольно просто.
А меж тем всё довольно просто.
#Cгенерим нового телегобота в... генераторе телегоботов, для чего следует:
=Получение бота=
#*отправить боту-праотцу [https://t.me/BotFather @BotFather] команду '''/newbot''';
Cгенерим нового телегобота в... генераторе телегоботов, для чего следует:
#*ввести название бота — в этой категории особых ограничений нет;
*отправить боту-праотцу [https://t.me/BotFather @BotFather] команду '''/newbot''';
#*задать техническое имя бота, которое будет отображаться в адресной строке. К нему есть требования — оно должно:
*ввести название бота — в этой категории особых ограничений нет;
#**быть уникальным,
*задать техническое имя бота, которое будет отображаться в адресной строке. К нему есть требования — оно должно:
#**написано латиницей,
**быть уникальным,
#**оканчиваться на '''bot''' ''(так Телега защищается от злыдней, выдающих ботов за людей)''.
**написано латиницей,
#*По завершению сего действа BotFather пришлет токен-жетон нового бота в виде: <pre><10-числовой ИД бота>:ХХХ-<31-цифробуквенный жетон></pre>Каковой в дальнейшем и задействуем.
**оканчиваться на '''bot''' ''(так Телега защищается от злыдней, выдающих ботов за людей)''.
#Добавим свежеиспечённого бота в группы/чаты, куда нужно слать мессаги.
По завершению сего действа BotFather пришлет токен-жетон нового бота в виде: <pre><10-числовой ИД бота>:ХХХ-<31-цифробуквенный жетон></pre>Каковой в дальнейшем и задействуем.
#Получим ИДы этих групп, имеющие вид 13-значного числа с дефисом в начале.
=Группы-чаты-каналы=
#*Для публичных всё просто — с помощью нашего жетона-токена запросим их командой вида: <pre>curl https://api.telegram.org/bot<жетон:бота>/getChat?chat_id=@ИмяГруппы</pre>На что будет выводиться ответ, одним из полей в котором и станет искомый 13-числовой ИД с дефисом в начале.
Добавив свежеиспечённого бота в скопления людей, куда нужно слать мессаги, получим ИДы этих групп, имеющие вид 13-значного числа с дефисом в начале.
#*Для приватных посложнее — потребуется:
*Для публичных всё просто — с помощью нашего жетона-токена запросим их командой вида: <pre>curl https://api.telegram.org/bot<жетон:бота>/getChat?chat_id=@ИмяГруппы</pre>На что будет выводиться ответ, одним из полей в котором и станет искомый 13-числовой ИД с дефисом в начале.
#**добавить в чатик бота [https://t.me/olegonbot @olegonbot] по имени Акакий Акваланг и
*Для приватных посложнее — потребуется:
#**задать ему в этом чатике вопрос: '''<code>Акваланг?</code>'''
**добавить в чатик бота [https://t.me/olegonbot @olegonbot] по имени Акакий Акваланг и
#**на что он через несколько секунд выдаст ответ, первым же полем которого и будет искомый ИД.
**задать ему в этом чатике вопрос: '''<code>Акваланг?</code>'''
#Внесём в баш-скрипт команду ''(удобнее оформить как функцию — см. в примере ниже)'', которая при наступлении отслеживаемого события будет слать соответствующий текст по жетону бота и ИДу канала.
**на что он через несколько секунд выдаст ответ, первым же полем которого и будет искомый ИД.
{{Внимание|Токен бота храним пуще зеницы ока, поскольку всяк, кому он ведом, может невозбранно слать непотребства от имени оного!}}
{{Внимание|Токен бота храним пуще зеницы ока, поскольку всяк, кому он ведом, может невозбранно слать непотребства от имени оного!}}
=Собственно команда=
=Отправка сообщений=
На куски разбито для удобочитаемости, можно одной строкой:
Внесём в баш-скрипт команду ''(удобнее оформить как функцию — см. в примере ниже)'', которая при наступлении отслеживаемого события будет слать соответствующий текст по жетону бота и ИДу канала ''(на куски разбито для удобочитаемости, можно одной строкой)'':
<pre>curl -s -X POST -H 'Content-Type: application/json' \
<pre>curl -s -X POST -H 'Content-Type: application/json' \
     -d '{"chat_id": "ИД_чатика", "text": "текст сообщения", "disable_notification": true}' \
     -d '{"chat_id": "ИД_чатика", "text": "текст сообщения", "disable_notification": true}' \
     https://api.telegram.org/bot<токен бота>/sendMessage</pre>
     https://api.telegram.org/bot<токен бота>/sendMessage</pre>
=Пример скрипта=
=Пример скрипта=
У меня таким макаром распаковывается дамп базы для проверки его на целостность:
У меня таким макаром распаковывается дамп базы для проверки его на целостность:
Строка 65: Строка 64:
Notify "$TESTDB распакована за $TIME, можно проверять целостность."
Notify "$TESTDB распакована за $TIME, можно проверять целостность."
</source>
</source>
=Обратная связь=
=Обратная связь=
*[https://t.me/gbIMoBou @gbIMoBou]
*[https://t.me/gbIMoBou @gbIMoBou]

Версия от 06:35, 26 января 2023

Многие ищут способы отправлять оповещения о событиях на инфраструктуре в свои телеграм-группы/чаты.

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

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

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

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

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

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

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

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

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

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

  • Для публичных всё просто — с помощью нашего жетона-токена запросим их командой вида:
    curl https://api.telegram.org/bot<жетон:бота>/getChat?chat_id=@ИмяГруппы
    На что будет выводиться ответ, одним из полей в котором и станет искомый 13-числовой ИД с дефисом в начале.
  • Для приватных посложнее — потребуется:
    • добавить в чатик бота @olegonbot по имени Акакий Акваланг и
    • задать ему в этом чатике вопрос: Акваланг?
    • на что он через несколько секунд выдаст ответ, первым же полем которого и будет искомый ИД.
Внимание: Токен бота храним пуще зеницы ока, поскольку всяк, кому он ведом, может невозбранно слать непотребства от имени оного!

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

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

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
#date +"Elapsed %T" -ud @$[`date +%s`-START]            # Сколько длился весь процесс.
TIME=$(date +%T -ud @$[`date +%s`-START])

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

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