Appearance
Создание телеграм бота на python и aiogram
Введение
Пока все пишут echo бота, который не несёт в себе никакой пользы, мы напишем калькулятор. Саму логику калькулятора писать не будем, а воспользуемся готовым решением, сосредоточившись на написании кода бота.
Ознакомиться с работой бота @bestserver_calculator_bot
Подготовка окружение
Для начала нам понадобится редактор для написания кода. Можете использовать свой любимый, но если такого нет - рекомендуем PyCharm. Как его установить можно почитать в статье Установка PyCharm
Так же нам понадобится установить сам Python. Версия не старше 3.8. Если используете PyCharm, то она сам скачает и установит Python. Подробности в статье Установка Python
Создание проекта
Создадим новый пустой проект:

- В поле Location указываем путь к папке где будут храниться файлы проекта. Можно оставить как есть, но желательно указать имя папки
calculator-bot. Оно же будет именем проекта - В Base interpreter выбираем
python3.8или выше - Если есть поле Environment type - выбираем
Virtualenv - Остальные поля оставляем как есть
- Нажимаем Create
PyCharm создаст для нас файлы main.py и папку vevn: 
В файл main.py будет писать код нашего бота, а в папке venv размещаются подключённые к проекту библиотеки (зависимости)
Создание бота
Нужно открыть бота @BotFather, в нём создать бота и получить токен. Подробнее: Регистрация телеграм бота
Подключение зависимостей
Первым делом нам понадобится подключить aiogram. aiogram - это фреймворк на языке python, который помогает легко создавать ботов для телеграма и подключаться к Telegram Bot API без
Открываем терминал (Alt+F12 в PyCharm) и вводим команду:
shell
./venv/bin/pip install aiogramДля Windows:
shell
.\venv\Scripts\pip install aiogramЕщё нам понадобится библиотека которая, будет выполнять математические операции. Называется она sympy , устанавливается аналогичной командой:
shell
./venv/bin/pip install sympyДля Windows:
shell
.\venv\Scripts\pip install sympyИ чтобы в будущем не иметь проблем с версий зависимостей фиксируем их версии в файл:
shell
./venv/bin/pip freeze > requirements.txtДля Windows:
shell
.\venv\Scripts\pip freeze > requirements.txtНаписание кода
Для начала берём минимальный шаблон для запуска бота на aiogram:
python
import asyncio
from aiogram import Bot, Dispatcher, F
bot = Bot(token="6814421330:AAEd6xBo5CPh3XgbAsqezKerLv0n9OsEnf8")
dp = Dispatcher()
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())В параметр token вставляем свой ключ, полученный от @BotFather
Затем нужно обработать сообщение /start от пользователя. Добавляем следующий код до функции main:
python
from aiogram.filters.command import Command
from aiogram.types import Message
@dp.message(Command("start"))
async def cmd_start(message: Message):
text = "Привет. Я калькулятор. Пришли что нужно посчитать, например `2+2*2`"
await message.answer(text, parse_mode='markdown')Этот под при нажатии пользователем кнопки Start в боте будет отправлять ему приветственное сообщение их строки text.
Теперь добавим основную функцию калькулятора. При получении любого сообщения от пользователя будем брать его текст и отправлять в библиотеку sympy для подсчёта.
python
import sympy
@dp.message(F.text)
async def message(message: Message):
text = message.text
res = sympy.sympify(text)
await message.answer(res)Добавим проверку на случай ввода не корректных выражений:
python
@dp.message(F.text)
async def message(message: Message):
text = message.text
try:
res = sympy.sympify(text)
if res.is_Number:
res = str(res)
else:
res = "Не удалось вычислить выражение"
except (sympy.SympifyError, SyntaxError):
res = "Не удалось вычислить выражение"
await message.answer(res)Итоговый код
После выполнения предыдущих шагов должен получиться такой код. Дополнен комментариями для лучшего поинмания.
python
# Импорт зависимостей
import asyncio
import sympy
from aiogram import Bot, Dispatcher, F
from aiogram.filters.command import Command
from aiogram.types import Message
# Инициализация бота
bot = Bot(token="6814421330:AAEd6xBo5CPh3XgbAsqezKerLv0n9OsEnf8")
# Инициализация диспетчера сообщений
dp = Dispatcher()
# Обработка команды start
@dp.message(Command("start"))
async def cmd_start(message: Message):
text = "Привет. Я калькулятор. Пришли что нужно посчитать, например `2+2*2`"
await message.answer(text, parse_mode='markdown')
# Обработка текстовых сообщений
@dp.message(F.text)
async def message(message: Message):
# Получаем текст сообщения
text = message.text
try:
# Считаем результат
res = sympy.sympify(text)
# Проверяем что результат число
if res.is_Number:
res = str(res)
else:
res = "Не удалось вычислить выражение"
except (sympy.SympifyError, SyntaxError):
res = "Не удалось вычислить выражение"
# Отправляем ответ
await message.answer(res)
# Запуск пуллинга новых сообщений
async def main():
await dp.start_polling(bot)
# Запуск все нашей программы
if __name__ == "__main__":
asyncio.run(main())INFO
Хорошим тоном считается хранить токен бота отдельно от исходного кода. Чаще всего делается это при помощи плагина python-dotenv
Запуск
Запускаем бота в IDE нажатием кнопки Run

Переходим в бота (у нас @bestserver_calculator_bot) и проверяем:

Запуск на сервере
Для круглосуточной работы бота независимо он нашего компьютера его нужно запустить на сервере, который будет включён в сеть 24/7. Подробнее в статье Запуск aiogram бота на сервере
