昨天完成了 SubWise 後端部署到 Render,成功讓 Flask API 在雲端運行。不過目前的 SubWise 還只是一個「活著的 Backend」,使用者還沒有辦法透過 LINE 與它互動。
今天的目標是:建立 LINE Bot 與 Flask Backend 之間的 Webhook 通訊,讓 LINE 平台可以將使用者事件傳送到 SubWise。
今天完成後,SubWise 的架構會從「使用者 → (尚未連接)→ Flask Backend」,進化成:
LINE 使用者 → LINE Platform → Webhook URL → Render Flask Backend → /callback API → WebhookHandler 驗證
Webhook 的概念跟傳統 API 不同:
LINE Bot 的使用者傳送訊息後,LINE Platform 會主動 POST 到我們設定的 URL,這也是為什麼需要另外建立一個接收事件用的 Endpoint。
在專案目錄下啟動虛擬環境,安裝 LINE Messaging API SDK:
.\venv\Scripts\Activate.ps1
pip install line-bot-sdk
pip freeze > requirements.txt
更新 requirements.txt,讓 Render 部署時能自動安裝相同套件。
新增一支路由,作為接收 LINE 事件的入口:
@app.route("/callback", methods=["POST"])
def callback():
body = request.get_data(as_text=True)
return "OK"
為了確認請求真的來自 LINE 而不是其他來源,需要使用 Channel Secret 與 X-Line-Signature 進行驗證:
from linebot.v3 import WebhookHandler
from linebot.v3.messaging import Configuration
from linebot.v3.exceptions import InvalidSignatureError
configuration = Configuration(
access_token=os.getenv("LINE_CHANNEL_ACCESS_TOKEN")
)
handler = WebhookHandler(
os.getenv("LINE_CHANNEL_SECRET")
)
接著修改 callback,加入簽章驗證邏輯:
@app.route("/callback", methods=["POST"])
def callback():
signature = request.headers.get("X-Line-Signature")
body = request.get_data(as_text=True)
try:
handler.handle(body, signature)
except InvalidSignatureError:
return "Invalid signature", 400
return "OK"
現在 Flask 已經具備接收 LINE Webhook 的能力。
程式碼修改完成,且成功部署上線:
進入 LINE Developers Console,在 Messaging API 頁籤設定:
Webhook URL:https://subwise-line-bot.onrender.com/callback
按下 Verify,成功顯示 Success,代表 LINE 平台已經可以連線到 SubWise Backend。
接著開啟 Use webhook,讓 LINE 事件正式送往我們的 Server。
1. NameError: name 'Configuration' is not defined
推送到 GitHub、Render 自動重新部署後第一次失敗,原因是少了 from linebot.v3.messaging import Configuration 這行 import,補上後重新 commit 即解決。
2. AttributeError: 'NoneType' object has no attribute 'encode'
第二次部署仍然失敗,原因是 Render 讀不到 LINE_CHANNEL_SECRET。本機能正常運作是因為有 .env 檔案,但 Render 並不會讀取本機的 .env。解決方式是改到 Render 的 Environment Variables 設定頁面,手動加入 LINE_CHANNEL_SECRET、LINE_CHANNEL_ACCESS_TOKEN、GEMINI_API_KEY 三組金鑰,重新部署後成功。
最後進行真實測試:用 LINE Bot 傳送「測試」訊息,查看 Render Logs,成功看到:POST /callback HTTP/1.1" 200 -
(目前 Bot 還不會回覆訊息,因為訊息處理邏輯會在 Day 05 實作)
代表整條通訊鏈路成功建立:
LINE → Webhook → Render → Flask callback() → HTTP 200
雲端後端跟 LINE 的通訊管道已經正式打通!明天 Day 05,我將開始實作 LINE Echo Bot,讓 SubWise 第一次真正回覆使用者訊息。我們明天見!