2025年10月11日 星期六

在 render.com 佈署 Python 網頁應用程式 (三)

在前一篇測試中已順利將 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 請求 :



沒有留言 :