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

Node.js中node-telegram-bot-api的menuOptions按钮不显示问题求助

Telegram机器人Inline按钮无法显示问题分析

问题核心原因

  1. 参数传递结构错误
    你调用bot.sendMessage时,将menuOptions作为独立键传入选项对象,但node-telegram-bot-api要求reply_markup必须是选项的顶层属性。当前代码会生成如下无效结构:

    {
        parse_mode: "HTML",
        menuOptions: { reply_markup: "..." } // 错误:API不识别menuOptions键
    }
    

    正确的结构需要将reply_markup直接放在选项顶层。

  2. 手动JSON序列化冗余(非必改,但可优化)
    node-telegram-bot-api支持直接传入对象形式的reply_markup,无需手动调用JSON.stringify,虽然序列化后也能工作,但增加了不必要的复杂度。

修正方案

方案1:调整参数传递方式

修改sendMessage的选项结构,直接提取menuOptions中的reply_markup:

if (text === '/start') {
    ust[chatId] = 0;
    bot.sendMessage(chatId, `${msg.from.first_name}, <b>Добро пожаловать</b> ✌️\n\nДоступные возможности:`, {
        parse_mode: "HTML",
        reply_markup: menuOptions.reply_markup // 直接传入reply_markup
    })
}

方案2:优化menuOptions导出结构(推荐)

修改menuOptions的导出,让它直接包含完整的合法选项,同时移除手动序列化:

// menuOptions.js
module.exports = {
    startMenu: {
        parse_mode: "HTML",
        reply_markup: {
            inline_keyboard: [
                [{text: 'Списки', callback_data: '/list'}],
                [{text: 'Частые вопросы', callback_data: '/quests'}, {text: 'Распространенные проблемы', callback_data: '/problems'}]
            ]
        }
    }
}

调用时直接传入完整选项:

const { startMenu } = require('./menuOptions.js');

if (text === '/start') {
    ust[chatId] = 0;
    bot.sendMessage(chatId, `${msg.from.first_name}, <b>Добро пожаловать</b> ✌️\n\nДоступные возможности:`, startMenu)
}

内容的提问来源于stack exchange,提问作者kh0dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:15:36