返回首页

Max.ru 的 MVP 机器人:长轮询和回复映射

本文描述了使用 Node.js、长轮询和 SQLite 为 Max.ru 创建 MVP 反馈机器人的过程。实现了回复映射逻辑,用于路由管理员响应。提供了数据库初始化和事件处理的完整代码。

Max.ru 机器人:从安装到回复逻辑
Advertisement 728x90

基于长轮询与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等工具。

Google AdInline article slot

SQLite非常适合MVP:它是基于文件的数据库,无需独立服务器,延迟极低,请求处理稳定可靠。

安装依赖项:

npm init -y
npm install @maxhub/max-bot-api sqlite sqlite3 dotenv

创建.env文件:

Google AdInline article slot
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的映射关系。

Google AdInline article slot

处理客户端消息

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

Advertisement 728x90

继续阅读