Learning Objectives
- 說明 webhook 路由、WebhookHandler、reply_message 各自負責什麼
- 用 Flask 與 line-bot-sdk 寫出收到文字就回覆的機器人
- 說明 channel secret 與 access token 的用途,並用環境變數管理
- 依訊息內容回覆不同的文字
機器人程式由兩段組成
上一課看到,使用者傳訊息後,LINE 平台會把事件用 HTTP POST 送到你的伺服器,你的程式再呼叫 LINE 的 API 回覆。程式因此分成兩段:
| 段落 | 做什麼 | 用到 |
|---|---|---|
| 收 | 一個 Flask 路由接住 LINE 送來的 POST,驗證真的是 LINE 送的 | WebhookHandler |
| 回 | 依事件內容決定要說什麼,呼叫 Messaging API | MessagingApi.reply_message |
這一軌用的是真的 Flask 與官方的 line-bot-sdk(v3 寫法),在你的瀏覽器裡執行。LINE 平台是模擬的,不需要先申請帳號,也不會傳訊息給任何人。程式碼不用改就能接上真的 LINE,第 13 課會實際接一次。
程式需要兩個金鑰,都是在 LINE Developers Console 取得:
| 名稱 | 用途 |
|---|---|
| Channel secret | 驗證 webhook 真的來自 LINE(第 3 課) |
| Channel access token | 呼叫 Messaging API 時證明你是這個官方帳號 |
這兩個值不可以寫在程式裡或傳上 GitHub,所以範例都從環境變數讀。
逐步看:一句話走過哪些程式
程式最下面用 line_sim 模擬使用者傳一句「你好」。按播放,注意呼叫堆疊:什麼時候進到 callback,什麼時候進到 on_text。
在自己的電腦上執行時多了什麼
剛才的程式和真實環境相同,只差最後的連線:
| 這個課程 | 真實環境 | |
|---|---|---|
| 使用者傳訊息 | 模擬手機或 line_sim |
LINE App |
| Webhook | 模擬平台直接交給 Flask | LINE 平台經 HTTPS 送到你的網址 |
| 呼叫 API | 模擬平台收下並畫在手機上 | 送到 api.line.me |
| 金鑰 | 課程準備好的假值 | Developers Console 取得 |
安裝與環境變數的設定方式留到第 13 課。先在這裡把機器人的邏輯學好,不用每次都開手機測試。
動手做:關鍵字回覆
完成 on_text:訊息是「幾點上課」時回「週三下午兩點」,其他訊息回「我還在學習中」。程式最下面模擬了三則訊息。
想一想
reply_message 需要 reply token 的原因是什麼?
使用者傳了一張貼圖,程式只有 @handler.add(MessageEvent, message=TextMessageContent)。會發生什麼?
Channel access token 不小心傳上公開的 GitHub,應該怎麼做?
callback 為什麼要 return 'OK'?
重點整理
- webhook 是一個 Flask 路由:取出簽章與內容,交給
handler.handle,回 200 @handler.add登記「哪種事件由哪個函數處理」,沒有符合的就不處理- 回覆要呼叫 Messaging API,並交回事件帶的 reply token
- Channel secret 驗證 webhook,access token 呼叫 API,兩個都放環境變數
下一課打開 webhook 來看:簽章是怎麼算的,為什麼一定要驗證。