ЯзыкиPython
Telegram API: бот для уведомлений
Существует множество способов отправить уведомление: почта, Skype, WhatsApp, Jabber. WhatsApp не очень люблю, поэтому сразу нет. Сначала использовал Skype, но почему-то библиотека skpy перестала отправлять прямые сообщения от пользователя к пользователю. Потом я попробовал поставить свой xmpp сервер, все работало как надо. Но мне показалось что ради сообщений слишком тяжело иметь свой сервер на java. В итоге решил добить и разобраться с Telegram.
Установка Tor
Но вы же помните Роскомнадзор заблокировал Telegram, поэтому нам понадобится Tor.
Сеть Tor — это система прокси-серверов, позволяющая устанавливать анонимное сетевое соединение. С помощью Tor можно анонимно подключаться к обычным серверам и хостить непрослушиваемые серверы в самой сети Tor.
Создадим файл /etc/apt/sources.list.d/tor.list вот с таким содержанием:
deb https://deb.torproject.org/torproject.org buster main
deb-src https://deb.torproject.org/torproject.org buster main
Далее выполним:
$ curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
$ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -
$ apt update
$ apt install apt-transport-https tor tor-geoipdb torsocks
Создание бота
Прежде чем начинать разработку, бота необходимо зарегистрировать и получить его уникальный id, являющийся одновременно и токеном. Для этого в Telegram существует специальный бот — @BotFather.
Пишем ему /start и получаем список всех его команд.
Первая и главная /newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем.
Для начала работы этого уже достаточно. Особо педантичные могут уже здесь присвоить боту аватар, описание и приветственное сообщение.
Не забудьте проверить полученный токен с помощью ссылки api.telegram.org/bot{TOKEN}/getMe, говорят, не всегда работает с первого раза.
Также необходимо зарегистрировать своё приложение и получить app_id, app_hash. Как это сделать написано тут.
Программирование
Я буду использовать telethon. Во-первых работает, во-вторых есть прикольный метод get_input_entity, он по имени пользователя возвращает его Chat ID. Кстати, чтоб бот отправлял вам сообщения, необходимо боту сначала что-то написать, например, /start.
#!/usr/bin/env python3
# encoding: utf-8
from telethon import TelegramClient, events, sync
import socks
import argparse
def main():
parser = argparse.ArgumentParser(description="Send message to telegram")
parser.add_argument('user', help='User name or chat ID', default=None)
parser.add_argument('message', help='Message', default=None)
args = parser.parse_args()
try:
if not args.user or not args.message:
raise Exception('User or message not specified')
# указываем свои данные от приложения и token бота
api_id = API_ID
api_hash = API_HASH
token = TOKEN
name = token.split(':')[0]
# клиент будет работать через proxy
client = TelegramClient(name, api_id, api_hash, proxy=(socks.SOCKS5, '127.0.0.1', 9050))
client.start(bot_token=token)
if args.user.isdigit():
user_to = args.user
else:
entity = client.get_input_entity(args.user)
user_to = entity.user_id
client.send_message(user_to, args.message)
client.log_out()
print('OK')
except Exception as e:
print(e)
if __name__ == '__main__':
main()
Скрипт на вход получает ID пользователя и текст сообщения, на выходе получаем OK если сообщение удачно отправлено.
Пример использования:
$ send-message.py CHAT_ID_OR_USERNAME "test message"
Пример использования — проверка температуры жёстких дисков на сервере.