使用回调查询使用内联键盘更新邮件

时间:2016-08-24 11:09:16

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

我想在内联键盘的聊天中更新消息,但无法理解如何接收 inline_message_id ,或者仅针对内联查询,我如何确定 chat_id message_id 是否可以在 telegram.bot.Bot 中的editMessageText(*args, **kwargs)上使用它?

我的代码示例(部分内容):

#!/usr/bin/python
import telegram
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, InlineQueryHandler, CallbackQueryHandler

tokenid = "YOUR_TOKEN_ID"

def inl(bot, update):
    if update.callback_query.data == "k_light_on":
        #func for turn on light res = k_light.on()
        bot.answerCallbackQuery(callback_query_id=update.callback_query.id, text="Turning on light ON!")
        bot.editMessageText(inline_message_id=update.callback_query.inline_message_id, text="Do you want to turn On or Off light? Light is ON")
        #hardcoded vars variant
        #bot.editMessageText(message_id=298, chat_id=174554240, text="Do you want to turn On or Off light? Light is ON")
    elif update.callback_query.data == "k_light_off":
        #func for turn on light res = k_light.off()
        bot.answerCallbackQuery(callback_query_id=update.callback_query.id, text="Turning off light OFF!")
        bot.editMessageText(inline_message_id=update.callback_query.inline_message_id, text="Do you want to turn On or Off light? Light is ON")
        #hardcoded vars variant
        #bot.editMessageText(message_id=298, chat_id=174554240, text="Do you want to turn On or Off light? Light is OFF")
    else:
        print "Err"

def k_light_h(bot, update):
    reply_markup = telegram.InlineKeyboardMarkup([[telegram.InlineKeyboardButton("On", callback_data="k_light_on"), telegram.InlineKeyboardButton("Off", callback_data="k_light_off")]])
    ddd = bot.sendMessage(chat_id=update.message.chat_id, text="Do you want to turn On or Off light?", reply_markup=reply_markup)

if __name__ == "__main__":
    #
    updater = Updater(token=tokenid)
    ### Handler groups
    dispatcher = updater.dispatcher
    # light
    k_light_handler = CommandHandler('light', k_light_h)
    dispatcher.add_handler(k_light_handler)
    # errors
    updater.dispatcher.add_error_handler(error)
    updater.start_polling()
    # Run the bot until the user presses Ctrl-C or the process receives SIGINT,
    # SIGTERM or SIGABRT
    updater.idle()

当我运行它时出现错误:

telegram.ext.dispatcher - WARNING - A TelegramError was raised while processing the Update.
root - WARNING - Update ...
... caused error "u'Bad Request: message identifier is not specified'"

我检查了var update.callback_query.inline_message_id ,它是空的。当我使用硬编码的vars chat_id message_id 尝试 bot.editMessageText 时,它运行良好。

我是否需要在DB(对于所有用户)vars chat_id message_id 中保存,当他们运行命令/灯时,然后当他们按内联按钮时我需要从DB读取这个值还是我可以使用一些更简单的方法来编辑消息?

2 个答案:

答案 0 :(得分:5)

您应该将message_id而不是inline_message_id传递给editMessageText

所以解决方案就是:

bot.editMessageText(
    message_id = update.callback_query.message.message_id,
    chat_id = update.callback_query.message.chat.id,
    text = "Do you want to turn On or Off light? Light is ON"
)

答案 1 :(得分:0)

您总是可以这样做

    try:
        query.edit_message_reply_markup(reply_markup=InlineKeyboardMarkup(reply_keyboard))
    except:
        return