National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 05

傳送各種訊息

文字、貼圖、圖片、位置,一次最多五則
Interaction實作 25 minute(s)

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 依內容決定要回什麼,其中「課表」和「海報」目前有問題,你要從面板找出原因再修好。

這裡沒有用 try/except,所以程式出錯時 Flask 會回 500,錯誤訊息出現在「伺服器紀錄」。模擬平台回的錯誤文字是簡化過的,真實 LINE 的用語可能不同,看懂是哪一個欄位有問題就好。

動手做:一次回覆兩則不同類型的訊息

完成 build_messages(text):傳回要送出的訊息串列。

  • text 是「集合地點」:回兩則,第一則文字「週三下午兩點在圖書館集合」,第二則位置(title='圖書館'、address='校園路 1 號'、latitude=24.97、longitude=121.19)
  • text 是「謝謝」:回一張貼圖(package_id='446'、sticker_id='1988')
  • 其他:回文字「請傳:集合地點」
你的輸出
預期輸出

想一想

1.

程式在一次 reply_message 放了 6 個 TextMessage,沒有 try/except。實際發生什麼事?

2.

ImageMessage 的 original_content_url 該放什麼?

3.

程式傳 5001 字的文字,紀錄出現 Length must be between 0 and 5000,property 是 messages[0].text。這代表什麼?

4.

想傳 LINE 貼圖小舖裡某一款自己喜歡的貼圖,用 StickerMessage 填上它的編號,會怎樣?

5.

AudioMessage(original_content_url=..., duration=60000) 的 duration 是什麼意思?

第 1 次作答

重點整理

  • messages 是串列,可以混合不同類型的訊息物件,順序就是手機上顯示的順序,一次最多五則
  • 圖片、影片、語音只傳網址(HTTPS),貼圖只能用官方清單裡的
  • Python 寫 package_id,JSON 是 packageId,SDK 負責轉換
  • 超過五則:SDK 丟 ValidationError,還沒送出,到伺服器紀錄找原因
  • 文字超過 5000 字元、網址不是 HTTPS:LINE API 回 400,details 指出哪一個欄位,到 API 紀錄找原因

機器人到現在都是收到訊息才回。下一課談另一種情況:沒有人傳訊息時,機器人怎麼主動通知使用者,以及為什麼 reply token 不能留到之後再用。

這一課完成了!
Next lesson:回覆與推送
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。