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 бота на сервере