Telebot中设置switch_inline_query的InlineKeyboardButton处理及会话识别方法
Telebot switch_inline_query分享按钮获取目标会话方案
前置说明
Telegram Bot API原生不会在switch_inline_query按钮点击时直接返回目标会话/用户ID,可通过以下两种方案实现需求:
方案1:自定义参数埋点(仅需识别分享来源时使用)
该方案无需额外配置Bot权限,适合不需要拿到实际发送目标,仅需要跟踪分享触发来源的场景:
- 构造
InlineKeyboardButton时,将需要留存的上下文信息(比如触发分享的用户ID、原消息ID)编码后拼接到switch_inline_query参数值的前缀位置,用特殊分隔符和后续查询内容区分,示例代码:
from telebot.types import InlineKeyboardButton, InlineKeyboardMarkup # 拼接标识前缀,末尾留空格方便用户输入自定义内容 share_btn = InlineKeyboardButton( text="分享内容", switch_inline_query=f"share_{user_id}_{msg_id} " )
- 在inline查询处理器中拆分
query.text的前缀即可拿到之前埋入的上下文信息,示例代码:
@bot.inline_handler(func=lambda query: query.text.startswith("share_")) def handle_share_inline(query): prefix_parts = query.text.split("_", maxsplit=3) if len(prefix_parts) >=3: from_user_id = prefix_parts[1] origin_msg_id = prefix_parts[2] # 后续处理你的inline结果返回逻辑
方案2:开启chosen_inline_result回调(获取实际发送的目标会话信息)
如果需要拿到用户最终把分享内容发送到了哪个会话,需要开启Bot的inline反馈权限:
- 找到@BotFather,发送
/setinlinefeedback,选择对应Bot,开启回调权限 - 代码中注册
chosen_inline_result处理器,即可拿到发送后的会话相关信息,示例代码:
@bot.chosen_inline_handler(func=lambda res: True) def handle_share_sent(res): # 发送分享内容的用户ID operator_id = res.from_user.id # 会话唯一标识,可用于区分不同会话 chat_unique_id = res.chat_instance # 权限足够时可拿到完整的目标会话信息 if hasattr(res, "chat"): target_chat_id = res.chat.id target_chat_type = res.chat.type # 可选值:private/group/supergroup/channel
注意:出于用户隐私保护,Telegram不会在所有场景下都返回完整的
chat对象,仅公开群组、频道、和Bot有过交互的私聊会话会返回具体会话ID,私有群组、未交互的私聊仅能拿到chat_instance标识会话唯一性,无法获取具体ID。
内容的提问来源于stack exchange,提问作者BloodyCodeDay
相关产品推荐
相关产品推荐

