使用 Docker 與 Python 快速建置適用於 LINE Messaging API 的 Webhook 伺服器

2025/01/07 14 3 程式設計 , 伺服器 , Python

LINE Py Webhook 是我專為 LINE Messaging API 設計的 Webhook 伺服器範例,利用 Python 與 Flask 框架實現快速開發,並結合 Docker Compose 以簡化部署流程。此專案的主要功能是處理 LINE 官方帳號的訊息互動,當使用者傳送訊息時,伺服器會自動回應 "您說了:+ 使用者傳送的內容",藉此提供即時的雙向通訊體驗。值得一提的是,本範例採用了 Reply API 的回覆方式,不會計入傳訊量費用,適合進行測試或開發用途。為了確保服務穩定性與安全性,建議在雲端或 VPS 環境中部署此應用,並透過 Nginx 配合 Let's Encrypt 憑證進行 HTTPS 加密。Docker Compose 的引入更進一步降低了系統設定的複雜性,透過簡單的指令即可完成容器化應用的建構與啟動,大幅提升專案的可維護性與移植性。

此專案的核心程式碼——「app.py」,負責處理 LINE Messaging API 傳入的 Webhook 請求,包含簽名驗證與訊息回覆邏輯。開發者僅需替換 Channel Access Token 與 Channel Secret,即可輕鬆整合到自己的 LINE 官方帳號中。此外,Dockerfile 以精簡的方式定義了應用的依賴與執行環境,並搭配 docker-compose.yml 文件進行多容器協作設定,若要加入更多其他依賴容器也是可行的,此 Webhook 伺服器預設在 5000 埠運行。更新與維護方面,專案提供了一個實用的 Shell 腳本——「update_system.sh」,可一鍵完成容器停止、程式碼更新、映像檔重建與服務重新啟動。

🔗 GitHub 儲存庫:https://github.com/qwe987299/line_py_webhook

📝 app.py

from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage

app = Flask(__name__)

# 替換為您的 Channel Access Token 和 Channel Secret
line_bot_api = LineBotApi('Channel Access Token')
handler = WebhookHandler('Channel Secret')


@app.route("/callback", methods=['POST'])
def callback():
    # 獲取請求中的 Line 簽名
    signature = request.headers['X-Line-Signature']
    # 獲取請求主體
    body = request.get_data(as_text=True)
    try:
        # 驗證簽名並處理請求
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'

# 處理文字訊息事件


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    user_message = event.message.text
    reply_text = "您說了:" + user_message
    # 回覆使用者
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=reply_text)
    )


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

app.py 是 LINE Py Webhook 專案的核心程式碼,負責處理來自 LINE Messaging API 的 Webhook 請求,並實現訊息的即時互動。此程式基於 Python 的 Flask 框架開發,具備輕量化和高擴展性的特點。程式中設定了伺服器的端點 /callback,用於接收並處理 LINE 傳遞的 POST 請求。在請求進入時,程式首先驗證其簽名是否正確,以確保數據來源的安全性,接著將訊息內容傳遞給指定的處理邏輯。在處理訊息時,app.py 使用了 LINE Bot SDK 提供的功能,專注於接收文字訊息並回覆。程式的核心邏輯在 handle_message 方法中實現,它會提取使用者傳送的訊息內容,並回傳一段經過簡單處理的文字,例如 "您說了:" 加上使用者的訊息。這種即時互動的設計不僅適合基礎開發,也提供了一個簡單直觀的範例,幫助開發者快速上手。開發者僅需替換 Channel Access Token 和 Channel Secret,即可實現與自己的 LINE 官方帳號整合,為開發或測試提供了穩定可靠的基礎框架。

📝 docker-compose.yml

services:
  line_py_webhook:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: line_py_webhook
    ports:
      - "5000:5000"
    environment:
      - FLASK_ENV=production

docker-compose.yml 是此專案的重要組件,負責定義應用的容器化部署配置,透過簡單的 YAML 格式來描述服務的運行環境與相關設定。該文件定義了一個名為 line_py_webhook 的服務,指定了應用的建構上下文與使用的 Dockerfile,確保容器能正確地從項目目錄中生成。服務預設綁定本地的 5000 埠,對應於 Flask 應用內部的伺服器埠號,方便開發者在本地或遠端進行測試與調試。該文件還允許設定環境變數,例如 FLASK_ENV,被設置為生產模式,確保應用在部署時以穩定且高效能的狀態運行。這樣的配置使得服務在多個環境中保持一致性,降低因環境差異導致的錯誤風險。透過 docker-compose.yml,開發者可以簡化容器的啟動與管理,僅需執行簡單的 docker compose up 命令,即可完成從映像檔建構到容器啟動的所有流程,無需手動執行繁瑣的命令。這種設計充分發揮了 Docker Compose 的優勢,使得應用的部署與維護更加高效和易於擴展,是現代應用開發的理想選擇之一。

📝 Dockerfile

# 使用 Python 基礎映像檔
FROM python:3.9

# 設定工作目錄
WORKDIR /app

# 複製程式碼到容器
COPY app.py /app/
COPY requirements.txt /app/

# 安裝所需套件
RUN pip install --no-cache-dir -r requirements.txt

# 暴露 Flask 預設的 5000 埠
EXPOSE 5000

# 啟動應用
CMD ["python", "app.py"]

Dockerfile 是此專案中定義應用容器化環境的基礎配置文件,負責描述如何構建應用的 Docker 映像檔。在此專案中,Dockerfile 使用 Python 3.9 作為基礎映像檔,為應用提供一個穩定且輕量化的運行環境。該文件首先設置了工作目錄 /app,並將專案的核心文件 app.pyrequirements.txt 複製到容器內。接下來,Dockerfile 透過執行 pip install 指令來安裝 Flask 與 LINE Bot SDK 等應用的必要依賴,確保容器具備執行程式所需的完整環境。同時,文件也將 Flask 的預設埠 5000 暴露,以便容器與外部進行通訊。最後,透過指定 CMD,定義了容器啟動時的執行指令,讓應用程式以 python app.py 的方式啟動。

📝 requirements.txt

Flask==2.3.2
line-bot-sdk==2.2.1

requirements.txt 是專案中用來管理 Python 套件依賴的文件,列出了應用程式執行所需的所有必要庫及其版本。該文件在專案中包含兩個主要套件:Flaskline-bot-sdkFlask 是輕量級的 Python Web 框架,負責提供 Webhook 的伺服器端功能,處理 HTTP 請求和回應。line-bot-sdk 則是 LINE Messaging API 的官方軟體開發工具包,用於與 LINE 平台進行互動,實現訊息的接收與回覆。透過這份文件,開發者能輕鬆管理專案的依賴項,並確保應用在不同環境中的一致性。

📝 update_system.sh

#!/bin/bash

# 停止並移除與 Docker Compose 相關的容器和映像檔
echo "Stopping and removing existing containers..."
docker compose down

# 更新程式碼
echo "Pulling latest code from Git..."
git pull

# 重建映像檔
echo "Building new Docker image..."
docker compose build --no-cache

# 啟動服務
echo "Starting new container..."
docker compose up -d

echo "Update and deployment completed successfully!"

update_system.sh 是專案中的自動化腳本,用於簡化應用的更新與部署流程。該腳本整合了一系列 Docker Compose 操作指令,包含停止現有容器、拉取最新的 Git 儲存庫程式碼、重建映像檔以及重新啟動服務等步驟。透過這一腳本,開發者只需執行單一命令,即可完成整個更新過程,避免了手動操作可能導致的錯誤或遺漏。腳本首先透過 docker compose down 停止並移除現有的容器,然後執行 git pull 確保本地程式碼與遠端儲存庫同步。接下來,它使用 docker compose build --no-cache 重新建構 Docker 映像檔,確保新的程式碼和依賴被正確應用,最後以 docker compose up -d 啟動更新後的容器。


▲ 實際上在終端機是這樣 git clone 與部屬的,基本上執行指令 sh update_system.sh 就能搞定首次安裝與執行。

▲ 可以在專案目錄下透過指令 docker compose ps 查看容器運作狀態,如果要停止伺服器則可以透過指令 docker compose down

贊助廣告 ‧ Sponsor advertisements

留言區 / Comments

萌芽論壇