From 423d7a573ce4735800a2499b686d44090e4d3412 Mon Sep 17 00:00:00 2001 From: henry yo Date: Mon, 9 Mar 2026 00:52:51 +0800 Subject: [PATCH] add app files --- app/.python-version | 1 + app/Dockerfile | 17 + app/README.md | 0 app/create_rich_menu.py | 100 +++ app/invoice_fetcher.py | 216 +++++++ app/main.py | 208 ++++++ app/pyproject.toml | 20 + app/requirement.txt | 0 app/rich_menu.png | Bin 0 -> 36558 bytes app/uv.lock | 1344 +++++++++++++++++++++++++++++++++++++++ 10 files changed, 1906 insertions(+) create mode 100644 app/.python-version create mode 100644 app/Dockerfile create mode 100644 app/README.md create mode 100644 app/create_rich_menu.py create mode 100644 app/invoice_fetcher.py create mode 100644 app/main.py create mode 100644 app/pyproject.toml create mode 100644 app/requirement.txt create mode 100644 app/rich_menu.png create mode 100644 app/uv.lock diff --git a/app/.python-version b/app/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/app/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/app/Dockerfile b/app/Dockerfile new file mode 100644 index 0000000..4843d47 --- /dev/null +++ b/app/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.11-slim + +# 安裝 uv +COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv + +WORKDIR /app + +# 複製 uv 設定檔 +COPY pyproject.toml . +COPY uv.lock* . + +# 安裝依賴 +RUN uv sync --frozen + +COPY . . + +CMD ["uv", "run", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] \ No newline at end of file diff --git a/app/README.md b/app/README.md new file mode 100644 index 0000000..e69de29 diff --git a/app/create_rich_menu.py b/app/create_rich_menu.py new file mode 100644 index 0000000..678126a --- /dev/null +++ b/app/create_rich_menu.py @@ -0,0 +1,100 @@ +import os +import requests +from PIL import Image, ImageDraw, ImageFont +from dotenv import load_dotenv + +load_dotenv("../.env") + +ACCESS_TOKEN = os.getenv("LINE_CHANNEL_ACCESS_TOKEN") +HEADERS = {"Authorization": f"Bearer {ACCESS_TOKEN}"} + +def create_image(): + W, H = 2500, 843 + img = Image.new("RGB", (W, H), color="#FFFFFF") + draw = ImageDraw.Draw(img) + + # 分隔線 + draw.line([(833, 0), (833, H)], fill="#DDDDDD", width=4) + draw.line([(1666, 0), (1666, H)], fill="#DDDDDD", width=4) + + # 背景色 + draw.rectangle([0, 0, 833, H], fill="#F0F9FF") + draw.rectangle([834, 0, 1666, H], fill="#F0FFF4") + draw.rectangle([1667, 0, W, H], fill="#FFF9F0") + + sections = [ + ("記帳", "類別 金額", 416), + ("查今天", "今日明細", 1249), + ("查本月", "本月統計", 2083), + ] + + try: + # Windows 支援中文的字型 + font_large = ImageFont.truetype("C:/Windows/Fonts/msjh.ttc", 120) + font_mid = ImageFont.truetype("C:/Windows/Fonts/msjh.ttc", 80) + font_small = ImageFont.truetype("C:/Windows/Fonts/msjh.ttc", 55) + except: + font_large = ImageFont.load_default() + font_mid = font_large + font_small = font_large + + for title, subtitle, x in sections: + draw.text((x, 280), title, font=font_mid, anchor="mm", fill="#222222") + draw.text((x, 450), subtitle, font=font_small, anchor="mm", fill="#888888") + + img.save("rich_menu.png") + print("✅ 圖片建立完成") + +def create_rich_menu(): + data = { + "size": {"width": 2500, "height": 843}, + "selected": True, + "name": "Finance Menu", + "chatBarText": "選單", + "areas": [ + { + "bounds": {"x": 0, "y": 0, "width": 833, "height": 843}, + "action": {"type": "message", "text": "記帳說明"} + }, + { + "bounds": {"x": 833, "y": 0, "width": 833, "height": 843}, + "action": {"type": "message", "text": "查今天"} + }, + { + "bounds": {"x": 1666, "y": 0, "width": 834, "height": 843}, + "action": {"type": "message", "text": "查本月"} + } + ] + } + + res = requests.post( + "https://api.line.me/v2/bot/richmenu", + headers={**HEADERS, "Content-Type": "application/json"}, + json=data + ) + rich_menu_id = res.json()["richMenuId"] + print(f"✅ Rich Menu 建立:{rich_menu_id}") + return rich_menu_id + +def upload_image(rich_menu_id): + with open("rich_menu.png", "rb") as f: + res = requests.post( + f"https://api-data.line.me/v2/bot/richmenu/{rich_menu_id}/content", + headers={**HEADERS, "Content-Type": "image/png"}, + data=f + ) + print(f"✅ 圖片上傳:{res.status_code}") + +def set_default(rich_menu_id): + res = requests.post( + f"https://api.line.me/v2/bot/user/all/richmenu/{rich_menu_id}", + headers=HEADERS + ) + print(f"✅ 設為預設選單:{res.status_code} {res.text}") + +if __name__ == "__main__": + create_image() + rich_menu_id = create_rich_menu() + upload_image(rich_menu_id) + set_default(rich_menu_id) + print("\n🎉 Rich Menu 設定完成!重新開啟 LINE Bot 查看效果") \ No newline at end of file diff --git a/app/invoice_fetcher.py b/app/invoice_fetcher.py new file mode 100644 index 0000000..2fea149 --- /dev/null +++ b/app/invoice_fetcher.py @@ -0,0 +1,216 @@ +import asyncio +import base64 +import os +import requests +import anthropic +import urllib3 +from datetime import datetime, timedelta +from dotenv import load_dotenv +from playwright.async_api import async_playwright +from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, text +from sqlalchemy.orm import declarative_base, sessionmaker + +urllib3.disable_warnings() +load_dotenv("../.env") + +EINVOICE_USER = os.getenv("EINVOICE_USER") +EINVOICE_PASS = os.getenv("EINVOICE_PASS") +ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY") + +# 本地直接連 localhost +DATABASE_URL = os.getenv("LOCAL_DATABASE_URL") +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(bind=engine) +Base = declarative_base() + +class Transaction(Base): + __tablename__ = "transactions" + id = Column(Integer, primary_key=True, index=True) + user_id = Column(String) + category = Column(String) + amount = Column(Float) + note = Column(String, nullable=True) + created_at = Column(DateTime, default=datetime.now) + +def solve_captcha(img_b64: str) -> str: + client = anthropic.Anthropic(api_key=ANTHROPIC_API_KEY) + msg = client.messages.create( + model="claude-haiku-4-5-20251001", + max_tokens=10, + messages=[{ + "role": "user", + "content": [ + { + "type": "image", + "source": { + "type": "base64", + "media_type": "image/png", + "data": img_b64 + } + }, + { + "type": "text", + "text": "這是驗證碼圖片,只有5個數字,只回傳這5個數字,不要其他任何文字" + } + ] + }] + ) + return msg.content[0].text.strip() + +async def login_and_get_token() -> str | None: + async with async_playwright() as p: + browser = await p.chromium.launch(headless=True) + page = await browser.new_page() + + # 載入登入頁拿 login_challenge + browser = await p.chromium.launch(headless=False) + page = await browser.new_page() + await page.goto("https://www.einvoice.nat.gov.tw/accounts/login/mw") + await page.wait_for_timeout(8000) + url = page.url + print(f"目前 URL: {url}") + + from urllib.parse import parse_qs + fragment = url.split("?")[-1] if "?" in url else "" + params = parse_qs(fragment) + login_challenge = params.get("login_challenge", [None])[0] + print(f"login_challenge: {login_challenge}") + + # 拿驗證碼 + res = requests.get( + "https://service-mc.einvoice.nat.gov.tw/act/login/api/act002i/captcha", + verify=False + ) + captcha_data = res.json() + captcha_token = captcha_data["token"] + captcha_text = solve_captcha(captcha_data["image"]) + print(f"驗證碼: {captcha_text}") + + # 登入 + res = requests.post( + "https://service-mc.einvoice.nat.gov.tw/act/login/api/client/doLogin", + json={ + "loginType": "U", + "userType": "MW", + "loginChallenge": login_challenge, + "captchaToken": captcha_token, + "captcha": captcha_text, + "customId": EINVOICE_USER, + "password": EINVOICE_PASS, + }, + verify=False + ) + data = res.json() + redirect_url = data.get("redirectTo") + print(f"redirectTo: {redirect_url}") + + if not redirect_url: + print(f"登入失敗: {data}") + await browser.close() + return None + + # 跟隨 redirect 讓 token 存進 localStorage + await page.goto(redirect_url) + await page.wait_for_load_state("domcontentloaded") + await page.wait_for_timeout(8000) # 等久一點 + + url = page.url + print(f"redirect 後 URL: {url}") + + # 印出所有 localStorage + # 同時檢查 localStorage 和 sessionStorage + local_keys = await page.evaluate("Object.keys(localStorage)") + session_keys = await page.evaluate("Object.keys(sessionStorage)") + print("localStorage keys:", local_keys) + print("sessionStorage keys:", session_keys) + await page.wait_for_timeout(3000) + for key in session_keys: + val = await page.evaluate(f"sessionStorage.getItem('{key}')") + print(f" session {key}: {val[:80] if val else None}") + + token = await page.evaluate("sessionStorage.getItem('token') || localStorage.getItem('token')") + print(f"token: {token[:30] if token else 'None'}") + + await browser.close() + return token + +async def fetch_invoices(token: str, days: int = 7) -> list: + end_date = datetime.now() + start_date = end_date - timedelta(days=days) + + # 格式要有毫秒 + def to_iso(dt): + return dt.strftime("%Y-%m-%dT%H:%M:%S.") + f"{dt.microsecond // 1000:03d}Z" + + headers = {"authorization": f"Bearer {token}"} # 不去掉 L + + res = requests.post( + "https://service-mc.einvoice.nat.gov.tw/btc/cloud/api/btc502w/getSearchCarrierInvoiceListJWT", + headers=headers, + json={ + "cardCode": "", + "carrierId2": "", + "searchStartDate": to_iso(start_date), + "searchEndDate": to_iso(end_date), + "invoiceStatus": "all", + "isSearchAll": "true" + }, + verify=False + ) + print(f"JWT status: {res.status_code}") + print(f"JWT response: {res.text[:200]}") + jwt_token = res.text.strip().strip('"') + + res = requests.post( + "https://service-mc.einvoice.nat.gov.tw/btc/cloud/api/btc502w/searchCarrierInvoice", + headers=headers, + json={"token": jwt_token}, + verify=False + ) + await page.wait_for_timeout(3000) + print(f"Invoice status: {res.status_code}") + print(f"Invoice response: {res.text[:300]}") + print(f"拿到 {len(res.json().get('invoices', []))} 筆發票") + # return res.json().get("content", []) + +def save_invoices(invoices: list): + db = SessionLocal() + saved = 0 + try: + for inv in invoices: + existing = db.query(Transaction).filter( + Transaction.note == inv["invoiceNumber"] + ).first() + if existing: + continue + db.add(Transaction( + user_id="auto_import", + category=inv["sellerName"], + amount=inv["totalAmount"], + note=inv["invoiceNumber"], + created_at=datetime.fromisoformat( + inv["invoiceDate"].replace("Z", "+00:00") + ) + )) + saved += 1 + db.commit() + print(f"✅ 新增 {saved} 筆,略過 {len(invoices) - saved} 筆重複") + finally: + db.close() + +async def main(): + print("開始抓取發票...") + token = await login_and_get_token() + if not token: + print("登入失敗") + return + + invoices = await fetch_invoices(token) + print(f"拿到 {len(invoices)} 筆發票") + for inv in invoices: + print(f" {inv['invoiceDate'][:10]} {inv['sellerName']} ${inv['totalAmount']}") + + save_invoices(invoices) + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..999b77c --- /dev/null +++ b/app/main.py @@ -0,0 +1,208 @@ +import os +import re +from dotenv import load_dotenv +from fastapi import FastAPI, Request, HTTPException +from linebot.v3 import WebhookHandler +from linebot.v3.messaging import ( + Configuration, + ApiClient, + MessagingApi, + ReplyMessageRequest, + TextMessage, +) +from linebot.v3.webhooks import MessageEvent, TextMessageContent, FollowEvent +from linebot.v3.exceptions import InvalidSignatureError +from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, text +from sqlalchemy.orm import declarative_base, sessionmaker +from datetime import datetime + + +load_dotenv() + +app = FastAPI() + +# LINE 設定 +configuration = Configuration(access_token=os.getenv("LINE_CHANNEL_ACCESS_TOKEN")) +handler = WebhookHandler(os.getenv("LINE_CHANNEL_SECRET")) + +# DB 設定 +DATABASE_URL = os.getenv("DATABASE_URL") +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(bind=engine) +Base = declarative_base() + +# 資料表 +class Transaction(Base): + __tablename__ = "transactions" + id = Column(Integer, primary_key=True, index=True) + user_id = Column(String) + category = Column(String) + amount = Column(Float) + note = Column(String, nullable=True) + created_at = Column(DateTime, default=datetime.now) + +Base.metadata.create_all(bind=engine) + +# Webhook endpoint +@app.post("/webhook") +async def webhook(request: Request): + signature = request.headers.get("X-Line-Signature", "") + body = await request.body() + try: + handler.handle(body.decode(), signature) + except InvalidSignatureError: + raise HTTPException(status_code=400, detail="Invalid signature") + return "OK" + +@handler.add(MessageEvent, message=TextMessageContent) +def handle_message(event): + user_id = event.source.user_id + text = event.message.text.strip() + reply = parse_and_save(user_id, text) + + with ApiClient(configuration) as api_client: + line_bot_api = MessagingApi(api_client) + line_bot_api.reply_message( + ReplyMessageRequest( + reply_token=event.reply_token, + messages=[TextMessage(text=reply)] + ) + ) + +@handler.add(FollowEvent) +def handle_follow(event): + with ApiClient(configuration) as api_client: + line_bot_api = MessagingApi(api_client) + line_bot_api.reply_message( + ReplyMessageRequest( + reply_token=event.reply_token, + messages=[TextMessage(text=( + "👋 歡迎使用 Myfinance 記帳 Bot!\n\n" + "📝 記帳格式:\n" + "類別 金額\n" + "類別 金額 備註\n\n" + "範例:\n" + "早餐 80\n" + "午餐 120 便當\n" + "交通 50 捷運\n\n" + "📊 查詢指令:\n" + "查今天 → 今日明細\n" + "查本月 → 本月統計\n\n" + "開始記帳吧!💪" + ))] + ) + ) + +def parse_and_save(user_id: str, text: str) -> str: + # 查詢指令 + if text == "查今天": + return query_today(user_id) + if text == "查本月": + return query_month(user_id) + if text == "記帳說明": + return ( + "📝 記帳格式:\n" + "類別 金額\n" + "類別 金額 備註\n\n" + "範例:\n" + "早餐 80\n" + "午餐 120 便當\n" + "交通 50 捷運\n\n" + "輸入後 Bot 會自動記錄 ✅" + ) + # 刪除指令:刪除 1 或 刪除 早餐 + if text.startswith("刪除 "): + target = text[3:].strip() + return delete_transaction(user_id, target) + + # 記帳格式:「早餐 80」或「早餐 80 備註」 + match = re.match(r"^(\S+)\s+(\d+(?:\.\d+)?)(?:\s+(.+))?$", text) + if match: + category = match.group(1) + amount = float(match.group(2)) + note = match.group(3) + save_transaction(user_id, category, amount, note) + return f"✅ 已記錄:{category} ${amount:.0f}" + (f"({note})" if note else "") + + return "格式錯誤 😅\n記帳請輸入:類別 金額\n例如:早餐 80\n\n查詢請輸入:查今天 / 查本月" + +def save_transaction(user_id, category, amount, note): + db = SessionLocal() + try: + db.add(Transaction(user_id=user_id, category=category, amount=amount, note=note)) + db.commit() + finally: + db.close() + +def delete_transaction(user_id: str, target: str) -> str: + db = SessionLocal() + try: + today = datetime.now().date() + rows = db.query(Transaction).filter( + Transaction.user_id == user_id, + text("DATE(created_at) = :today") + ).params(today=today).all() + + if not rows: + return "今天還沒有記錄 📭" + + # 用編號刪除 + if target.isdigit(): + idx = int(target) - 1 + if idx < 0 or idx >= len(rows): + return f"沒有第 {target} 筆記錄,請先輸入「查今天」確認編號" + row = rows[idx] + db.delete(row) + db.commit() + return f"✅ 已刪除:{row.category} ${row.amount:.0f}" + + # 用類別刪除(刪最後一筆) + matched = [r for r in rows if r.category == target] + if not matched: + return f"今天沒有「{target}」的記錄" + row = matched[-1] + db.delete(row) + db.commit() + return f"✅ 已刪除:{row.category} ${row.amount:.0f}" + + finally: + db.close() + +def query_today(user_id): + db = SessionLocal() + try: + today = datetime.now().date() + rows = db.query(Transaction).filter( + Transaction.user_id == user_id, + text("DATE(created_at) = :today") + ).params(today=today).all() + if not rows: + return "今天還沒有記錄 📭" + total = sum(r.amount for r in rows) + lines = [ + f"{i+1}. {r.category} ${r.amount:.0f}" + (f"({r.note})" if r.note else "") + for i, r in enumerate(rows) + ] + return "📋 今日記錄:\n" + "\n".join(lines) + f"\n\n💰 合計:${total:.0f}\n\n🗑 刪除請輸入:刪除 編號\n例如:刪除 1" + finally: + db.close() + +def query_month(user_id): + db = SessionLocal() + try: + now = datetime.now() + rows = db.query(Transaction).filter( + Transaction.user_id == user_id, + text("EXTRACT(YEAR FROM created_at) = :year AND EXTRACT(MONTH FROM created_at) = :month") + ).params(year=now.year, month=now.month).all() + if not rows: + return "本月還沒有記錄 📭" + total = sum(r.amount for r in rows) + # 依類別統計 + summary = {} + for r in rows: + summary[r.category] = summary.get(r.category, 0) + r.amount + lines = [f"{cat}:${amt:.0f}" for cat, amt in sorted(summary.items(), key=lambda x: -x[1])] + return f"📊 本月統計({now.month}月):\n" + "\n".join(lines) + f"\n\n💰 總計:${total:.0f}" + finally: + db.close() \ No newline at end of file diff --git a/app/pyproject.toml b/app/pyproject.toml new file mode 100644 index 0000000..321d536 --- /dev/null +++ b/app/pyproject.toml @@ -0,0 +1,20 @@ +[project] +name = "app" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.13" +dependencies = [ + "anthropic>=0.84.0", + "ddddocr==1.4.11", + "fastapi>=0.135.1", + "line-bot-sdk>=3.22.0", + "numpy>=2.4.2", + "pillow>=12.1.1", + "playwright>=1.58.0", + "psycopg2-binary>=2.9.11", + "pytesseract>=0.3.13", + "python-dotenv>=1.2.2", + "sqlalchemy>=2.0.48", + "uvicorn>=0.41.0", +] diff --git a/app/requirement.txt b/app/requirement.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/rich_menu.png b/app/rich_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..5d804674b72c55900817c0be2ec57bf5e58487ed GIT binary patch literal 36558 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