""" -------一定要做步驟------- 如果以anaconda開啟vscode請先確認有安狀下列套件 ctrl+shift+x找Live Server並安裝。Live Server是很好用的html前端工具。安裝後,html文件內,右鍵往下找Open with Live server 在anaconda啟動頁面找anaconda_powershell_prompt下在下列套件,複製貼上就好 pip install fastapi uvicorn pydantic python-multipart aiofiles transformers huggingface_hub torch pip install transformers huggingface_hub requests torch torchvision pip install torch pip install scikit-learn pip install transformers torch pip install --upgrade torch --extra-index-url https://download.pytorch.org/whl/cu118 pip install --upgrade torch --index-url https://download.pytorch.org/whl/cpu pip install tqdm pip install easyocr pip install lime ---測試本地前後端連接--- ->打開terminal再來按+號 ->點git bash ->看到這表示正常,注意專案資料夾位置,像我的是D槽Project_PredictScamInfo (user@LAPTOP-GPASQDRA MINGW64 /d/Project_PredictScamInfo (Update)$) ->輸入 "cd Backend" (進入後端資料夾) ->(/d/Project_PredictScamInfo/Backend)位址有Backend就是OK ->輸入" uvicorn app:app --reload " ->(INFO: Will watch for changes in these directories: ['D:\\Project_PredictScamInfo\\Backend'] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit INFO: Waiting for application startup. INFO: Application startup complete.) INFO: Started reloader process [70644] using StatReload)這樣表示正常 -> ----正確顯示---- INFO: Uvicorn running on http://127.0.0.1:8000 INFO: Started reloader process... """ from fastapi import FastAPI, HTTPException, UploadFile, File, Form # 匯入 FastAPI 主功能模組與 HTTP 錯誤處理 from fastapi.middleware.cors import CORSMiddleware # 匯入 CORS 模組:用來允許前端跨來源存取 API from pydantic import BaseModel # 用於定義 API 的資料結構模型 from datetime import datetime # 處理時間格式(如分析時間戳) from typing import Optional, List # 型別註解:可選、列表 from bert_explainer import analyze_text, analyze_image # 匯入自定義的 BERT 模型分析函式 from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse import os import requests # ---------------- 初始化 FastAPI 應用 --------------- #團隊合作:前端工程師、測試人員知道你這API做什麼。會影響 /docs 文件清晰度與專案可讀性,在專案開發與交接時非常有用。 app = FastAPI( title="詐騙訊息辨識 API", # 顯示「詐騙訊息辨識 API」 description="使用 BERT 模型分析輸入文字是否為詐騙內容",# 說明這個 API 的功能與用途 version="1.0.0" # 顯示版本,例如 v1.0.0 ) app.mount("/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "..", "frontend")), name="static") """ ---------------- 設定 CORS(允許跨網域請求) ---------------- FastAPI提供的內建方法,用來加入中介層(middleware)。在請求抵達API前,或回應送出前,先做某些處理的程式邏輯。 (Cross-Origin Resource Sharing)瀏覽器的安全機制。 """ app.add_middleware( CORSMiddleware, # CORSMiddleware的功能就是「允許或拒絕」哪些來源能存取這個 API。 allow_origins=["*"], # 代表所有前端網域(如React前端、Vue前端)都可以發送請求。允許所有來源(不建議正式上線用 *) allow_credentials=True,# 允許前端攜帶登入憑證或 Cookies 等認證資訊。如果你使用身份驗證、JWT Token、Session cookie,就要開啟這個。若你是公開 API,沒用到登入,那設成 False 也可以。 allow_methods=["*"], # 允許 GET, POST, PUT, DELETE, OPTIONS 等方法 allow_headers=["*"], # 允許自訂標頭(如Content-Type)對應JS第46段。如果沒在後端加上這行,附加在HTTP請求或回應中的「額外資訊」會被擋住。 ) # ---------------- 請求與回應資料模型 ---------------- #繼承自pydantic.BaseModel。FastAPI用來驗證與定義資料結構的標準方式,Pydantic提供自動的: class TextAnalysisRequest(BaseModel):# 接收前端 text: str # 使用者輸入的訊息 user_id: Optional[str] = None # 可選的使用者 ID class TextAnalysisResponse(BaseModel): # 回傳前端 status: str # 預測結果:詐騙/正常 confidence: float # 信心分數(通常為 100~0) suspicious_keywords: List[str] # 可疑詞語清單(目前只會回傳風險分級顯示) highlighted_text: str analysis_timestamp: datetime # 分析完成時間(偏向資料庫用途,目前沒用到) """ 這是 FastAPI 的路由裝飾器,代表:當使用者對「根目錄 /」發送 HTTP GET 請求時,要執行下面這個函數。 "/" 是網址的根路徑,例如開啟:"http://localhost:8000/"就會觸發這段程式。 程式碼中/是API的根路徑。@app.get("/")代表使用者訪問網站最基本的路徑:http://localhost:8000/。這個/是URL路徑的根,不是資料夾。 """ @app.get("/", response_class=FileResponse) async def read_index(): return FileResponse(os.path.join(os.path.dirname(__file__), "..", "frontend", "index.html")) # 宣告一個非同步函數 root(),FastAPI 支援 async, # 寫出高效能的非同步處理(像連資料庫、外部 API 等) # 雖然這裡只是回傳資料,但仍建議保留 async # Q:什麼是"非同步函數"(async def)?A:因為有些操作「會花時間」:等後端模型處理,等資料庫查詢,等外部 API 回應。用於處理"等待型操作"如資料庫、模型等。 # 還有保留 async 可以讓你未來擴充時不用重構。 # ---------------- 根目錄測試 API ---------------- @app.get("/") async def root(): # 這是回傳給前端或使用者的一段 JSON 格式資料(其實就是 Python 的 dict) return { "message": "詐騙文字辨識 API 已啟動", # 說明這支 API 成功啟動 "version": "1.0.0", # 告訴使用者目前 API 的版本號 "status": "active", # 標示服務是否運行中(通常是 active 或 down) "docs": "/docs" # 告訴使用者:自動生成的 API 文件在 /docs # Q:/docs 是什麼?A:FastAPI 自動幫你建一個文件頁:看每個 API 的用途、參數格式 } """ ---------------- 主要 /predict 預測端點 ---------------- 當前端呼叫這個 API,並傳入一段文字時,這段程式會依序做以下事情: 程式碼內有特別註解掉資料庫部份,因為目前資料庫對該專案並不是特別重要,所以註解的方式,避免再Render佈署前後端網頁時出錯。 """ @app.post("/predict", response_model=TextAnalysisResponse) async def analyze_text_api(request: TextAnalysisRequest): try: print("📥 收到請求:", request.text) result = analyze_text(request.text) print("✅ 模型回傳結果:", result) return TextAnalysisResponse( status=result["status"], confidence=result["confidence"], suspicious_keywords=result["suspicious_keywords"], highlighted_text=result["highlighted_text"], analysis_timestamp=datetime.now(), ) except Exception as e: print("❌ 錯誤訊息:", str(e)) raise HTTPException(status_code=500, detail="內部伺服器錯誤") @app.post("/predict-image", response_model=TextAnalysisResponse) async def predict_image_api(file: UploadFile = File(...)): try: print("📷 收到圖片上傳:", file.filename) contents = await file.read() result = analyze_image(contents) return TextAnalysisResponse( status=result["status"], confidence=result["confidence"], suspicious_keywords=result["suspicious_keywords"], highlighted_text=result["highlighted_text"], analysis_timestamp=datetime.now() ) except Exception as e: print("❌ 圖片處理錯誤:", str(e)) raise HTTPException(status_code=500, detail="圖片辨識或預測失敗") """ 使用模型分析該文字(實際邏輯在 bert_explainer.py) 呼叫模型進行詐騙分析,這會呼叫模型邏輯(在bert_explainer.py),把輸入文字送去分析,得到像這樣的回傳結果(假設): result = { "status": "詐騙", "confidence": 0.93, "suspicious_keywords": ["繳費", "網址", "限時"] } # 回傳結果給前端。對應script.js第60段註解。 # status、confidence、suspicious_keywords在script.js、app.py和bert_explainer是對應的變數,未來有需大更動,必須注意一致性。 """