61 lines
2.2 KiB
JavaScript
61 lines
2.2 KiB
JavaScript
import { Router } from "express";
|
|
import { confirmTelegramFromBot } from "../services/auth.service.js";
|
|
|
|
const router = Router();
|
|
|
|
const BOT_TOKEN = process.env.TELEGRAM_BOT_TOKEN;
|
|
const WEBHOOK_SECRET = process.env.TELEGRAM_WEBHOOK_SECRET;
|
|
|
|
async function tgSendMessage(chatId, text) {
|
|
if (!BOT_TOKEN) return;
|
|
try {
|
|
await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ chat_id: chatId, text, parse_mode: "HTML" }),
|
|
});
|
|
} catch (err) {
|
|
console.error("[tg] sendMessage failed", err.message);
|
|
}
|
|
}
|
|
|
|
router.post("/webhook", async (req, res) => {
|
|
// Telegram добавит заголовок если мы установили secret_token при setWebhook
|
|
if (WEBHOOK_SECRET) {
|
|
const got = req.get("x-telegram-bot-api-secret-token");
|
|
if (got !== WEBHOOK_SECRET) {
|
|
console.warn("[tg] webhook: bad secret token");
|
|
return res.status(401).json({ ok: false });
|
|
}
|
|
}
|
|
|
|
// Всегда отвечаем 200 — иначе Telegram будет ретраить
|
|
res.json({ ok: true });
|
|
|
|
try {
|
|
const update = req.body || {};
|
|
const msg = update.message;
|
|
if (!msg || !msg.text || !msg.from || !msg.chat) return;
|
|
|
|
const text = String(msg.text).trim();
|
|
const m = text.match(/^\/start\s+(\S+)/);
|
|
if (!m) {
|
|
// /start без параметра или другая команда — приветствие
|
|
if (text === "/start" || text === "/help") {
|
|
await tgSendMessage(msg.chat.id,
|
|
"Привет! Это бот авторизации <b>One Click</b>.\n\nЧтобы войти на сайт, нажмите кнопку «Войти через Telegram» на сайте — она пришлёт вам сюда специальную ссылку.");
|
|
}
|
|
return;
|
|
}
|
|
|
|
const token = m[1];
|
|
const result = await confirmTelegramFromBot({ token, telegramUser: msg.from });
|
|
|
|
await tgSendMessage(msg.chat.id, result.message || (result.ok ? "Готово!" : "Не получилось войти."));
|
|
} catch (err) {
|
|
console.error("[tg] webhook handler error:", err);
|
|
}
|
|
});
|
|
|
|
export default router;
|