在前一篇測試中已順利將 Mapleboard 主機中的 serverless 服務移植到 render.com 雲端平台上, 在此 serverless app 上可線上新增函式模組來執行如下功能 :
- 資料蒐集 / 爬蟲任務 (新聞, 股價, 匯率)
- Bot 後台 API (LINE / Telegram 擴充功能)
- 自動化工具 / AI 應用 (定時排程, 文件處理, 翻譯/摘要)
這相當於是在 render.com 上實作了一個 AWS Lambda 或 GCF 的核心功能.
函式模組的程式結構如下 :
# func_module.py
def main(request, **kwargs):
config=kwargs.get('config', {}) # 預設為空 dict
result='do something'
return result
函式名稱固定為 main(), 必須傳入 request 物件與 **kwargs 參數, 此處關鍵字參數 **kwargs 是一個字典, 用來接收主程式 serverless.py 傳遞之密碼或 API Key 等系統參數, 就算函式功能中用不到也必須傳入 **kwargs 參數, 接收時可呼叫 get() 方法取得鍵 (例如 config) 之值.
不過 Render 的免費 Hobby 方案有如下限制 :
- 若服務在 15 分鐘內未收到請求就會進入休眠狀態.
- 每個服務執行時間上限為 100 秒.
- 無法使用 Shell, Job, Disk 等功能.
所以基本上只能做為測試之用, 若要穩定運行需購買付費方案. 本篇旨在測試利用 Render 所提供的 HTTPS 網址做為 LINE Bot 的 web hook.
1. 重新佈署服務 (添加新套件) :
如果要在 render.com 上利用 serverless 架設聊天機器人後端 app, 除了要安裝 LINE Bot 套件外, 還有 Telegram 套件, 以及兩個主要的 LLM API 套件 (OpenAI & Gemini), 所以我修改了 repo 上的 requirements.txt, 添加所需的套件如下 :
line-bot-sdk
python-telegram-bot
google-generativeai
openai
全部套件參考 :
然後手動重新佈署服務 :
2. LINE Echo bot 聊天機器人 :
之前我使用架設於 Mapleboard 上的 Serverless 平台做為 web hook 寫了一個鸚鵡聊天機器人 (Echo bot), 可參考這篇做法在 Render 上複製此項測試 :
首先在 serverless 平台上新增一個 linebot_echo.py 模組 :
# linebot_echo.py
from flask import abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
def main(request, **kwargs):
# 取得主程式讀取 .env 後以 config 字典傳遞之 LINE 權杖與金鑰
config=kwargs.get('config', {})
secret=config.get('LINE_CHANNEL_SECRET')
token=config.get('LINE_CHANNEL_ACCESS_TOKEN')
# 檢查是否有傳遞密鑰與權杖
if not secret or not token:
return {"error": "LINE_CHANNEL_SECRET or LINE_CHANNEL_ACCESS_TOKEN is missing"}
# 建立呼叫 LINE API 與處理 webhook 的物件
line_bot_api=LineBotApi(token) # 發送回覆訊息的 API 客戶端
handler=WebhookHandler(secret) # 驗證簽章與分派事件的 webhook 處理器
# 註冊 MessageEvent + TextMessage 事件的處理器
# 注意:這段必須寫在 handler.handle() 之前, 否則事件不會被處理
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text)
)
# 取得 X-Line-Signature (用於簽章驗證) 與 request body (即使用者訊息)
signature=request.headers.get("X-Line-Signature", "")
body=request.get_data(as_text=True)
# 驗證簽章是否正確, 防止偽造的請求 (確保是 LINE 平台發出的請求)
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400, "Invalid signature")
# 處理成功回傳狀態訊息 (LINE 要求回應 HTTP 200 才視為成功)
return {"status": "ok"}
存檔後將滑鼠移到 linebot_echo 模組的 "執行" 連結處, 按滑鼠右鍵點選 "複製連結網址" 即可取得此回應程式的 web hook 網址 :
# https://serverless-fdof.onrender.com/function/linebot_echo
此網址無法直接執行, 必須經過驗證是從 LINE 伺服器發出的才會回應.
接下來是登入 Line 開發者控制台將 Webhook URL 改成這個網址 :
按 "Recently visited channels" 內的 "Messaging API" 連結 :
切到第二個頁籤 "Messaging API" 後往下拉到 "Webhook setting" 欄, 先將原先 Mapleboard 的 Webhook 網址記下來備份 :
# https://flask.tony1966.cc/function/linebot_echo
然後按 "Edit" 鈕, 複製上面取得的 Render 的 Webhook 網址貼上去按 Update 鈕更新 :
然後按 Verify 鈕驗證 Webhook 網址是否有效 :
出現 Success 表示此 Webhook 可順利連線到 Render 後台的 Flask 伺服器. Verify webhook 時 LINE 平台會對伺服器發送一個 HTTP POST 請求, 這個請求只是一個測試事件 (內容是一個類似 {"events":[]} 的空 JSON 物件, 請求中不會帶使用者訊息, 也不會檢查簽章, 只要伺服器能在合理時間內回傳 HTTP 200 OK, 就會顯示 "Success" :
總之, Verify 只是測試伺服器是否能正確回應 200 OK 而已.
這樣便完成後台程式的設定了, 打開手機 LINE App, 點選 "好友名單" 或 "群組", 切換到 "官方帳號", 找到之前 LINE Bot 測試中建立的 "小狐狸事務所聊天機器人", 點進去輸入任何訊息都會收到一模一樣的訊息被傳回來 :
在 Render 的儀錶板右下方日誌裡也可以看到這個 POST 請求 :











沒有留言 :
張貼留言