Языки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"

Пример использования — проверка температуры жёстких дисков на сервере.

Loading...