Skip to main content
 首页 » 编程设计

python之使用回调查询使用内联键盘更新消息

2025年05月04日27del

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

我的代码示例(部分):

#!/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,它是空的。当我尝试使用硬编码变量 chat_id 和 message_id 时,bot.editMessageText 运行良好。

我是否需要在数据库中保存变量 chat_id 和 message_id 当他们运行命令/light 然后当他们按下内联按钮时我需要从数据库中读取这个值或者我可以使用一些更简单的方法来编辑消息?

请您参考如下方法:

您应该将 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" 
)