Python Telegram内联机器人:实现点击按钮后发送消息的问题
Telegram内联机器人按钮回调实现方案
问题场景
开发Telegram内联机器人时,需要强制用户点击内联按钮后才发送下一段文本。现有代码能发送消息和按钮,但无法正确处理按钮的回调逻辑,尝试获取callback_data时机器人崩溃,出现Telegram默认的故障提示。
现有代码
message = f"""Message """ results = [ InlineQueryResultArticle( id="ProveVerification", title="Message sent!", input_message_content=InputTextMessageContent("Please look for a message from the bot", parse_mode=ParseMode.MARKDOWN), ) ] context.bot.send_message(chat_id=update.inline_query.from_user.id, text=message) update.inline_query.answer(results) button_check = types.InlineKeyboardButton('✅', callback_data='pressed') keyboard = types.InlineKeyboardMarkup() keyboard.add(button_check) context.bot.send_message(chat_id=update.inline_query.from_user.id, text='Confirm you read the message above by clicking on the button below', reply_markup=keyboard) #if callback_data ='pressed' send another message
解决方案
核心问题是未为机器人注册回调查询处理器,导致按钮点击事件无法被捕获处理。以下是完整的修正实现:
完整代码示例
from telegram import Update, InlineQueryResultArticle, InputTextMessageContent, ParseMode, types from telegram.ext import Updater, InlineQueryHandler, CallbackQueryHandler, ContextTypes # 处理内联查询逻辑 async def handle_inline_query(update: Update, context: ContextTypes.DEFAULT_TYPE): message = """需要用户阅读的核心消息内容""" results = [ InlineQueryResultArticle( id="ProveVerification", title="Message sent!", input_message_content=InputTextMessageContent( "请查看机器人发送的消息", parse_mode=ParseMode.MARKDOWN ), ) ] # 发送需阅读的消息 await context.bot.send_message( chat_id=update.inline_query.from_user.id, text=message ) # 回复内联查询 await update.inline_query.answer(results) # 创建确认按钮并发送提示 button_check = types.InlineKeyboardButton('✅', callback_data='pressed') keyboard = types.InlineKeyboardMarkup() keyboard.add(button_check) await context.bot.send_message( chat_id=update.inline_query.from_user.id, text='点击下方按钮确认已阅读以上消息', reply_markup=keyboard ) # 处理按钮回调逻辑 async def handle_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query # 必须调用此方法确认回调请求,避免Telegram判定机器人无响应 await query.answer() # 判断回调数据是否匹配 if query.data == 'pressed': # 发送后续消息 await query.message.reply_text("已确认阅读,这是后续的消息内容!") def main(): # 替换为你的机器人Token updater = Updater("YOUR_BOT_TOKEN") dp = updater.dispatcher # 注册内联查询处理器 dp.add_handler(InlineQueryHandler(handle_inline_query)) # 注册回调查询处理器,监听按钮点击 dp.add_handler(CallbackQueryHandler(handle_callback)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
关键要点说明
- 注册CallbackQueryHandler:这是核心步骤,必须在Dispatcher中添加这个处理器,才能捕获按钮的点击事件,之前的代码缺少这一步导致回调无法被处理,引发机器人崩溃。
- 调用query.answer():必须在回调函数中调用此方法,向Telegram确认已收到回调请求,否则Telegram会持续重试请求,导致机器人出现故障提示。
- 异步处理:如果使用python-telegram-bot v13及以上版本,所有处理器函数都需要定义为异步函数,并使用
await关键字处理发送消息等异步操作。
内容的提问来源于stack exchange,提问作者Black Beriz
相关产品推荐
相关产品推荐

