Learning Objectives
- 用 SDK 的訊息物件傳送文字、貼圖、圖片、影片、語音與位置
- 說明 Python 的欄位名稱和送到 LINE 的 JSON 如何對應
- 在同一次回覆裡傳送多則訊息,並遵守一次最多五則的限制
- 分辨「SDK 在本機擋下」和「LINE API 回 400」兩種錯誤,並用伺服器紀錄找出原因
機器人可以傳的訊息類型
到目前為止,機器人只回文字。其實 reply_message 的 messages 是一個串列,裡面可以放不同類型的訊息物件:
| 想傳 | SDK 的類別 | 必填欄位 |
|---|---|---|
| 文字 | TextMessage |
text |
| 貼圖 | StickerMessage |
package_id、sticker_id |
| 圖片 | ImageMessage |
original_content_url、preview_image_url |
| 影片 | VideoMessage |
original_content_url、preview_image_url |
| 語音 | AudioMessage |
original_content_url、duration(毫秒) |
| 位置 | LocationMessage |
title、address、latitude、longitude |
這些類別都從 linebot.v3.messaging 匯入。下面的範例把六種各傳一次,並印出 LINE 平台實際收到的內容。
逐步看:六種訊息送出去的樣子
注意輸出區:Python 裡寫 package_id,送到 LINE 的 JSON 變成 packageId。line_sim.outbox() 取出平台收到的訊息,它和 line_sim 其他函數一樣只存在於這個課程。
各類型的規則
官方文件對每種訊息都有規定,下面是寫機器人時最常遇到的幾條:
| 類型 | 規則 |
|---|---|
| 文字 | 最多 5000 字元。字數以 UTF-16 計算,所以有些 emoji 會算成兩個字元以上 |
| 貼圖 | 只能傳官方貼圖清單裡的貼圖,不是 LINE 貼圖小舖裡的每一款都能用 |
| 圖片 | HTTPS 網址;JPEG 或 PNG;原圖最大 10 MB,預覽圖最大 1 MB |
| 影片 | HTTPS 網址;mp4;最大 200 MB;預覽圖規則同上 |
| 語音 | HTTPS 網址;mp3 或 m4a;最大 200 MB |
| 位置 | title、address 各最多 100 字元 |
規則可能更新,寫程式時以官方的訊息物件說明為準。文字訊息還能放 LINE emoji(emojis 欄位),另外有 Text message v2 可以用 mention 標記使用者,這兩項這門課不會用到。
模擬環境有幾件事不檢查。 圖片、影片、語音的網址只檢查是不是 HTTPS,不會真的連過去,所以 example.com 也能通過。模擬手機也不載入任何外部圖片,圖片和貼圖都畫成灰色的佔位框。檔案格式、大小、網址能不能連線、貼圖在不在清單裡,都要接上真的 LINE 才看得到結果(第 13 課)。
一次回覆可以放多則訊息,上限是五則。超過上限和文字太長是兩種不同的錯誤,下面的範例兩種都試一次。
逐步看:超過上限時,錯誤在哪裡發生
使用者傳了三句話:第一句正常,第二句要回六則,第三句要回 5001 字。看輸出區和最後的 API 呼叫清單:三次回覆,API 只被呼叫了兩次。
動手做:一次回覆兩則不同類型的訊息
完成 build_messages(text):傳回要送出的訊息串列。
text是「集合地點」:回兩則,第一則文字「週三下午兩點在圖書館集合」,第二則位置(title='圖書館'、address='校園路 1 號'、latitude=24.97、longitude=121.19)text是「謝謝」:回一張貼圖(package_id='446'、sticker_id='1988')- 其他:回文字「請傳:集合地點」
想一想
程式在一次 reply_message 放了 6 個 TextMessage,沒有 try/except。實際發生什麼事?
ImageMessage 的 original_content_url 該放什麼?
程式傳 5001 字的文字,紀錄出現 Length must be between 0 and 5000,property 是 messages[0].text。這代表什麼?
想傳 LINE 貼圖小舖裡某一款自己喜歡的貼圖,用 StickerMessage 填上它的編號,會怎樣?
AudioMessage(original_content_url=..., duration=60000) 的 duration 是什麼意思?
重點整理
messages是串列,可以混合不同類型的訊息物件,順序就是手機上顯示的順序,一次最多五則- 圖片、影片、語音只傳網址(HTTPS),貼圖只能用官方清單裡的
- Python 寫
package_id,JSON 是packageId,SDK 負責轉換 - 超過五則:SDK 丟
ValidationError,還沒送出,到伺服器紀錄找原因 - 文字超過 5000 字元、網址不是 HTTPS:LINE API 回 400,
details指出哪一個欄位,到 API 紀錄找原因
機器人到現在都是收到訊息才回。下一課談另一種情況:沒有人傳訊息時,機器人怎麼主動通知使用者,以及為什麼 reply token 不能留到之後再用。