91 lines
3.2 KiB
JavaScript
91 lines
3.2 KiB
JavaScript
|
||
// 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}`);
|
||
}); |