--- title: AI Advance Final Project emoji: 🏢 colorFrom: red colorTo: green sdk: docker pinned: false license: mit short_description: Final Project's Line bot Server --- # Hugging Face Space LINE Bot (FastAPI) 這是一個精美且架構完整的 LINE Bot 範例,專為部署於 **Hugging Face Spaces**(或任何支援 Python 容器的平台)設計。本專案使用 Python **FastAPI** 與最新的 **`line-bot-sdk` v3**。 --- ## ✨ 核心功能特色 1. **精準群組 @ 提及過濾**:在群組中,Bot 會自動比對 LINE 內建的 `@提及` 元資料(透過 Bot 本身 `userId` 進行安全比對)與名稱文字,只有在被 `@` 時才進行回覆,避免干擾群組對話。 2. **模擬 Diffusion 圖片生成**:當在對話中收到包含 `@create image` 的訊息時,Bot 會自動回覆美麗的模擬生成圖片與預覽圖。 3. **雙重排程主動推播(Push Message)架構**: - **背景執行緒排程**:內建一個背景 thread,每隔隨機時間區間(預設為 30 分鐘至 2 小時隨機)自動向活躍群組或使用者推播關懷訊息。 - **外部 Cron 端點**:預留 `/cron/push` 的 HTTP GET/POST 路由,可配合外部 cron 服務(例如 Hugging Face Space 自身的 Cron 功能、GitHub Actions、UptimeRobot 等)進行定時戳記。 4. **超酷 Web Dashboard**:首頁設有採用 Glassmorphism(玻璃擬物化)風格的精美儀表板,當您直接瀏覽 Space 的網頁時,可即時確認 Bot 的連線狀態、環境變數設定狀態以及目前活躍的推播目標數。 5. **防止 LINE 逾時機制**:使用 FastAPI 的 `BackgroundTasks`,在驗證簽章後立即回覆 LINE 平台 HTTP 200,並在背景處理對話與回覆邏輯,徹底解決 LINE 平台要求的 1-2 秒內必須回覆造成的 Timeout 問題。 --- ## 📂 檔案目錄說明 - `app.py`:FastAPI 主程式,包含路由設計、Webhook 簽章驗證、@ 提及比對邏輯、圖片回覆與背景推播排程器。 - `requirements.txt`:列出專案所依賴的套件。 - `.env`:環境變數範本檔(填寫金鑰用)。 --- ## 🛠️ 本地開發與測試步驟 ### 1. 安裝套件 請確保安裝了 Python 3.9+,並在終端機執行: ```bash pip install -r requirements.txt ``` ### 2. 設定環境變數 請編輯同目錄下的 `.env` 檔案,填入您的 LINE Bot 金鑰(您可以前往 [LINE Developers Console](https://developers.line.biz/) 取得): ```env LINE_CHANNEL_ACCESS_TOKEN=你的Channel_Access_Token LINE_CHANNEL_SECRET=你的Channel_Secret DEFAULT_TARGET_ID=你的UserID或GroupID_供測試推播用(選填) ``` ### 3. 啟動 Local 服務 ```bash python app.py ``` 此時服務會運行在 `http://localhost:7860`。 ### 4. 使用 ngrok 進行外部通道測試 (選填) LINE Webhook 必須使用 HTTPS 網址。您可以使用 ngrok 將本地服務對外公開: ```bash ngrok http 7860 ``` 取得 ngrok 產生的 `https://xxxx.ngrok-free.app` 網址後,在 LINE Developer Console 的 Webhook URL 欄位填入: `https://xxxx.ngrok-free.app/callback` 並點擊 **Verify**。 --- ## 🚀 部署至 Hugging Face Space Hugging Face Spaces 提供極為便利的 FastAPI (Docker/Python) 部署方式: ### 1. 建立 Space 1. 前往 [Hugging Face](https://huggingface.co/) 並登入。 2. 點擊右上角個人頭像,選擇 **New Space**。 3. 輸入 Space 名稱。 4. **SDK 選擇**: 選擇 **Docker** 或是 **Blank** (如果您想用預設的 Python SDK)。 - *推薦做法*:SDK 選擇 **Docker** ➡️ 範本選擇 **FastAPI**,這最適合運行自訂 FastAPI 專案。 - 或者選擇 **Blank**,然後在上傳檔案時加入 `Dockerfile`(如下方說明)。 ### 2. 設定 Secrets (關鍵步驟 🔒) 為了安全起見,請**不要**將金鑰寫死在 `.env` 中並推送到 Hugging Face(因為 Space 預設可能是公開的)。 1. 在您剛建立好的 Space 頁面中,點擊 **Settings** 頁籤。 2. 往下滾動找到 **Variables and Secrets** 區塊。 3. 點擊 **New secret** 按鈕,新增以下兩個 Secrets: - Name: `LINE_CHANNEL_ACCESS_TOKEN` / Value: `(您的 LINE Channel Access Token)` - Name: `LINE_CHANNEL_SECRET` / Value: `(您的 LINE Channel Secret)` - (選填) Name: `DEFAULT_TARGET_ID` / Value: `(您的 LINE User ID 或測試群組 ID)` ### 3. 上傳檔案 將 `app.py`、`requirements.txt` 上傳至您的 Space 儲存庫即可。 如果您使用的是 Docker 模式,請上傳以下內容的 `Dockerfile`: ```dockerfile # Read the doc: https://huggingface.co/docs/hub/spaces-sdks-docker # you will also find guides on how best to write your Dockerfile FROM python:3.9 # Create a non-root user with UID 1000 to comply with Hugging Face Space security guidelines RUN useradd -m -u 1000 user # Set up environment variables for the new user ENV HOME=/home/user \ PATH=/home/user/.local/bin:$PATH # Set the working directory to user's home app directory WORKDIR $HOME/app # Switch to the non-root user USER user # Copy requirements and install dependencies COPY --chown=user requirements.txt requirements.txt RUN pip install --no-cache-dir --upgrade -r requirements.txt # Copy all project files into the container COPY --chown=user . . # Expose port 7860 (Hugging Face Spaces default port) EXPOSE 7860 # Run the FastAPI application using uvicorn CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"] ``` 上傳完成後,Hugging Face 會自動編譯並啟動您的 Space! ### 4. 設定 LINE Webhook 當 Space 狀態顯示為 **Running** 後: 1. 複製您 Space 的 App 網址(通常格式為 `https://[使用者名稱]-[Space名稱].hf.space`)。 2. 在 LINE Developer Console 的 Webhook URL 填入: `https://[使用者名稱]-[Space名稱].hf.space/callback` 3. 儲存並啟用 **Use Webhook**。 --- ## 💬 測試 Bot 1. 將 Bot 邀請入群組或直接與其私訊。 2. 在群組中打:`@Bot名稱 測試看看`,Bot 會回覆。 3. 在群組中打:`@create image`,Bot 會回覆一張生成好的模擬圖片! 4. 訪問 `https://[您的HF_SPACE_URL]/cron/push` 可立即手動觸發一次推播測試。