跳至主要內容

用 MPChat Bot 能做出什麼:典型場景、實作模式與邊界

對照今天已上線的 Bot API,看能做出什麼產品:指令、訊息按鈕、選單按鈕、底部鍵盤、MiniApp、六個可落地場景,以及仍關閉的能力邊界。

一句話結論:今天的 MPChat Bot 組合指令 + 訊息按鈕 + 選單按鈕 + 底部鍵盤 + MiniApp。訊息 callback(callback_query → answerCallbackQuery → 可選 editMessageReplyMarkup)已支援。MiniApp 用戶端回流(web_app_data / sendData / answerWebAppQuery)與 answerInlineQuery 仍未開放——需要複雜表單時進 MiniApp,再用 editMessageText 回寫聊天。


總覽

本文是 MPChat Bot 是什麼? 的產品向姊妹篇。那篇講邊界,這篇講用 core.mp.net/bots 目前已文件化的方法,能組出什麼產品。

不要按 Telegram Bot 1:1 搬。方法名眼熟,互動模型不同。先讀核心模式,再選場景。

能力積木

按「產品能做什麼」分組,而不是按 OpenAPI 分類:

積木

用來做什麼

主要方法

出站訊息

文字、媒體、MiniApp 入口、群 @、關閉連結預覽

sendMessage、sendPhoto、sendVideo、sendDocument

訊息維運

原地編輯、置頂、轉發、複製、撤回 vs 刪除

editMessageText、pinChatMessage、unpinChatMessage、forwardMessage(s)、copyMessage(s)、recallMessage(s)、deleteMessage(s)

群治理

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

banChatMember、unbanChatMember、setChatTitle、setChatDescription、setChatPhoto

群資訊讀取

會話 / 成員 / 管理員中繼資料

getChat、getChatAdministrators、getChatMember、getChatMemberCount、getUserProfilePhotos

指令選單

用戶端展示的斜線指令清單

setMyCommands、getMyCommands、deleteMyCommands

MiniApp 身分

開啟應用、驗明用戶、路由到某一屏

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

媒體方法接受公網 URL 或 multipart 上傳,不支援複用既有 file_id。sendChatAction、sendLocation、sendPoll 目前回傳 501。

核心模式:指令、按鈕與 MiniApp

左右對照:Telegram 氣泡內按鈕,對比 MPChat 指令加 MiniApp,再把聊天原文就地更新

Telegram 的預設體驗是訊息上的按鈕留在聊天裡:用戶點 callback_data,Bot 收到 callback_query,用 answerCallbackQuery 回應,再用 editMessageReplyMarkup 換掉鍵盤。

在 MPChat,這條 callback 鏈路已支援。必須呼叫 answerCallbackQuery(固定 300 秒視窗;不支援 url / cache_time),否則用戶端按鈕一直轉圈。MiniApp 用戶端回流(web_app_data / sendData / answerWebAppQuery)仍不可用。依場景選模式:

  1. 內嵌 / 底部 / 選單按鈕:短操作(開啟網址、開啟 MiniApp、複製、callback,或傳送預設文字)。

  2. MiniApp:表單、清單或選項較多時,透過 web_app 按鈕、選單按鈕或 https://mp.net/{botUsername}/{shortName}?startapp=… 開啟。

  3. MiniApp 載入後,前端讀取原始 window.MpChat.WebApp.initData,POST 到你自己的後端——Bot token 絕不能進 WebView。

  4. 後端校驗 hash 與 auth_date,再信任 user.id、miniapp_id、start_param。

  5. 做完後可用 editMessageText / editMessageReplyMarkup(或另發一則)讓聊天反映結果。

用 setMyCommands 做斜線指令發現(/start、/help、/status)。用 setChatMenuButton 配左側選單。用 Reply Keyboard 做底部常駐快捷鍵。表單、清單、超過兩個選項的流程進 MiniApp。

場景:群運營與置頂播報

群聊:新人被 @ 歡迎、今日公告置頂,次日過期公告被撤回

社群 Bot:歡迎新人,並把今日公告釘在群裡。

  1. 接收 Update.message.new_chat_members(輪詢或 Webhook)。

  2. sendMessage 一條歡迎,用 entities 的 text_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_123。startapp 會進入簽名後的 initData.start_param。不要把 startapp 寫進 MiniApp 儲存的 entryUrl 本身。

  3. MiniApp 展示通過 / 駁回。驗簽後,後端落庫,並對原 message_id 調 editMessageText:已通過 by @Chen。

若這條只要文字、不要 MiniApp 卡片,同一條 sendMessage 設 link_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。匹配不上的當普通文字送出。

  • 不要把 entities 和 web_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 裡結單後,用 editMessageText 或 sendMessage 把一行摘要寫回聊天,方便稽核。

Telegram 的 initData 沒有 Email 欄位。不要假設一份 Telegram MiniApp 範例能解析 user.email。

現在做不到的玩法與替代路徑

Telegram 玩法

MP 今天

改怎麼做

氣泡內多輪按鈕

answerCallbackQuery + editMessageReplyMarkup 已支援;MiniApp 用戶端回流仍關閉

短步驟用 callback 按鈕;表單用 MiniApp + ?startapp=

內嵌查詢 @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 今天已公布的方法集合。依賴上文未列出的方法前,請先核對該頁。

是否回答了您的問題?