如何在node-telegram-bot-api中实现用户消息延迟,避免按钮重复点击致机器人冻结
解决方案
你需要的用户级请求限频可以通过手动实现冷却时间逻辑实现,不需要引入额外依赖,实现方式如下:
实现思路
给每个用户独立设置命令触发冷却时间,用户每次触发命令时先校验距离上一次成功执行的间隔是否达到要求,冷却期内的请求直接忽略,避免重复执行发送逻辑。
代码实现
1. 定义全局存储和冷却规则
在你的代码全局作用域添加以下内容:
// 存储每个用户最后一次成功触发命令的时间戳 const userLastActionMap = {}; // 冷却时长,单位为毫秒,可根据需求调整,此处设为2秒 const ACTION_COOLDOWN = 2000;
2. 修改命令处理逻辑
调整原有的/start命令判断逻辑,加入冷却校验:
if (text === '/start') { const currentTime = Date.now(); // 校验用户是否处于冷却期 if (userLastActionMap[chatId] && currentTime - userLastActionMap[chatId] < ACTION_COOLDOWN) { // 冷却期内直接返回,不执行任何操作,避免重复发消息 return; } // 更新用户最后一次操作时间 userLastActionMap[chatId] = currentTime; return bot.sendMessage(chatId, 'hello', keyboardMain); }
3. 可选:优化内存占用
如果机器人用户量较大,可添加定时清理逻辑,避免长期运行后内存占用过高:
// 每小时清理一次24小时内无操作的用户记录 setInterval(() => { const expireTime = Date.now() - 24 * 60 * 60 * 1000; for (const userId in userLastActionMap) { if (userLastActionMap[userId] < expireTime) { delete userLastActionMap[userId]; } } }, 60 * 60 * 1000);
额外优化建议
如果需要给用户明确的操作提示,可在冷却期判断分支中仅发送1次提示,注意不要每次拦截都发提示,否则仍会出现刷屏问题;如果是分布式部署的机器人,可以把userLastActionMap换成Redis存储,实现跨实例的全局限流。
内容的提问来源于stack exchange,提问作者bandera
相关产品推荐
相关产品推荐

