Отправка текстовых сообщений и файлов с консоли или скрипта в Telegram

Уже давно хотел написать эту заметку, да все руки не доходят. Ну, короче говоря, раз уж собрался писать то слушайте, вотЪ.

Бывает нужно отправить вывод команды или целые логи кому то в Telegram или просто сохранить их для дальнейших нужд. Тут начинается катавасия, текстовые редакторы, FileZilla/WinSCP (кому что), длительный и мучительный переход по иерархии директорий, перекидывание файлов туда-обратно… с scp тоже будет дольше, ручную отправку дальше desktop никто не отменял… доколе!

И тут, такая тема. Мы создаем своего telegram-бота, дальше отправляем в API Telegram текстовые сообщений или файлы, и автоматом получаем их в виде сообщений от нашего бота. Также можно создать необходимые нам группы/чаты куда мы этого бота можем добавить. Короче говоря, в чем я вижу удобство применения для себя:

  • супер-удобная штука для отправки различного рода уведомлений прямо из консоли/скрипта
  • удобство передачи логов, по сути, cat напрямую в телегу

Итак, поехали:

1) Пишем боту @BotFather и через него создаем своего нового бота. Там же можно настроить его имя, установить ему аватарку, и т.д. Еще важно узнать ТОКЕН нашего бота, записываем.

2) Пишеv уже нашему @боту, начинаем с ним чат, нажимаем /start

3) Дальше, нам нужно узнать параметра нашего ID нашего чата, куда мы будем отправлять сообщения (например, это наш с ним личный чат, или какой-нибудь групповой, куда добавлен наш бот). Открываем браузер и открываем там ссылку: https://api.telegram.org/bot<ТОКЕН>/getUpdates (если у вас заблокирована телега, используйте любые способы обхода блокировки – на данном этапе это не принципиально). Не закрывая вкладку браузера, пишем боту сообщение в телеге. После, обновляем вкладку браузера, и там находим искомый нами параметр. Записываем его.

Итого у нас получается два необходимых параметра:

  • token бота
  • id чата

4) А теперь проверяем отправку сообщения через браузер, подставляя наши параметры в запрос: https://api.telegram.org/bot<ТОКЕН>/sendMessage?chat_id=<ID_ЧАТА>&text=Hello%20World

Итак, сообщение получили. Переходим к отправке сообщений из консоли. Тут сразу сделаем оговорку. В РФ доступ к api.telegram.org заблокирован, и если вы настраиваете отправку данных уведомлений с какого-нибудь сервера, то обойти эту блокировку будет несколько сложнее, чем в случае с браузером на десктопе. У нас есть несколько вариантов, но тут мы рассмотрим вариант с использованием прокси-серверов. Плюсов множество, но мы остановимся на том, что нам не нужно никакого дополнительно ПО ставить на наш сервер (все что нам понадобится, это curl и cat). Итак, допустим у нас есть где-то на просторах интернета SOCKS5 прокси-сервер с авторизацией, вот через него мы и будем запрос отправлять. Если же у вас Telegram не заблокирован, то строки и параметры с использованием прокси-серверов можете игнорировать.

5) Далее, небольшая демонстрация (не забудьте подставить параметры своего прокси-сервера) по отправке тех или иных сообщений или файлов по принципу (целевая команда > передача результата в постоянный временный файл):

  • отправка выхлопа в виде текста:
ps -a > /home/darkfess/tg-log && \
curl --socks5-basic -x socks5h://<адрес:порт> -U <логин:пароль> \
-X POST https://api.telegram.org/bot<токен>/sendMessage -d chat_id=<чат> -d \
text="$(tail -n 10 /home/darkfess/tg-log)"
  • отправка выхлопа в виде файла:
ps -a > /home/darkfess/tg-log && \
curl --socks5-basic -x socks5h://<адрес:порт> -U <логин:пароль> \
-s -X POST "https://api.telegram.org/bot<токен>/sendDocument" -F chat_id=<чат> -F document="@/home/darkfess/tg-log"
  • cat`им файл целиком (макс размер для отправки файлов ботов 20 мб):
cat /var/log/syslog > /home/darkfess/tg-log && \
curl --socks5-basic -x socks5h://<адрес:порт> -U <логин:пароль> \
-s -X POST "https://api.telegram.org/bot<токен>/sendDocument" -F chat_id=<чат> -F document="@/home/darkfess/tg-log"

6) Окей. Последним штрихом будет универсальный скрипт для отправки с подстановкой параметров (только подставьте ваши переменные вверху). Создаем его и погнали:

nano $HOME/tg-send.sh
#!/bin/bash
# script for sending TEXT/FILE to Telegram
# in Russia, PROXY server is required
#
# Usage: bash tg-send.sh "<text>" or "</path/to/file>"
# ..."folder non-exist" errors may be ignored
#
SENDME=$1
PROXY_SP=<адрес:порт>
PROXY_USER=<логин>
PROXY_PASS=<пароль>
TG_BOT_ID=<токен>
TG_CHAT_ID=<чат>
#
# sending text-message
curl --socks5-basic -x socks5h://$PROXY_SP -U $PROXY_USER:$PROXY_PASS \
-X POST https://api.telegram.org/bot$TG_BOT_ID/sendMessage -d chat_id=$TG_CHAT_ID -d \
text="$SENDME"
#
# sending file-message
cat $SENDME > /tmp/tg-export && \
curl --socks5-basic -x socks5h://$PROXY_SP -U $PROXY_USER:$PROXY_PASS \
-s -X POST https://api.telegram.org/bot$TG_BOT_ID/sendDocument -F chat_id=$TG_CHAT_ID -F \
document=@/tmp/tg-export
#
# cleaning
rm -f /tmp/tg-export

Можете скопировать в текстовом виде: tg-send

Не забудьте также сделать скрипт исполняемым, через:

chmod u+x $HOME/tg-send.sh

Собственно, небольшое readme там уже написано в шапке. Но вот, на всякий случай, несколько примеров использования:

bash tg-send.sh /var/log/syslog
bash tg-send.sh "some text"

Текст отправляем в скобках, к файлам просто указываем полный путь.Там вшито сразу 2-а варианта отправки, в виде текста и файла, поочередно. Поэтому, иногда скрипт может на что-то ругаться на выхлопе (на отсутствие файла, например). Это можно игнорировать, главное чтобы вам приходили ваши логи и уведомления.

Ну вот собственно и все. Вариантов применения данной штуки очень много, все зависит только от вашей больной фантазии. По крайней мере, как минимум, можно избавиться наконец то от назойливых и тормознутых почтовых уведомлений. GL!


=== UPD (26.06.2020) ===

Дополню данную заметку. В связи с разблокировкой телеги в РФ, прикладываю обновленный скрипт (отправка запросов напрямую, без участия прокси-сервера):

nano $HOME/tg-send-noproxy.sh
#!/bin/bash
# script for sending TEXT/FILE to Telegram
#
# Usage: bash tg-send.sh "<text>" or "</path/to/file>"
# ..."folder non-exist" errors may be ignored
#
SENDME=$1
TG_BOT_ID=<токен>
TG_CHAT_ID=<чат>
#
# sending text-message
curl --socks5-basic \
-X POST https://api.telegram.org/bot$TG_BOT_ID/sendMessage -d chat_id=$TG_CHAT_ID -d \
text="$SENDME"
#
# sending file-message
cat $SENDME > /tmp/tg-export && \
curl --socks5-basic \
-s -X POST https://api.telegram.org/bot$TG_BOT_ID/sendDocument -F chat_id=$TG_CHAT_ID -F \
document=@/tmp/tg-export
#
# cleaning
rm -f /tmp/tg-export

Можете скопировать в текстовом виде: tg-send-noproxy

Добавить комментарий