You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Google App Script Telegram Bot:Inline Keyboard回调无响应问题问询

为什么Inline Keyboard按钮点击没响应?

你遇到的问题核心原因很直接:普通的消息/文件监听逻辑只处理message类型的Telegram更新,但Inline按钮点击触发的是callback_query类型的更新——你的原有监听函数根本没覆盖这个事件类型,自然不会有任何响应。


如何编写监听Inline Keyboard按钮点击的函数?

我以目前主流的python-telegram-bot v20版本(v13已停止维护)为例,给你完整的实现步骤:

第一步:先确认发送Inline Keyboard的代码配置正确

首先要保证你发送按钮时,每个Inline按钮都设置了callback_data(这是Telegram把点击事件传回给bot的关键标识)。比如正确的发送函数应该是这样:

from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import ApplicationBuilder, CommandHandler, CallbackQueryHandler

# 发送带Inline Keyboard的消息函数
async def send_inline_keyboard(update, context):
    # 构造按钮组,每个按钮必须指定callback_data
    keyboard = [
        [InlineKeyboardButton("按钮1", callback_data="btn_1")],
        [InlineKeyboardButton("按钮2", callback_data="btn_2")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.message.reply_text("请选择下方按钮:", reply_markup=reply_markup)

第二步:编写专门处理按钮点击的回调函数

这个函数需要监听callback_query事件,并且要遵守Telegram的要求——必须先调用query.answer(),否则用户点击后会一直显示加载状态:

# 处理Inline按钮点击的回调逻辑
async def handle_inline_button_click(update, context):
    query = update.callback_query
    
    # 必须先调用answer(),告知Telegram已收到请求
    await query.answer()
    
    # 根据callback_data判断是哪个按钮被点击
    match query.data:
        case "btn_1":
            await query.edit_message_text(text="你点击了按钮1!")
        case "btn_2":
            await query.edit_message_text(text="你点击了按钮2!")
        case _:
            await query.edit_message_text(text="未知的按钮操作")

第三步:注册所有处理器到Bot应用

最后要把普通消息处理器和回调处理器都注册到你的Bot应用中,这样才能同时处理各类事件:

def main():
    # 替换成你的Bot Token
    application = ApplicationBuilder().token("YOUR_BOT_TOKEN_HERE").build()
    
    # 注册触发发送键盘的命令(比如/start命令)
    application.add_handler(CommandHandler("start", send_inline_keyboard))
    # 注册回调处理器,监听所有Inline按钮点击事件
    application.add_handler(CallbackQueryHandler(handle_inline_button_click))
    
    # 启动Bot的轮询模式
    application.run_polling()

if __name__ == "__main__":
    main()

关键注意事项

  • 必须调用query.answer():这是Telegram的强制要求,如果跳过这一步,用户点击按钮后会一直显示"加载中",Telegram还会重复发送回调请求。
  • callback_data长度限制:这个字段最多只能有64字节,所以别放过长的内容,建议用简短的标识(比如btn_1),再在代码里映射到具体逻辑。
  • 其他库的适配逻辑:如果你用的是Pyrogram这类库,核心逻辑是一样的——需要监听CallbackQuery事件而非普通的Message事件。比如Pyrogram的示例:
from pyrogram import Client, filters
from pyrogram.types import InlineKeyboardButton, InlineKeyboardMarkup

app = Client("my_bot", api_id=YOUR_API_ID, api_hash="YOUR_API_HASH", bot_token="YOUR_BOT_TOKEN")

@app.on_message(filters.command("start"))
async def send_keyboard(client, message):
    keyboard = InlineKeyboardMarkup(
        [[InlineKeyboardButton("按钮1", callback_data="btn1")], [InlineKeyboardButton("按钮2", callback_data="btn2")]]
    )
    await message.reply_text("请点击按钮:", reply_markup=keyboard)

@app.on_callback_query()
async def handle_callback(client, callback_query):
    await callback_query.answer()
    if callback_query.data == "btn1":
        await callback_query.edit_message_text("你点击了按钮1!")
    else:
        await callback_query.edit_message_text("你点击了按钮2!")

app.run()

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

火山引擎 最新活动