基于长轮询与SQLite构建Max.ru反馈机器人MVP
Max.ru为开发者提供其Bot API,用于创建交互式工具。本MVP反馈机器人采用Node.js配合@maxhub/max-bot-api库及SQLite实现。长轮询技术使本地开发无需依赖Webhook、服务器或HTTPS。
核心挑战在于管理员回复时如何识别原始用户。回复消息中包含指向原消息mid的链接,我们可通过数据库将响应准确映射回对应用户。
技术选型与项目初始化
@maxhub/max-bot-api库原生支持长轮询,开发阶段无需ngrok或Cloudflare Tunnel等工具。
SQLite非常适合MVP:它是基于文件的数据库,无需独立服务器,延迟极低,请求处理稳定可靠。
安装依赖项:
npm init -y
npm install @maxhub/max-bot-api sqlite sqlite3 dotenv
创建.env文件:
BOT_TOKEN=your_token_here
OWNER_ID=12345678
Token在business.max.ru中生成,OWNER_ID为您的个人Max用户ID。
初始化SQLite与数据库结构
使用异步连接并创建用于映射的reply_map表:
import { open } from 'sqlite';
import sqlite3 from 'sqlite3';
let db;
(async () => {
db = await open({ filename: './database.sqlite', driver: sqlite3.Database });
await db.exec(`
CREATE TABLE IF NOT EXISTS reply_map (
owner_msg_mid TEXT PRIMARY KEY,
client_user_id INTEGER
)
`);
console.log('数据库已准备就绪');
})();
该表用于存储owner_msg_mid到client_user_id的映射关系。
处理客户端消息
message_created事件检查发送者。非管理员消息将以Markdown格式转发给管理员:
const ownerId = Number(process.env.OWNER_ID);
bot.on('message_created', async (ctx) => {
const msg = ctx.message;
const senderId = msg.sender.user_id;
const text = msg.body.text;
if (senderId !== ownerId) {
const forwardText = `📩 **来自 ${msg.sender.first_name} 的消息** (ID: ${senderId}):
${text}`;
const sentMsg = await bot.api.sendMessageToUser(ownerId, forwardText, { format: 'markdown' });
if (sentMsg && sentMsg.body && sentMsg.body.mid) {
await db.run('INSERT OR REPLACE INTO reply_map (owner_msg_mid, client_user_id) VALUES (?, ?)',
[sentMsg.body.mid, senderId]);
}
return;
}
// 回复逻辑
});
发送消息的mid会被存入reply_map表,用于后续路由。
管理员回复逻辑
回复消息包含link.type = 'reply'和link.message.mid——即原始消息ID。要找到对应客户端:
- 若
link.type === 'reply':提取repliedMsgMid,查询数据库。 - 使用
client_user_id将回复发送回客户端。 - 向管理员确认已送达。
示例回复JSON结构:
{
"body": { "text": "answer", ... },
"sender": { ... },
"link": {
"type": "reply",
"message": {
"mid": "mid.original_message..."
}
}
}
该架构的优势
- 本地开发便捷:直接运行
npm start,无需配置端口或SSL。 - 无缝回复体验:管理员可使用标准回复功能,操作自然流畅。
- 数据库简洁:仅一个文件(
database.sqlite),备份轻松。 - 易于扩展:随着流量增长,可轻松迁移到PostgreSQL。
关键总结
- 长轮询显著简化MVP开发,无需复杂Webhook部署。
- SQLite的
reply_map确保回复精准路由。 - 转发消息中使用Markdown,清晰标注客户姓名与ID,提升可读性。
- 回复容错机制:若无法匹配,系统自动使用最近活跃的客户作为默认接收方。
— Editorial Team
暂无评论。