Files
sms-otp-gateway/server.js
Vassiliy Yegorov 7906bf786b
All checks were successful
Build SMS Gateway / Build image (push) Successful in 20s
fix balance end
2026-02-02 06:25:30 +07:00

119 lines
3.2 KiB
JavaScript

const express = require("express");
const fs = require("fs");
const path = require("path");
const app = express();
const PORT = process.env.PORT || 3000;
const BASE_FILE = path.join(__dirname, "data", "base.json");
const BASE_PATH = (process.env.BASE_PATH || "/").replace(/\/$/, "") || "/";
// Auth credentials from environment
const AUTH_LOGIN = process.env.SMS_LOGIN;
const AUTH_PASSWORD = process.env.SMS_PASSWORD;
// Router for all endpoints
const router = express.Router();
// Middleware
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// Ensure data directory and base.json exist
function ensureBaseFile() {
const dataDir = path.dirname(BASE_FILE);
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
if (!fs.existsSync(BASE_FILE)) {
fs.writeFileSync(BASE_FILE, JSON.stringify({ messages: [] }, null, 2));
}
}
// Read messages from base.json
function readMessages() {
ensureBaseFile();
const data = fs.readFileSync(BASE_FILE, "utf8");
return JSON.parse(data).messages;
}
// Write messages to base.json
function writeMessages(messages) {
ensureBaseFile();
fs.writeFileSync(BASE_FILE, JSON.stringify({ messages }, null, 2));
}
// POST /send-msg - receive and log SMS
router.post("/send", (req, res) => {
const { login, psw, phones, mes } = req.body;
if (!login || !psw || !phones || !mes) {
return res.json({ error: "Отсутствуют обязательные параметры", error_code: 1 });
}
// Validate credentials
if (login !== AUTH_LOGIN || psw !== AUTH_PASSWORD) {
return res.json({ error: "Ошибка авторизации", error_code: 2 });
}
const message = {
id: Date.now(),
timestamp: new Date().toISOString(),
login,
phone: phones,
message: mes,
};
const messages = readMessages();
messages.push(message);
writeMessages(messages);
console.log(`[${message.timestamp}] SMS to ${phones}: ${mes}`);
res.json({ id: message.id, cnt: 1 });
});
// GET /view-all-sms - view all logged messages
router.get("/view-all-sms", (req, res) => {
const messages = readMessages();
res.json({ messages });
});
// POST /clear-all-sms - clear all messages
router.post("/clear-all-sms", (req, res) => {
writeMessages([]);
console.log("All messages cleared");
res.json({ status: "ok", message: "All messages cleared" });
});
// GET /balance - get account balance (SMSC API compatible)
router.get("/balance.php", (req, res) => {
const { login, psw } = req.query;
if (!login || !psw) {
return res.json({ error: "Отсутствуют обязательные параметры", error_code: 1 });
}
if (login !== AUTH_LOGIN || psw !== AUTH_PASSWORD) {
return res.json({ error: "Ошибка авторизации", error_code: 2 });
}
res.json({ balance: "1000.00" });
});
// Serve static files
router.use(express.static(path.join(__dirname, "public")));
// GET / - serve main page
router.get("/", (req, res) => {
res.sendFile(path.join(__dirname, "public", "index.html"));
});
// Mount router at BASE_PATH
app.use(BASE_PATH, router);
// Initialize and start server
ensureBaseFile();
app.listen(PORT, () => {
console.log(`SMS OTP Gateway running on port ${PORT}, base path: ${BASE_PATH}`);
});