跳至主要內容

用 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_id 調 editMessageText已通過 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 今天已公布的方法集合。依賴上文未列出的方法前,請先核對該頁。

是否回答了您的問題?