Node.js Telegraf开发Telegram反馈机器人群组回复失效求助
问题原因
原有代码存在两个核心限制导致群组场景失效:
- 回复转发逻辑绑定了强制管理员校验,非管理员用户在群组内回复消息时,无法触发向原反馈人发送内容的逻辑
- 未对聊天场景做区分,群组内的消息交互没有适配放开权限的规则
修复后完整代码
const bot = new Telegraf(token, {}); let replyText = { 'helloAdmin': '...', 'helloUser': '...', 'replyWrong': '....' }; const ADMIN_ID = admin; // 判断是否为管理员 let isAdmin = userId => { return userId === ADMIN_ID; }; // 判断当前聊天是否为群组类型 let isGroupChat = ctx => { return ['group', 'supergroup'].includes(ctx.chat.type); }; // 转发普通用户消息到管理员 let forwardToAdmin = ctx => { if (isAdmin(ctx.message.from.id)) { // 群组场景下管理员发的非回复消息不需要提示错误,直接跳过即可 if (!isGroupChat(ctx)) { ctx.reply(replyText.replyWrong); } return; } ctx.forwardMessage(ADMIN_ID, ctx.from.id, ctx.message.id); }; bot.start(ctx => { ctx.reply(isAdmin(ctx.message.from.id) ? replyText.helloAdmin : replyText.helloUser); }); bot.on('message', ctx => { // 校验是否为回复机器人转发的反馈消息 const isReplyToForwardedMsg = ctx.message.reply_to_message && ctx.message.reply_to_message.forward_from; if (isReplyToForwardedMsg) { const targetUserId = ctx.message.reply_to_message.forward_from.id; // 私聊场景仅允许管理员回复,群组场景放开所有用户回复权限 if (isGroupChat(ctx) || isAdmin(ctx.message.from.id)) { ctx.telegram.sendCopy(targetUserId, ctx.message); // 可选:群组内回复成功后给个提示,不需要可以删掉 ctx.reply(`已将你的回复发送给原反馈用户`, { reply_to_message_id: ctx.message.id }); return; } } // 非回复触发场景走原有转发逻辑 forwardToAdmin(ctx); }); bot.launch();
改动说明
- 新增群组场景判断逻辑,识别
group/supergroup两类群组聊天类型 - 拆分回复权限规则:私聊场景保留原有仅管理员可回复反馈的逻辑,群组场景下任意用户回复机器人转发的反馈消息,都会将内容拷贝发送给原反馈发起人
- 优化了群组内管理员发普通消息的交互,去掉了不必要的错误提示
- 可选增加了群组内回复成功的提示,不需要可以直接删除对应代码块
- 原有私聊场景的所有功能逻辑完全保留,不会影响现有正常运行的私聊反馈流程
注意:需要提前给机器人开启群组消息读取权限,确保机器人在群组内可以接收到普通用户的消息事件,否则功能无法正常触发。
内容的提问来源于stack exchange,提问作者Roman Grak
相关产品推荐
相关产品推荐

