如何在Python Telegram Bot中用ChosenInlineResultHandler处理内联查询结果?
问题分析与解决方案
你的核心问题是混淆了不同Telegram Bot Handler的作用,同时存在模块缺失、参数错误等问题,以下是具体的修复步骤和正确代码示例:
关键错误点梳理
- Handler与处理函数不匹配:第一个代码中
ChosenInlineResultHandler绑定的函数错误使用update.callback_query(这是给CallbackQueryHandler用的),正确应该用update.chosen_inline_result。 - 缺失必要模块导入:第二个代码中未导入
uuid(生成内联结果ID)和InputTextMessageContent(定义内联消息内容),导致函数执行报错。 - 无效参数传递:
main函数定义了receiver_id参数但调用时未传入,导致启动时send_message触发"Can not find chat"错误。 - 未正确绑定所需Handler:缺少
ChosenInlineResultHandler的绑定,无法处理用户选中内联结果的事件。
修复后的完整代码
import logging import os import uuid from telegram import ( InlineQueryResultArticle, InlineKeyboardButton, InlineKeyboardMarkup, InputTextMessageContent, Update ) from telegram.ext import ( Updater, CommandHandler, InlineQueryHandler, ChosenInlineResultHandler, CallbackQueryHandler ) logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) def start(update, context): buttons = [ [ InlineKeyboardButton( text="Random Image", switch_inline_query="test" ), InlineKeyboardButton( "Random Person", callback_data="2" ) ] ] update.message.reply_text("Please choose:", reply_markup=InlineKeyboardMarkup(buttons)) def handle_inline_query(update, context): query_text = update.inline_query.query # 生成内联查询结果 results = [ InlineQueryResultArticle( id=str(uuid.uuid4()), title="大写转换", input_message_content=InputTextMessageContent(query_text.upper()) ) ] update.inline_query.answer(results) def handle_chosen_result(update, context): chosen_result = update.chosen_inline_result # 给选中结果的用户发送通知消息 context.bot.send_message( chat_id=chosen_result.from_user.id, text=f"你选中了内联结果,查询内容为: {chosen_result.query}" ) # 若需编辑选中的内联消息,可使用inline_message_id # context.bot.edit_message_text( # text="已选中该结果", # inline_message_id=chosen_result.inline_message_id # ) def handle_callback_button(update, context): query = update.callback_query query.answer() query.edit_message_text(text=f"你点击了Random Person按钮,回调数据: {query.data}") def main(): updater = Updater(os.environ['TELEGRAM_BOT_TOKEN'], use_context=True) dp = updater.dispatcher # 绑定各个Handler到对应处理函数 dp.add_handler(CommandHandler("start", start)) dp.add_handler(InlineQueryHandler(handle_inline_query)) dp.add_handler(ChosenInlineResultHandler(handle_chosen_result)) dp.add_handler(CallbackQueryHandler(handle_callback_button)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
核心修复说明
- 区分不同Handler的作用:
InlineQueryHandler:处理用户点击switch_inline_query按钮后发起的内联查询请求,返回可供选择的结果。ChosenInlineResultHandler:处理用户选中内联结果的事件,通过update.chosen_inline_result获取选中结果的详情,可给用户发送通知或编辑内联消息。CallbackQueryHandler:处理带callback_data的普通内联按钮点击事件。
- 补充缺失模块:添加
uuid和InputTextMessageContent的导入,确保内联结果生成逻辑正常运行。 - 修复参数错误:移除
main函数中未传入的receiver_id参数,避免启动时触发无效的消息发送请求。 - 正常使用switch_inline_query按钮:点击该按钮后会触发内联查询,
InlineQueryHandler会返回结果列表,用户选择后ChosenInlineResultHandler会处理后续逻辑。
内容的提问来源于stack exchange,提问作者mingxingwang
相关产品推荐
相关产品推荐

