Telegram Bot调用editMessageReplyMarkup移除内联键盘报错问题
核心报错原因
- 两类400错误本质都是参数取值错误:原代码混淆了账号ID、聊天ID、消息ID三类独立参数,把消息发送者的账号ID当消息ID传入、把点击按钮的用户ID当聊天ID传入,Telegram接口匹配不到要修改的目标消息,直接返回400错误
- 第二段实现额外存在参数格式错误:不符合
node-telegram-bot-api模块editMessageReplyMarkup方法的传参规则,且误将内联键盘字段写为普通自定义键盘字段,接口无法识别到合法的消息ID参数
可直接运行的正确代码
bot.on('callback_query', async (callbackQuery) => { const action = callbackQuery.data; // 从原消息对象下取正确的参数 const chatId = callbackQuery.message.chat.id; const messageId = callbackQuery.message.message_id; const queryId = callbackQuery.id; if (action === 'FM') { // 先响应按钮点击,关闭按钮加载状态 await bot.answerCallbackQuery(queryId); // 清空内联键盘实现按钮消失效果 await bot.editMessageReplyMarkup({ inline_keyboard: [] }, { chat_id: chatId, message_id: messageId }); } });
实现注意事项
- 点击内联按钮后必须调用
answerCallbackQuery接口给Telegram服务端返回响应,否则按钮会一直保持加载中的旋转动画 - 移除内联键盘只需要将
inline_keyboard字段赋值为空数组即可,不需要构造多层空嵌套结构,也不需要手动做JSON序列化,node-telegram-bot-api模块会自动处理参数格式 - 编辑消息相关接口需要的
chat_id、message_id都要从callbackQuery.message对象下取值,不要从callbackQuery.from(点击按钮的用户信息)、callbackQuery.message.from(原消息发送者信息)对象下取ID,这类ID是用户账号ID,不是接口需要的聊天/消息ID - 该逻辑在私聊、群聊、频道场景下通用,不需要针对不同聊天类型做特殊调整
内容的提问来源于stack exchange,提问作者Dummy Cron
相关产品推荐
相关产品推荐

