跳转到主要内容

用 MPChat Bot 能做出什么:典型场景、实现模式与边界

对照今天已上线的 Bot API,看能做出什么产品:命令加 MiniApp 的核心模式、六个可落地场景,以及 Telegram 气泡按钮、投票、邀请链接等玩法在 MP 上的替代路径。

一句话结论:今天的 MPChat Bot 是命令 + MiniApp产品,不是 Telegram 那种聊天气泡里点按钮完成多轮交互的产品。answerCallbackQueryeditMessageReplyMarkupanswerInlineQuery 均未开放。有状态的交互放进 MiniApp,再用 editMessageText 把结果写回原消息。


总览

本文是 MPChat Bot 是什么? 的产品向姊妹篇。那篇讲边界,这篇讲用 core.mp.net/bots 当前已文档化的方法,能组合出什么产品。

不要按 Telegram Bot 1:1 搬。方法名眼熟,交互模型不同。先读核心模式,再选场景。

能力积木

按「产品能做什么」分组,而不是按 OpenAPI 分类:

积木

用来做什么

主要方法

出站消息

文本、媒体、MiniApp 入口、群 @、关闭链接预览

sendMessagesendPhotosendVideosendDocument

消息运维

原地编辑、置顶、转发、复制、撤回 vs 删除

editMessageTextpinChatMessageunpinChatMessageforwardMessage(s)copyMessage(s)recallMessage(s)deleteMessage(s)

群治理

禁言(不是踢人)、解禁、改群资料

banChatMemberunbanChatMembersetChatTitlesetChatDescriptionsetChatPhoto

群信息读取

会话 / 成员 / 管理员元数据

getChatgetChatAdministratorsgetChatMembergetChatMemberCountgetUserProfilePhotos

命令菜单

客户端展示的斜杠指令列表

setMyCommandsgetMyCommandsdeleteMyCommands

MiniApp 身份

打开应用、验明用户、路由到某一屏

sendMessage + web_app.url;签名 initData?startapp=start_param

媒体方法接受公网 URL 或 multipart 上传,不支持复用已有 file_idsendChatActionsendLocationsendPoll 当前返回 501。

核心模式:命令 + MiniApp,不是气泡内按钮

左右对照:Telegram 气泡内按钮,对比 MPChat 命令加 MiniApp,再把聊天原文就地更新

Telegram 的默认体验是消息上的按钮留在聊天里:用户点 callback_data,Bot 收到 callback_query,用 answerCallbackQuery 回应,再用 editMessageReplyMarkup 换掉键盘。

在 MPChat,这三个方法列在当前未开放的 Bot API 方法里。MiniApp 客户端回流(web_app_data / sendData / answerWebAppQuery)同样不可用。替代模式是:

  1. 用户发一条命令,或点 web_app 按钮,或打开 https://mp.net/{botUsername}/{shortName}?startapp=…

  2. MiniApp 加载。前端读取原始 window.MpChat.WebApp.initData,POST 到你自己的后端——Bot token 绝不能进 WebView。

  3. 后端校验 hashauth_date,再信任 user.idminiapp_idstart_param

  4. 用户在 MiniApp 里做完后,后端调 Bot API 的 editMessageText(或另发一条),让聊天里的原文反映结果。

setMyCommands 做可发现的入口(/start/help/status)。表单、列表、超过两个选项的流程,全部进 MiniApp。

场景:群运营与置顶播报

群聊:新人被 @ 欢迎、今日公告置顶,次日过期公告被撤回

社群 Bot:欢迎新人,并把今日公告钉在群里。

  1. 接收 Update.message.new_chat_members(轮询或 Webhook)。

  2. sendMessage 一条欢迎,用 entitiestext_mention @ 到新人(见下方邀请场景)。

  3. pinChatMessage 置顶当日公告。目前仅群会话;权限不足返回 403。

  4. 次日:unpinChatMessage,再 recallMessage 清掉过期公告。recallMessage 是 MPChat 扩展;deleteMessage 仍是兼容删除方法。

退群事件是 Update.message.left_chat_member。置顶事件在 Bot 能看到该消息时,以 Update.message.pinned_message 送达。

场景:审批与工单

工单消息带打开 MiniApp 按钮;在 MiniApp 里通过后,原消息变成「已通过 by Chen」

不要在气泡上做「通过 / 驳回」。打开 MiniApp 处理,再把决定写回原消息。

  1. 工单创建时,sendMessage 一段摘要,并附 web_app 按钮,url 填 MiniApp 的 entryUrl。服务端用该 URL 解析当前 Bot 名下的 MiniApp,请求体不必带 miniapp_id

  2. 要落到某一张工单,在正文里再放直链:https://mp.net/{botUsername}/{shortName}?startapp=ticket_123startapp 会进入签名后的 initData.start_param。不要把 startapp 写进 MiniApp 保存的 entryUrl 本身。

  3. MiniApp 展示通过 / 驳回。验签后,后端落库,并对原 message_ideditMessageText已通过 by @Chen

若这条只要文字、不要 MiniApp 卡片,同一条 sendMessagelink_preview_options.is_disabled = true。服务端仍会校验 web_app.url 属于当前 Bot 已启用的 MiniApp。

{
  "chat_id": "12345",
  "text": "请假单 ticket_123 — 打开后审批",
  "link_preview_options": { "is_disabled": true },
  "reply_markup": {
    "inline_keyboard": [[
      {
        "text": "去审批",
        "web_app": { "url": "https://mini.example.com/demo" }
      }
    ]]
  }
}

场景:活动邀请与群 @

组织者在 MiniApp 勾选邀请对象,Bot 再在群里 @ Chen 和 Lei

MiniApp 里勾选要邀请的人,Bot 再在群里 @ 他们,触发群提醒。官方形态:

{
  "chat_id": "12345",
  "text": "@Chen @Lei invites you to this activity",
  "entities": [
    {
      "type": "text_mention",
      "offset": 0,
      "length": 5,
      "user": { "id": "2000000154" }
    },
    {
      "type": "text_mention",
      "offset": 6,
      "length": 4,
      "user": { "id": "2000000168" }
    }
  ]
}

上线时要守的边界:

  • entities 当前只支持 text_mention。官方参考未写明 offset / length 按哪种编码计数,且示例全是 ASCII 名字——上线前请用含中文的昵称实测一次,否则高亮会落在错误的字符上。

  • 每个目标必须已在群内。不支持 @all。不从昵称、展示名或模糊文本推断对象。

  • 群聊 sendMessage 若完全省略 entities,服务端会尝试按群成员用户名唯一匹配,把原文 @username 自动补成 text_mention。匹配不上的当普通文本发出。

  • 不要把 entitiesweb_app MiniApp 入口卡写在同一条消息里。web_app 消息也不会做用户名自动补全。

场景:可刷新的状态看板

同一条状态消息从 09:00 覆盖到 09:05,聊天不被刷屏

固定一条消息反复覆盖,避免刷屏。

  1. sendMessage 发出第一份快照,存下 chat_id + message_id

  2. 每次刷新对同一条调 editMessageText。只支持改文本消息;消息不存在 404,Bot 无权改 403。

  3. 图表用 sendPhoto + 公网图片 URL(或 multipart)。不能复用上次的 file_id,图片请自己托管,每次发新 URL。

没有「正在输入」指示(sendChatAction 返回 501)。生成要几秒时,先发一句占位,再用 editMessageText 换成终稿。

场景:内容治理与群规

一条垃圾消息被撤回,发送者被禁言,人仍留在群里

管理 Bot:清垃圾消息,禁言屡犯者。

  • recallMessage / recallMessages(MPChat 扩展),或兼容的 deleteMessage / deleteMessages

  • 群里,拥有「撤回消息」权限的管理员 Bot 可撤回普通成员的消息;不能撤回群主或其他管理员的消息——会返回 403。

  • 批量撤回 / 删除是全成或全败:任一 id 不满足前置条件,整单报错,不会部分成功。

  • banChatMember禁言,不会把人移出群。until_date=0 或省略表示直到你调用 unbanChatMember

没有 createChatInviteLink,也没有「踢出再解封」的增长闭环。拉新请发 MiniApp 直链,用 ?startapp= 做归因,加人仍走人工或其它产品流程。

场景:客服分流与会员分层

用户打开客服 MiniApp;Bot 已知道会员分层,并把结单一行写回聊天

客服 MiniApp 打开时就已经知道是谁。

  1. 先校验原始 initData,再读任何用户字段。initDataUnsafe 只给 UI 展示。

  2. user.email 是 MPChat 扩展:仅在用户已授权且确有 Email 时出现在签名后的 user JSON 里;否则字段省略。缺 Email 不等于验签失败。

  3. user.is_premium(若有)可用来把付费队列和免费队列分开。

  4. 坐席在 MiniApp 里结单后,用 editMessageTextsendMessage 把一行摘要写回聊天,方便审计。

Telegram 的 initData 没有 Email 字段。不要假设一份 Telegram MiniApp 示例能解析 user.email

现在做不到的玩法与替代路径

Telegram 玩法

MP 今天

改怎么做

气泡内多轮按钮

answerCallbackQuery / editMessageReplyMarkup 未开放

web_app 按钮或 ?startapp= 直链,再用 editMessageText

内联查询 @bot 关键词

answerInlineQuery 未开放

setMyCommands 菜单 + MiniApp 搜索页

投票

sendPoll 返回 501

MiniApp 投票页,Bot 发结果

位置 / 打卡

sendLocation 返回 501

在 MiniApp 内取位置

「正在输入」

sendChatAction 返回 501

先发占位文本,再 editMessageText

读取用户发来的文件

getFile 未开放

引导到 MiniApp 内上传

邀请链接裂变

createChatInviteLink 全家桶未开放

MiniApp 直链 + ?startapp= 归因

踢出群成员

banChatMember 只禁言

API 禁言;移出群走人工管理员

支付、Stars、礼物、贴纸包、表情反应、常驻回复键盘

未开放

本阶段没有 Bot API 替代

相关文章

本文描述的是 core.mp.net/bots 今天已公布的方法集合。依赖上文未列出的方法前,请先核对该页。

这是否解答了您的问题?