You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:16:08