Telegraf Bot内联键盘回调私聊生效但群组失效问题排查
Telegraf Bot内联键盘回调在群组失效,私聊正常(使用Stage&Scenes)
问题描述
我的Telegraf Bot的Markup.inlineKeyboard回调功能在私聊中正常工作,但在群组聊天里完全失效。目前用Stage和Scenes实现对话流,确认配置没问题;已经在BotFather调整过各类设置,给Bot开了群组管理员权限,群组里也没有其他Bot。
试过用bot.action替代setupScene.action,但触发后没法进入setupScene.on的逻辑,问题没解决。现在希望群组里的按钮能和私聊一样正常响应。
键盘代码
ctx.reply('Use the buttons below to customize your bot', { ...Markup.inlineKeyboard([ [Markup.button.callback(ctx.session.gif ? '✅ Gif / Media' : '❌ Gif / Media', 'gm'), Markup.button.callback(`Min Buy $${ctx.session.minBuy}`, 'mb')], [Markup.button.callback('Emoji', 'em'), // TODO Markup.button.callback(`Step $${ctx.session.st}`, 'st')] ]), });
回调代码
setupScene.action('gm', (ctx) => { console.log(1); ctx.reply('➡️ Send gif / media'); ctx.scene.state.step = 'gm'; });
场景部分代码
setupScene.on('message', async (ctx) => { if (ctx.scene.state.step === 'gm') { // code... } // ... }
解决方法
1. 调整BotFather隐私设置
在BotFather中发送/setprivacy,选择你的Bot,设置为Disabled。该选项默认是Enabled,会限制Bot接收群组内的回调查询消息,是此类问题的常见诱因。
2. 确保会话存储兼容群组场景
如果使用了会话中间件(如telegraf-session-local),检查配置是否支持跨私聊、群组存储会话数据。部分会话存储默认仅关联私聊chat.id,需确保它能正确识别群组chat.id并维持会话状态。
3. 显式维护群组内的场景状态
私聊时用户的场景状态通常会自动维持,但群组中需手动确保用户处于目标场景。修改回调代码,在触发动作时检查并进入场景:
setupScene.action('gm', (ctx) => { console.log(1); // 检查是否已在目标场景,未进入则手动触发 if (!ctx.scene.current || ctx.scene.current.id !== 'setupScene') { ctx.scene.enter('setupScene'); } ctx.reply('➡️ Send gif / media'); ctx.scene.state.step = 'gm'; });
4. 验证Bot的群组管理员权限
确认Bot的群组管理员权限中,已开启读取消息和发送消息权限,部分群组的权限设置可能会限制Bot接收回调事件的能力。
内容的提问来源于stack exchange,提问作者throwaway4206891
相关产品推荐
相关产品推荐

