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

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反馈权限:

  1. 找到@BotFather,发送/setinlinefeedback,选择对应Bot,开启回调权限
  2. 代码中注册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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 18:09:03