Learning Objectives
- 說出使用者、LINE App、LINE 平台、你的伺服器各自做什麼
- 說明 Webhook 與 Messaging API 的方向差別
- 說明官方帳號、Channel、Provider 的關係
- 從 webhook 的 JSON 找到事件類型、使用者編號與訊息內容
- 說出 Messaging API 能傳哪些類型的訊息
一則訊息經過的四個角色
傳訊息給 LINE 上的官方帳號,對方很快就回了,看起來像在和人聊天。這段過程有四個角色,其中只有一個是你要寫的:
| 角色 | 做什麼 | 由誰提供 |
|---|---|---|
| 使用者 | 在手機上傳訊息的人 | |
| LINE App | 手機上的程式,把訊息送出去、把回覆顯示出來 | LINE |
| LINE 平台(LINE Platform) | LINE 的伺服器,轉交訊息給你的程式,也接受你的程式呼叫 | LINE |
| 你的伺服器(bot server) | 你寫的程式,決定要回什麼 | 你 |
官方文件把流程寫成三步:
- 使用者傳訊息給官方帳號。
- LINE 平台把這個事件用 HTTP POST 送到你登記的網址,這個動作叫 Webhook。
- 你的程式看過事件內容,呼叫 Messaging API,請 LINE 平台把回覆送給使用者。
使用者手機 -- 訊息 --> LINE 平台 -- Webhook(HTTP POST)--> 你的伺服器
使用者手機 <-- 訊息 -- LINE 平台 <-- Messaging API(HTTP POST)-- 你的伺服器
使用者的手機從頭到尾都不會直接連到你的伺服器,所以你的程式碰不到使用者手機上的任何東西,只看得到 LINE 平台送來的內容。
這一軌的程式用的是真的 Flask 與官方的 line-bot-sdk(v3 寫法),在你的瀏覽器裡執行。LINE 平台與手機是模擬的,所以不需要申請帳號,也不會傳訊息給任何人;第 13 課再把同樣的程式接上真的 LINE。Flask 不熟的話可以先看後端開發軌。LINE 是 LY Corporation 的商標,這門課不是 LINE 官方的課程。
逐步看:webhook 收到了什麼
這是最小的 webhook,只有接收和印出,什麼都沒回。程式最下面的 line_sim 模擬使用者傳一句話。按播放,看 event 這個字典裡有什麼,也注意最後使用者收到幾則訊息。
Webhook 與 Messaging API 是兩個方向
一般的網站是瀏覽器來問伺服器。Webhook 反過來:有事發生時,對方主動打你的網址。少了它,你的程式就得不斷去問「有新訊息嗎」,既浪費又慢。
| Webhook | Messaging API | |
|---|---|---|
| 方向 | LINE 平台 → 你的伺服器 | 你的伺服器 → LINE 平台 |
| 誰是伺服器 | 你 | LINE |
| 什麼時候發生 | 使用者有動作時 | 你的程式決定要傳訊息時 |
| 用來 | 通知你發生了什麼 | 回覆、推送、查資料 |
所以你的程式同時扮演兩個角色:它是一個網站(等 LINE 平台來敲門),也是一個用戶端(去呼叫 LINE 的 API)。
因為 LINE 平台要連得到你的程式,Webhook 網址必須是公開的,而且官方規定要用 HTTPS,憑證也要由受信任的憑證機構簽發,自簽憑證不行(官方說明)。網址公開也代表任何人都能 POST 給它,第 3 課會處理這個問題。
下面的範例把兩個方向都放進來,用編號的 print 看先後順序。
逐步看:一句話走過兩個方向
注意 2 和 3 的順序:機器人呼叫 API 回覆使用者,是在 webhook 還沒回應的時候發生的。這段程式的細節下一課會一行一行講,這裡只看流程。
官方帳號、Channel、Provider
剛才的機器人在真實環境裡,要掛在一個官方帳號底下。這幾個名詞第 13 課實際申請時都會碰到:
| 名詞 | 是什麼 | 例子 |
|---|---|---|
| LINE 官方帳號(LINE Official Account) | 使用者加好友、傳訊息的對象 | 「課程機器人」這個帳號 |
| Channel | 你的服務使用 LINE 平台功能的通道。Messaging API Channel 綁定一個官方帳號,金鑰也屬於它 | 一個機器人一個 Channel |
| Provider | 提供服務的單位,底下可以有多個 Channel | 你本人、社團或公司 |
依現在的官方流程,要先建立官方帳號,再替它啟用 Messaging API,這時才會產生 Channel。Channel 裡有兩個金鑰,下一課會用到:Channel secret 與 Channel access token。
Messaging API 能做什麼
官方文件列出的主要功能,以及這一軌在哪裡會教:
| 功能 | 第幾課 |
|---|---|
| 回覆訊息、隨時主動推送訊息 | 2、6 |
| 傳送不同類型的訊息 | 5、7、8 |
| 取得使用者傳來的圖片、影片、語音、檔案 | 11 |
| 取得使用者的顯示名稱等個人資料 | 4 |
| 圖文選單(Rich Menu) | 7 |
| 查詢已傳送的訊息數量 | 6 |
| 群組聊天、Beacon、帳號連結 | 不在這一軌的範圍,可以看官方文件 |
機器人能傳的訊息類型:
| 類型 | 用途 |
|---|---|
| 文字(Text) | 最基本的訊息 |
| 貼圖(Sticker) | 官方清單裡的貼圖 |
| 圖片、影片、語音(Image、Video、Audio) | 提供檔案的 HTTPS 網址 |
| 位置(Location) | 地圖上的一個地點 |
| 範本(Template) | 固定版型,例如帶按鈕的卡片 |
| Flex Message | 用 JSON 自己排版的卡片 |
| Imagemap、Coupon | 這一軌不會細講 |
使用者傳來的訊息種類和機器人傳出去的不完全相同,例如使用者不能從 LINE App 傳出範本或 Flex Message。
動手做:讀懂 webhook 的內容
body 是一次 webhook 的內容,裡面有三個事件。完成 summarize(event),回傳這個事件的一行摘要:
- 文字訊息:
<userId> 傳了文字:<內容> - 其他訊息:
<userId> 傳了 <訊息的 type> follow事件(加好友):<userId> 加了好友
這一題只用 Python 字典,不需要 Flask。
想一想
使用者傳出一則訊息後,你的伺服器最先收到的 HTTP 請求是誰送來的?
下面哪一項是 Messaging API 這個方向的動作?
程式收到 webhook 後回了 200,但沒有呼叫任何 API。使用者會看到什麼?
下面這段程式會印出什麼?
關於 Webhook 網址,哪一項符合官方規定?
重點整理
- 四個角色:使用者、LINE App、LINE 平台、你的伺服器。你只寫最後一個
- Webhook 是 LINE 平台呼叫你,Messaging API 是你呼叫 LINE 平台
- webhook 的回應是給 LINE 平台看的;要讓使用者收到訊息,一定要呼叫 Messaging API
- 事件是 JSON:
events串列裡每一項有type、source,訊息事件還有message - 官方帳號是使用者看到的對象,Channel 是使用 LINE 平台功能的通道,Provider 是提供服務的單位
下一課從頭寫出第一個機器人,把剛才看到的流程變成你自己的程式。