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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:35:42