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

Python实现Telegram常规键盘失效问题求助

排查Telegram常规键盘(ReplyKeyboardMarkup)失效问题

看起来你遇到的问题很典型——常规键盘(ReplyKeyboardMarkup)无法正常显示,但切换为InlineKeyboardMarkup就一切正常。结合Telegram Bot API和Python常用库的特性,我整理了几个最可能的故障原因,你可以逐一排查:

1. 键盘结构格式错误(最常见)

常规键盘和Inline键盘的按钮结构完全不同,很多人会不小心把Inline的结构套用到常规键盘上:

  • Inline键盘的每个按钮是包含text和callback_data/url的字典
  • 常规键盘的每个按钮直接是字符串(如果是特殊功能按钮,比如请求联系人/位置,才需要用字典格式)

错误示例(误用Inline按钮结构):

# 错误写法:把Inline的按钮格式用到了常规键盘
wrong_keyboard = {
    "keyboard": [
        [{"text": "按钮1", "callback_data": "btn1"}],
        [{"text": "按钮2", "callback_data": "btn2"}]
    ]
}

正确的常规键盘写法:

# 正确写法:按钮直接用字符串即可
correct_keyboard = {
    "keyboard": [
        ["按钮1", "按钮2"],
        ["按钮3"]
    ],
    "resize_keyboard": True  # 建议加上,适配不同屏幕尺寸
}

如果用python-telegram-bot库(v20+版本),更规范的构造方式是:

from telegram import ReplyKeyboardMarkup

# 构造键盘对象
keyboard = ReplyKeyboardMarkup(
    [["按钮1", "按钮2"], ["按钮3"]],
    resize_keyboard=True
)
# 发送消息时传入reply_markup参数
await update.message.reply_text("请选择操作", reply_markup=keyboard)

2. 参数名称或API调用方式错误

确保你在发送消息时,正确使用了reply_markup参数传递常规键盘,不要把参数名写错(比如写成reply_keyboard)。

如果是直接调用Telegram Bot API接口,请求体的格式要准确:

import requests

TOKEN = "你的BotToken"
CHAT_ID = "目标聊天ID"

payload = {
    "chat_id": CHAT_ID,
    "text": "请选择操作",
    "reply_markup": {
        "keyboard": [["按钮1", "按钮2"]],
        "resize_keyboard": True
    }
}

requests.post(f"https://api.telegram.org/bot{TOKEN}/sendMessage", json=payload)

3. 库版本兼容性问题

如果你用的是python-telegram-bot库,v13和v20+版本的API差异极大:

  • v13及更早版本:支持直接传字典格式的reply_markup
  • v20+版本:必须使用库提供的ReplyKeyboardMarkup类构造键盘,不能直接传字典

如果你参考的是旧版教程但用了最新版库,就会出现键盘失效的情况。可以先检查库版本:

pip show python-telegram-bot

如果是v20+,务必按照官方文档的方式构造键盘,不要混用旧版的字典写法。

4. 旧键盘设置覆盖了新键盘

如果之前发送过ReplyKeyboardRemove隐藏键盘,或者当前聊天窗口的键盘被其他操作覆盖,可能导致新的常规键盘无法显示。你可以先清除旧键盘,再重新发送新键盘:

from telegram import ReplyKeyboardRemove, ReplyKeyboardMarkup

# 先清除旧键盘
await update.message.reply_text("即将显示新键盘", reply_markup=ReplyKeyboardRemove())
# 再发送新键盘
keyboard = ReplyKeyboardMarkup([["按钮1", "按钮2"]], resize_keyboard=True)
await update.message.reply_text("请选择", reply_markup=keyboard)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:57:33