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 import create_engine
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from app.config import DATABASE_URL from config import DATABASE_URL
engine = create_engine(DATABASE_URL) engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(bind=engine) SessionLocal = sessionmaker(bind=engine)

View File

@@ -1,9 +1,7 @@
FROM python:3.11-slim FROM python:3.11-slim
# 安裝 uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# 安裝 Playwright 需要的系統依賴
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
wget \ wget \
gnupg \ gnupg \
@@ -24,17 +22,15 @@ RUN apt-get update && apt-get install -y \
WORKDIR /app WORKDIR /app
# 複製 uv 設定檔 # pyproject.toml 在 app/ 裡
COPY pyproject.toml . COPY app/pyproject.toml .
COPY uv.lock* . COPY app/uv.lock* .
# 安裝依賴
RUN uv sync --frozen RUN uv sync --frozen
# 安裝 Playwright Chromium
RUN uv run playwright install chromium RUN uv run playwright install chromium
RUN uv run playwright install-deps 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 datetime import datetime, date
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy import text from sqlalchemy import text
from app.db.models import User, LineUser, Category, CategoryRule, Expense from db.models import User, LineUser, Category, CategoryRule, Expense
from app.db.session import SessionLocal from db.session import SessionLocal
EXPENSE_TEMPLATE = ( EXPENSE_TEMPLATE = (
"請填寫以下記帳資料後傳回:\n\n" "請填寫以下記帳資料後傳回:\n\n"

View File

@@ -1,5 +1,5 @@
from app.line import captcha_state from line import captcha_state
from app.line.expense import ( from line.expense import (
EXPENSE_TEMPLATE, EXPENSE_TEMPLATE,
save_expense, save_expense,
delete_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.webhooks import MessageEvent, TextMessageContent, FollowEvent
from linebot.v3.exceptions import InvalidSignatureError from linebot.v3.exceptions import InvalidSignatureError
from app.config import LINE_CHANNEL_ACCESS_TOKEN, LINE_CHANNEL_SECRET from config import LINE_CHANNEL_ACCESS_TOKEN, LINE_CHANNEL_SECRET
from app.line.handlers import handle_text, handle_captcha from line.handlers import handle_text, handle_captcha
router = APIRouter() router = APIRouter()
configuration = Configuration(access_token=LINE_CHANNEL_ACCESS_TOKEN) 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")