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.
145 lines
3.8 KiB
145 lines
3.8 KiB
#!/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 };
|
|
|