Skip to content

Создание телеграм бота на 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

Запуск бота в IDE

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

Демонстрация работы бота

Запуск на сервере

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