如何实现switch_inline_query按钮的文本/内嵌按钮添加及触发后消息发送?
关于Telegram Bot switch_inline_query按钮的实现方案
嘿,我来帮你一步步搞定这两个Telegram Bot开发的常见问题~
1. 如何创建带文本的switch_inline_query类型Inline按钮
其实逻辑很清晰,构造InlineKeyboardButton时只要指定两个核心参数就行:
text: 按钮上显示的可见文字,比如"发送我的自定义内容"switch_inline_query: 触发内联模式的属性,值可以是空字符串,也可以填一个自定义查询标识(用户选择会话后会自动带入输入框,方便后续判断请求来源)
举个Python的例子(基于python-telegram-bot v20版本):
from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ApplicationBuilder, CommandHandler async def start(update, context): # 构造带switch_inline_query的按钮 custom_button = InlineKeyboardButton( text="点击触发内联消息", # 按钮显示文本 switch_inline_query="custom_trigger_123" # 自定义查询标识,用来区分请求 ) keyboard = InlineKeyboardMarkup([[custom_button]]) await update.message.reply_text("点击下方按钮试试:", reply_markup=keyboard) if __name__ == "__main__": app = ApplicationBuilder().token("你的Bot Token").build() app.add_handler(CommandHandler("start", start)) app.run_polling()
如果直接调用Telegram Bot API,JSON请求格式大概是这样:
{ "chat_id": "目标聊天ID", "text": "点击下方按钮触发内联模式:", "reply_markup": { "inline_keyboard": [ [ { "text": "点击触发内联消息", "switch_inline_query": "custom_trigger_123" } ] ] } }
2. 按下按钮选会话后,发送带指定文本和Inline按钮的内联消息
这一步的核心是监听并处理inline_query更新:当用户点击按钮选择会话后,Telegram会给你的Bot发送inline_query事件,里面包含之前设置的switch_inline_query标识。你需要捕获这个事件,然后返回预先构造好的内联消息结果。
继续用python-telegram-bot v20的例子,添加InlineQueryHandler来处理请求:
from telegram import InlineQueryResultArticle, InputTextMessageContent, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import InlineQueryHandler async def handle_inline_request(update, context): query_content = update.inline_query.query # 判断是否是我们的按钮触发的请求 if query_content == "custom_trigger_123": # 构造要发送的消息文本 target_text = "这是我指定的内联消息内容!" # 构造消息里的Inline按钮 message_button = InlineKeyboardButton(text="点我跳转", url="https://example.com") message_keyboard = InlineKeyboardMarkup([[message_button]]) # 创建内联查询结果 result = InlineQueryResultArticle( id="unique_result_id", title="发送自定义消息", input_message_content=InputTextMessageContent(target_text), reply_markup=message_keyboard # 给消息附加Inline按钮 ) # 返回结果给Telegram,cache_time设0避免缓存旧内容 await update.inline_query.answer([result], cache_time=0) # 在之前的代码中添加这个处理器 app.add_handler(InlineQueryHandler(handle_inline_request))
关键注意点:
- 自定义的
switch_inline_query标识可以是任意字符串,主要用来区分不同来源的内联请求; - 如果希望用户能自由修改查询文本,可以把
switch_inline_query设为空,但固定场景下用自定义标识更可靠; cache_time设为0可以确保每次请求都返回最新内容,适合动态更新的场景。
这样一套流程走下来,用户点击按钮选择会话后,就能看到Bot提供的内联选项,选择后就会发送带指定文本和Inline按钮的消息啦~
内容的提问来源于stack exchange,提问作者user8794562




