Как создать калькулятор на 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)^2sqrt(16)sin(90 deg)log(1000, 10)
Загрузка комментариев...