Сделать минимального Telegram-бота на удивление просто. Прежде всего следует обратиться к боту [@BotFather](https://t.me/botfather) для регистрации нового бота и получения его токена аутентификации. (Токен бота — его уникальный идентификатор и одновременно «пароль» для получения доступа к боту. С его помощью вы сообщаете системе, каким ботом будет управлять ваш скрипт и одновременно подтверждаете, что бот принадлежит вам.)

Отмечу, что слово «бот» употребляется в немного разных смыслах. С точки зрения Telegram, бот — это учётная запись (как учётка пользователя — «адрес», на который ему можно отправлять сообщения). В этом смысле, успешно получив токен, вы уже «сделали бота» (поздравляю!). Но такой бот (как и учётная запись пользователя без самого пользователя-человека) не может производить никаких действий (это «квартира, в которой никто не живёт»). Чтобы реализовать какую-то функциональность, нужна программа (например, Python-скрипт), которая будет подключаться к Telegram с использованием специального API и выполнять действия (обрабатывать сообщения пользователей, генерировать собственные и т. п.). Такую программу тоже можно называть ботом, как вы это делаете (да и слово «пользователь» иногда обозначает учётную запись, а иногда человека). Путаницы обычно не возникает (значение понятно из контекста), просто имейте в виду этот терминологический нюанс.

Теперь стоит выбрать одну из Python-библиотек, облегчающих работу с API Telegram-бота. (В принципе, вы можете обойтись и без специальной библиотеки, обращаясь к API напрямую, но зачем же тратить драгоценное время на изобретение велосипеда?) Вариантов довольно много, вот список [с официального сайта](https://core.telegram.org/bots/samples).


> - **python-telegram-bot**. A wrapper you can't refuse.
> https://github.com/python-telegram-bot/python-telegram-bot
>
> - **pyTelegramBotAPI**. A simple, but extensible Python implementation for the Telegram Bot API.
> https://github.com/eternnoir/pyTelegramBotAPI
>
> - **AIOGram**. A pretty simple and fully asynchronous library for Telegram Bot API written with asyncio and aiohttp.
> https://github.com/aiogram/aiogram
>
> - **TGramBot**. A partially auto-generated and asynchronous Minimal Telegram Bot API framework.
> https://github.com/KeralaBots/TGramBot
>
> - **OrigamiBot**. A pythonic Telegram bot API library.
> https://github.com/cmd410/OrigamiBot
>
> - **pytgbot**. A module to access the Telegram Bot API.
> https://github.com/luckydonald/pytgbot
>
> - **teleflask**. A framework based on flask and pytgbot.
> https://github.com/luckydonald/teleflask

Предположим, вы выбрали OrigamiBot (а что? красивое название!). Теперь копируете их миниатюрный учебный пример из документации (для удобства привожу его ниже) в пустой Python-скрипт, запускаете — и празднуете создание вашего первого (функционирующего!) бота. (Не забудьте указать токен в качестве пораметра командной строки или в ответ на запрос скрипта.)


```python
from sys import argv
from time import sleep

from origamibot import OrigamiBot as Bot
from origamibot.listener import Listener


class BotsCommands:
    def __init__(self, bot: Bot):  # Can initialize however you like
        self.bot = bot

    def start(self, message):  # /start command
        self.bot.send_message(message.chat.id, "Hello user!\nThis is an example bot.")

    def echo(self, message, value: str):  # /echo [value: str] command
        self.bot.send_message(message.chat.id, value)

    def add(self, message, a: float, b: float):  # /add [a: float] [b: float]
        self.bot.send_message(message.chat.id, str(a + b))

    def _not_a_command(self):  # This method not considered a command
        print("I am not a command")


class MessageListener(Listener):  # Event listener must inherit Listener
    def __init__(self, bot):
        self.bot = bot
        self.m_count = 0

    def on_message(self, message):  # called on every message
        self.m_count += 1
        print(f"Total messages: {self.m_count}")

    def on_command_failure(self, message, err=None):  # When command fails
        if err is None:
            self.bot.send_message(message.chat.id, "Command failed to bind arguments!")
        else:
            self.bot.send_message(message.chat.id, "Error in command:\n{err}")


if __name__ == "__main__":
    token = argv[1] if len(argv) > 1 else input("Enter bot token: ")
    bot = Bot(token)  # Create instance of OrigamiBot class

    # Add an event listener
    bot.add_listener(MessageListener(bot))

    # Add a command holder
    bot.add_commands(BotsCommands(bot))

    # We can add as many command holders
    # and event listeners as we like

    bot.start()  # start bot's threads
    while True:
        sleep(1)
        # Can also do some useful work i main thread
        # Like autoposting to channels for example
```

Теперь (пока запущен скрипт) ваш бот умеет выполнять команды `/start` (приветствует), `/echo` (выводит сообщение) и `/add` (складывает два числа) — попробуйте! (На обычные сообщения скрипт не реагирует, только считает, сколько их пришло.) Дальше всё в ваших руках. (Если вы бегло просмотрели листинг, то уже догадываетесь, что и куда нужно добавлять).

Конечно, чтобы сделать что-то большее, чем «hello world» (или «попугая»), придётся, вероятно, почитать документацию. Но всё-таки иметь под рукой работающий скрипт в полсотни строк бывает очень полезно для начального знакомства и дальнейшего экспериментирования.

Впрочем, если вам достаточно получать сообщение, обрабатывать его каким-то образом (например, переводить на другой язык?) и возвращать пользователю результат, то этого примера вам достаточно, просто добавьте в метод `on_message` нужное вам преобразование. ;-)
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence