BrianChuan
fix
d1bd264
|
Raw
History Blame Contribute Delete
6.17 kB
---
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` 可立即手動觸發一次推播測試。