// backend/bot.js // ─────────────────────────────────────────────────────────────────────────────── // 1) Устанавливаем зависимости: // npm install express body-parser node-telegram-bot-api // // 2) Запуск: // node bot.js // (или: npx nodemon bot.js — для auto-reload при изменениях) // ─────────────────────────────────────────────────────────────────────────────── const express = require('express'); const bodyParser = require('body-parser'); const TelegramBot = require('node-telegram-bot-api'); const crypto = require('crypto'); // Загружаем переменные окружения const config = require('./config/env'); // Импортируем маршруты API const apiRoutes = require('./routes/api'); const app = express(); const HTTP_PORT = config.HTTP_PORT; const BOT_TOKEN = config.BOT_TOKEN; const WEBAPP_BASE_URL = config.WEBAPP_BASE_URL; // 1) Запускаем бота (polling) const bot = new TelegramBot(BOT_TOKEN, { polling: true }); // Сохраняем бота в app.locals для использования в роутах app.locals.bot = bot; // 3) Разрешаем CORS для фронтенда app.use((req, res, next) => { const origin = req.headers.origin; if (config.CORS_ORIGINS.includes('*') || (origin && config.CORS_ORIGINS.includes(origin))) { res.header('Access-Control-Allow-Origin', origin || '*'); } res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); }); // 4) JSON-парсер (не обязателен для multipart/form-data) app.use(bodyParser.json()); // 5) Подключаем API маршруты app.use('/api', apiRoutes); // 6) Команда /menu — отправляем inline-кнопку с chat_id bot.setMyCommands([ { command: 'menu', description: 'Открыть калькулятор' }, ]); bot.onText(/\/menu/, (msg) => { try { const chatId = msg.chat.id; // По умолчанию открываем калькулятор мыла const url = `${WEBAPP_BASE_URL}/soap?chat_id=${chatId}`; bot.sendMessage( chatId, 'Нажмите кнопку ниже, чтобы открыть калькулятор:', { reply_markup: { inline_keyboard: [ [ { text: 'Открыть калькулятор мыла', web_app: { url }, }, ], ], }, } ); } catch (err) { console.error('Ошибка в обработчике /menu:', err); } }); // 7) Ловим ошибки polling-а и логируем детали bot.on('polling_error', (err) => { console.error('Polling error:', err); }); // 8) Запускаем Express-сервер на порту 3001 app.listen(HTTP_PORT, () => { console.log(`Bot+API запущены, слушаем порт ${HTTP_PORT}`); });