You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.8 KiB
146 lines
3.8 KiB
|
4 weeks ago
|
#!/usr/bin/env node
|
||
|
|
/**
|
||
|
|
* Tongge Rest Mode - 休息时间自动回复
|
||
|
|
*
|
||
|
|
* 23:00-07:00 自动回复,模拟人类休息
|
||
|
|
* 紧急关键词可以穿透(如"紧急"、"急事")
|
||
|
|
*/
|
||
|
|
|
||
|
|
const https = require('https');
|
||
|
|
|
||
|
|
const BOT_TOKEN = '8719964249:AAGy4GEqZ1mMOhTKYt5iPD1FcYtpuIDUdCk';
|
||
|
|
const REST_START = 23; // 23:00
|
||
|
|
const REST_END = 7; // 07:00
|
||
|
|
|
||
|
|
// 休息时间回复语料
|
||
|
|
const REST_REPLIES = [
|
||
|
|
"桐哥在睡觉呢~ 明天再聊吧 😴",
|
||
|
|
"夜深了,桐哥去休息啦,有话明天说~",
|
||
|
|
"桐哥已经睡了,留言明天会回复的 🌙",
|
||
|
|
"现在是桐哥的休息时间,明天找你聊哦~",
|
||
|
|
"桐哥充电中🔋,明天满血复活再聊!",
|
||
|
|
];
|
||
|
|
|
||
|
|
// 可以穿透休息模式的关键词
|
||
|
|
const URGENCY_KEYWORDS = ['紧急', '急事', '救命', 'help', 'emergency'];
|
||
|
|
|
||
|
|
// 获取香港时区的小时 (UTC+8)
|
||
|
|
function getHKHour() {
|
||
|
|
const now = new Date();
|
||
|
|
const utcHour = now.getUTCHours();
|
||
|
|
const hkHour = (utcHour + 8) % 24;
|
||
|
|
return hkHour;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 检查是否在休息时间(香港时区)
|
||
|
|
function isRestTime() {
|
||
|
|
const hour = getHKHour();
|
||
|
|
return hour >= REST_START || hour < REST_END;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 检查消息是否紧急
|
||
|
|
function isUrgent(message) {
|
||
|
|
return URGENCY_KEYWORDS.some(keyword =>
|
||
|
|
message.toLowerCase().includes(keyword.toLowerCase())
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取随机休息回复
|
||
|
|
function getRestReply() {
|
||
|
|
return REST_REPLIES[Math.floor(Math.random() * REST_REPLIES.length)];
|
||
|
|
}
|
||
|
|
|
||
|
|
// 发送 Telegram 消息
|
||
|
|
function sendMessage(chatId, text) {
|
||
|
|
return new Promise((resolve, reject) => {
|
||
|
|
const data = JSON.stringify({
|
||
|
|
chat_id: chatId,
|
||
|
|
text: text,
|
||
|
|
});
|
||
|
|
|
||
|
|
const options = {
|
||
|
|
hostname: 'api.telegram.org',
|
||
|
|
port: 443,
|
||
|
|
path: `/bot${BOT_TOKEN}/sendMessage`,
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
'Content-Length': data.length,
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
const req = https.request(options, (res) => {
|
||
|
|
let body = '';
|
||
|
|
res.on('data', (chunk) => body += chunk);
|
||
|
|
res.on('end', () => {
|
||
|
|
resolve(JSON.parse(body));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
req.on('error', reject);
|
||
|
|
req.write(data);
|
||
|
|
req.end();
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Webhook 处理器(如果部署为 webhook)
|
||
|
|
async function handleWebhook(req, res) {
|
||
|
|
let body = '';
|
||
|
|
req.on('data', chunk => body += chunk);
|
||
|
|
req.on('end', async () => {
|
||
|
|
try {
|
||
|
|
const update = JSON.parse(body);
|
||
|
|
const message = update.message;
|
||
|
|
|
||
|
|
if (!message) {
|
||
|
|
res.writeHead(200);
|
||
|
|
res.end('OK');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const chatId = message.chat.id;
|
||
|
|
const text = message.text || '';
|
||
|
|
|
||
|
|
// 检查是否在休息时间
|
||
|
|
if (isRestTime()) {
|
||
|
|
// 检查是否紧急
|
||
|
|
if (isUrgent(text)) {
|
||
|
|
console.log(`[URGENT] Message from ${chatId}: ${text}`);
|
||
|
|
// 紧急消息,正常转发给桐哥(不拦截)
|
||
|
|
res.writeHead(200);
|
||
|
|
res.end('OK');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 发送休息回复
|
||
|
|
const reply = getRestReply();
|
||
|
|
await sendMessage(chatId, reply);
|
||
|
|
console.log(`[REST] Replied to ${chatId}: ${reply}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
res.writeHead(200);
|
||
|
|
res.end('OK');
|
||
|
|
} catch (error) {
|
||
|
|
console.error('[ERROR]', error);
|
||
|
|
res.writeHead(500);
|
||
|
|
res.end('Error');
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 命令行模式:检查配置
|
||
|
|
if (require.main === module) {
|
||
|
|
console.log('Tongge Rest Mode Configuration:');
|
||
|
|
console.log(` Rest Start: ${REST_START}:00`);
|
||
|
|
console.log(` Rest End: ${REST_END}:00`);
|
||
|
|
console.log(` Current Time: ${new Date().toTimeString().slice(0, 5)}`);
|
||
|
|
console.log(` Is Rest Time: ${isRestTime() ? 'YES' : 'NO'}`);
|
||
|
|
console.log(` Urgency Keywords: ${URGENCY_KEYWORDS.join(', ')}`);
|
||
|
|
|
||
|
|
if (isRestTime()) {
|
||
|
|
console.log(`\nSample Reply: ${getRestReply()}`);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = { isRestTime, isUrgent, getRestReply, sendMessage, handleWebhook };
|