feat:linebot

1. change Dockerfile
2. change the way import
This commit is contained in:
2026-03-10 10:25:52 +08:00
parent 065d3d352a
commit c58e35c98d
6 changed files with 34 additions and 17 deletions

View File

@@ -1,6 +1,6 @@
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.config import DATABASE_URL
from config import DATABASE_URL
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(bind=engine)

View File

@@ -1,9 +1,7 @@
FROM python:3.11-slim
# 安裝 uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# 安裝 Playwright 需要的系統依賴
RUN apt-get update && apt-get install -y \
wget \
gnupg \
@@ -24,17 +22,15 @@ RUN apt-get update && apt-get install -y \
WORKDIR /app
# 複製 uv 設定檔
COPY pyproject.toml .
COPY uv.lock* .
# pyproject.toml 在 app/ 裡
COPY app/pyproject.toml .
COPY app/uv.lock* .
# 安裝依賴
RUN uv sync --frozen
# 安裝 Playwright Chromium
RUN uv run playwright install chromium
RUN uv run playwright install-deps chromium
COPY . .
# 只複製 app/ 的內容進去
COPY app/ .
CMD ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
CMD ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

View File

@@ -2,8 +2,8 @@ import re
from datetime import datetime, date
from sqlalchemy.orm import Session
from sqlalchemy import text
from app.db.models import User, LineUser, Category, CategoryRule, Expense
from app.db.session import SessionLocal
from db.models import User, LineUser, Category, CategoryRule, Expense
from db.session import SessionLocal
EXPENSE_TEMPLATE = (
"請填寫以下記帳資料後傳回:\n\n"

View File

@@ -1,5 +1,5 @@
from app.line import captcha_state
from app.line.expense import (
from line import captcha_state
from line.expense import (
EXPENSE_TEMPLATE,
save_expense,
delete_expense,

View File

@@ -9,8 +9,8 @@ from linebot.v3.messaging import (
)
from linebot.v3.webhooks import MessageEvent, TextMessageContent, FollowEvent
from linebot.v3.exceptions import InvalidSignatureError
from app.config import LINE_CHANNEL_ACCESS_TOKEN, LINE_CHANNEL_SECRET
from app.line.handlers import handle_text, handle_captcha
from config import LINE_CHANNEL_ACCESS_TOKEN, LINE_CHANNEL_SECRET
from line.handlers import handle_text, handle_captcha
router = APIRouter()
configuration = Configuration(access_token=LINE_CHANNEL_ACCESS_TOKEN)

21
app/config.py Normal file
View File

@@ -0,0 +1,21 @@
import os
from dotenv import load_dotenv
load_dotenv()
# LINE
LINE_CHANNEL_ACCESS_TOKEN = os.getenv("LINE_CHANNEL_ACCESS_TOKEN")
LINE_CHANNEL_SECRET = os.getenv("LINE_CHANNEL_SECRET")
LINE_USER_ID = os.getenv("LINE_USER_ID")
# DB
DATABASE_URL = os.getenv("DATABASE_URL")
# 發票
EINVOICE_USER = os.getenv("EINVOICE_USER")
EINVOICE_PASS = os.getenv("EINVOICE_PASS")
# Cloudinary
CLOUDINARY_CLOUD_NAME = os.getenv("CLOUDINARY_CLOUD_NAME")
CLOUDINARY_API_KEY = os.getenv("CLOUDINARY_API_KEY")
CLOUDINARY_API_SECRET = os.getenv("CLOUDINARY_API_SECRET")