最小限のTelegramボットを作るのは驚くほど簡単だ。まず、ボット[@BotFather](https://t.me/botfather)に連絡して、新しいボットを登録し、認証トークンを取得する。(ボットのトークンは、ボット固有の識別子であると同時に、ボットにアクセスするための「パスワード」でもある。あなたのスクリプトがどのボットを操作するのかをシステムに伝えると同時に、そのボットがあなたのものであることを確認するために使用します）。

ボット」という言葉は、微妙に異なる意味で使われていることに注意したい。Telegramの観点では、ボットはアカウントである（ユーザーアカウントはメッセージを送信できる「アドレス」であるようなものだ）。この意味で、トークンの取得に成功すれば、あなたはすでに「ボットを作った」ことになる（おめでとう！）。しかし、そのようなボット（人間のいないユーザーアカウントのようなもの）は、何のアクションも実行できません（それは「誰も住んでいないフラット」です）。何らかの機能を実装するには、特別なAPIを使ってTelegramに接続し、アクション（ユーザーのメッセージを処理したり、自分自身のメッセージを生成したりなど）を実行するプログラム（たとえばPythonスクリプト）が必要です。このようなプログラムは、あなたのようにボットと呼ぶこともできます（また、「ユーザー」という言葉は、アカウントを指すこともあれば、人を指すこともあります）。通常は混同することはありません（文脈から意味は明らかです）が、この用語のニュアンスだけは覚えておいてください。

さて、TelegramボットAPIとの連携を容易にするPythonライブラリのいずれかを選択する必要がある。(原則的には、APIに直接アクセスすれば特別なライブラリは必要ないが、車輪の再発明に貴重な時間を費やす必要はないだろう。) 選択肢はかなり多く、ここにリストがある[公式サイトより](https://core.telegram.org/bots/samples)。


> - **python-telegram-bot**。拒否できないラッパー。
> https://github.com/python-telegram-bot/python-telegram-bot
>
> - **pyTelegramBotAPI**.Telegram Bot API のシンプルだが拡張可能な Python 実装。
> https://github.com/eternnoir/pyTelegramBotAPI
>
> - **AIOGram**.asyncioとaiohttpで書かれたTelegram Bot APIのための非常にシンプルで完全な非同期ライブラリ。
> https://github.com/aiogram/aiogram
>
> > - **TGramBot**.部分的に自動生成された非同期の Minimal Telegram Bot API フレームワーク。
> https://github.com/KeralaBots/TGramBot
>
> > - **OrigamiBot**.Pythonic Telegram Bot API ライブラリ。
> https://github.com/cmd410/OrigamiBot
>
> - **pytgbot**.Telegram Bot API にアクセスするためのモジュールです。
> https://github.com/luckydonald/pytgbot
>
> - **teleflask**。flaskと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` （数字を2つ足す）を実行できるようになりました - 試してみてください！（スクリプトは通常のメッセージには反応しません。）あとはあなた次第です。(リストをざっと見ただけで、何をどこに追加するかはもう想像がつくでしょう）。

もちろん、"hello world"（または "parrot"）以上のことをするには、ドキュメントを読む必要があるだろう。しかしそれでも、50行程度のスクリプトが手元にあれば、最初の慣らしやさらなる実験に非常に役立つ。

しかし、メッセージを受け取って、それを何らかの方法で処理して（例えば、別の言語に翻訳するとか）、その結果をユーザーに返すだけなら、この例で十分です。;-)
Сделать минимального 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` нужное вам преобразование. ;-)