Telegram bot API使用python-telegram-bot无法编辑InlineKeyboard

时间:2019-03-16 22:04:50

标签: python telegram-bot python-telegram-bot

我正在尝试创建一个菜单,用户可以在其中进行导航。这是我的代码:

MENU, HELP = range(2)

def start(bot, update):
    keyboard = [
                 [InlineKeyboardButton('Help', callback_data='help')]
               ]

    # Create initial message:
    message = 'Welcome.'

    update.message.reply_text(message, reply_markup=InlineKeyboardMarkup(keyboard))

def help(bot, update):

    keyboard = [
                 [InlineKeyboardButton('Leave', callback_data='cancel')]
               ]


    update.callback_query.edit_message_reply_markup('Help ... help..', reply_markup=InlineKeyboardMarkup(keyboard))

def cancel(bot, update):

    update.message.reply_text('Bye.', reply_markup=ReplyKeyboardRemove())

    return ConversationHandler.END     


# Create the EventHandler and pass it your bot's token.
updater = Updater(token=config.TELEGRAM_API_TOKEN)

# Get the dispatcher to register handlers:
dispatcher = updater.dispatcher

dispatcher.add_handler(CommandHandler('start', start))
dispatcher.add_handler(CallbackQueryHandler(help, pattern='help'))
dispatcher.add_handler(CallbackQueryHandler(cancel, pattern='cancel'))

updater.start_polling()

updater.idle()

按预期,在/ start处,用户将获得菜单“帮助”。当用户单击它时,也会按预期触发功能help()。

根据我对python-telegram-bot文档的了解,应该填充 update.callback_query.inline_message_id ,但其值为

>

我需要 update.callback_query.inline_message_id 来更新我的InlineKeyboard菜单,对吗?为什么inline_message_id为空(无)?

Python 3.6.7
python-telegram-bot==11.1.0

最好的问候。 克莱森里奥斯(Kleyson Rios)。

1 个答案:

答案 0 :(得分:0)

我相信您的代码中有2个问题。

第一。在您的help函数中,您试图更改消息的文本和消息的标记。但是edit_message_reply_markup方法仅更改标记。因此,而不是

update.callback_query.edit_message_reply_markup(
    'Help ... help..',
    reply_markup=InlineKeyboardMarkup(keyboard)
)

执行以下操作:

bot.edit_message_text(
    text='Help ... help..',
    chat_id=update.callback_query.message.chat_id,
    message_id=update.callback_query.message.message_id,
    reply_markup=InlineKeyboardMarkup(keyboard)
)
bot.answer_callback_query(update.callback_query.id, text='')

通知更改:

  • 我将update.callback_query替换为bot
  • 重要:我将edit_message_reply_markup替换为edit_message_text;因为第一个仅更改标记,但是第二个可以同时做这两个。
  • 我添加了chat_idmessage_id自变量;因为that's what it says in the documents
  • 重要:我添加了一种新方法(bot.answer_callback_query);因为每次您处理回调查询时都需要 answer (使用此方法)。但是,您可以保留text参数,这样它就不会显示任何内容。

第二。如果我错了,请纠正我,但是我相信当用户按下cancel按钮时,您希望将消息文本更改为“再见”。并卸下键盘。在这种情况下,您做错的是您在尝试卸下键盘(reply_text)时发送了 new 消息(reply_markup=ReplyKeyboardRemove())。您可以这样简单地做到:

bot.edit_message_text(
    text='Bye',
    chat_id=update.callback_query.message.chat_id,
    message_id=update.callback_query.message.message_id,
)
bot.answer_callback_query(update.callback_query.id, text='')

这里的想法是,当您编辑邮件的文本并且不使用标记键盘时,上一个键盘会自动被删除< / em>,因此您无需使用ReplyKeyboardRemove()

这是一个有效的GIF(带有硬G)!

enter image description here