Как создать калькулятор на grammY
Уровень сложности: 2 из 10
Что вы изучите: парсинг строк, выполнение простых математических операций
Задача
Создать Telegram-бота, который принимает на вход простые арифметические выражения (например, 2+3
, 5*7
) и возвращает результат их вычисления.
Шаг 1: Заготовка
Вот минимальная структура бота:
const { Bot } = require("grammy");
const bot = new Bot("ВАШ_ТОКЕН_ЗДЕСЬ");
// Здесь будет логика калькулятора
bot.start();
Шаг 2: Обработка текстовых сообщений
Добавьте обработчик для текстовых сообщений. В нём будет выполняться разбор и вычисление выражения:
bot.on("message:text", async (ctx) => {
const expression = ctx.message.text;
// Проверяем, что сообщение содержит только цифры и допустимые операторы
if (/^\d+[\+\-\*\/]\d+$/.test(expression)) {
try {
const result = eval(expression); // Вычисляем выражение
await ctx.reply(`Результат: ${result}`);
} catch (e) {
await ctx.reply("Ошибка при вычислении.");
}
} else {
await ctx.reply("Пожалуйста, отправьте простое выражение, например: 2+3");
}
});
⚠️ Использование
eval()
в реальных проектах может быть небезопасным. В этом уроке он подходит, так как мы строго проверяем формат ввода.
Что происходит в этом коде?
Бот:
- Получает текстовое сообщение от пользователя.
- Проверяет его с помощью регулярного выражения: должно быть два числа, соединённых одним из знаков
+
,-
,*
или/
. - Если формат верен, выражение вычисляется с помощью
eval()
. - Результат отправляется пользователю.
Объяснение кода
Регулярное выражение ^\d+[\+\-\*\/]\d+$
Это шаблон для проверки строки:
\d+
— одна или несколько цифр[+\-*/]
— один из арифметических операторов^
и$
— начало и конец строки (гарантируют, что строка не содержит лишнего)
Функция eval()
Метод eval()
выполняет строку как JavaScript-код. В данном случае он подходит, потому что мы заранее ограничили формат ввода.
⚠️ Важно: в реальных приложениях лучше использовать специальные парсеры или библиотеки для безопасного вычисления выражений.
Идеи для улучшения бота
Вы можете улучшить бота, добавив:
- Обработку пробелов в выражении
- Поддержку более сложных выражений
- Сообщения об ошибках при делении на ноль
Документация
Ссылки на руководства
Регулярные выражения в JavaScript: как они устроены и для чего нужны Skillbox Media
Eval: выполнение строки кода Javascript.ru
Как создать калькулятор на grammY с помощью библиотеки math.js
Поскольку использование eval()
для вычисления математических выражений может быть небезопасным и непредсказуемым, особенно при обработке пользовательского ввода, гораздо лучше использовать специализированные библиотеки — например, math.js.
Эта мощная и гибкая библиотека предназначена специально для работы с математическими операциями в JavaScript. Она позволяет безопасно вычислять как простые арифметические выражения, так и сложные формулы с функциями, скобками, степенями и даже комплексными числами.
Шаг 1: Установка зависимостей
Для начала установите необходимые пакеты:
npm install grammy math
Шаг 2: Подготовка бота
Создайте файл bot.js
и добавьте следующий код:
const { Bot } = require("grammy");
const math = require("mathjs");
const bot = new Bot("ВАШ_ТОКЕН_ЗДЕСЬ");
// Здесь будет логика обработки сообщений
bot.start();
Шаг 3: Обработка текстовых сообщений
Добавьте обработчик для текстовых сообщений. Он будет использовать math.evaluate()
для вычисления выражений:
bot.on("message:text", async (ctx) => {
const expression = ctx.message.text.trim();
try {
// Вычисляем выражение с помощью math.js
const result = math.evaluate(expression);
await ctx.reply(`Результат: ${result}`);
} catch (e) {
await ctx.reply("Не удалось вычислить выражение. Проверьте правильность ввода.");
}
});
Что происходит в этом коде?
Бот:
- Получает текстовое сообщение от пользователя.
- Пробует вычислить его с помощью
math.evaluate()
. - Отправляет результат пользователю или сообщает о ошибке.
Преимущества math.js
- Поддерживает сложные выражения: скобки, степени, функции (
sin
,cos
,sqrt
и т.д.) - Безопаснее использования
eval()
из JavaScript - Может работать с массивами, матрицами, переменными и многим другим
Возможные выражения
2 + 3 * 4
(2+3)^2
sqrt(16)
sin(90 deg)
log(1000, 10)