You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Telegram Bot中用ChosenInlineResultHandler处理内联查询结果?

问题分析与解决方案

你的核心问题是混淆了不同Telegram Bot Handler的作用,同时存在模块缺失、参数错误等问题,以下是具体的修复步骤和正确代码示例:

关键错误点梳理

  1. Handler与处理函数不匹配:第一个代码中ChosenInlineResultHandler绑定的函数错误使用update.callback_query(这是给CallbackQueryHandler用的),正确应该用update.chosen_inline_result。
  2. 缺失必要模块导入:第二个代码中未导入uuid(生成内联结果ID)和InputTextMessageContent(定义内联消息内容),导致函数执行报错。
  3. 无效参数传递:main函数定义了receiver_id参数但调用时未传入,导致启动时send_message触发"Can not find chat"错误。
  4. 未正确绑定所需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()

核心修复说明

  1. 区分不同Handler的作用:
    • InlineQueryHandler:处理用户点击switch_inline_query按钮后发起的内联查询请求,返回可供选择的结果。
    • ChosenInlineResultHandler:处理用户选中内联结果的事件,通过update.chosen_inline_result获取选中结果的详情,可给用户发送通知或编辑内联消息。
    • CallbackQueryHandler:处理带callback_data的普通内联按钮点击事件。
  2. 补充缺失模块:添加uuid和InputTextMessageContent的导入,确保内联结果生成逻辑正常运行。
  3. 修复参数错误:移除main函数中未传入的receiver_id参数,避免启动时触发无效的消息发送请求。
  4. 正常使用switch_inline_query按钮:点击该按钮后会触发内联查询,InlineQueryHandler会返回结果列表,用户选择后ChosenInlineResultHandler会处理后续逻辑。

内容的提问来源于stack exchange,提问作者mingxingwang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:27:30