Files
ewoooc/scripts/archive/update_missing_images.py
ogt 1b4f3a7bbe
Some checks failed
CD Pipeline / deploy (push) Failing after 59s
feat: EwoooC 初始化 — 完整專案推版至 Gitea
- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml)
- 部署模式: rsync Python 檔案至 188 → docker restart (volume mount)
- Dockerfile/requirements 變動時自動重建 Docker image
- 部署通知: Telegram (開始/成功/失敗)
- 健康檢查: https://mo.wooo.work/health (最多 5 次重試)
- 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 01:21:13 +08:00

108 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# cSpell:ignore momo
"""
批次更新缺少圖片的商品
使用 i_code 從商品詳情頁直接獲取圖片 URL
"""
import os
import sys
import time
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 設定路徑
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, BASE_DIR)
from database.models import Product
from utils.image_url_builder import get_product_image_url
# 資料庫路徑
DB_PATH = os.path.join(BASE_DIR, 'data', 'momo_database.db')
def update_missing_images(batch_size: int = 50, delay: float = 0.5):
"""
批次更新缺少圖片的商品
Args:
batch_size: 每批處理的商品數量
delay: 每個請求之間的延遲(秒),避免請求過快
"""
print("🔄 開始批次更新缺少圖片的商品...\n")
if not os.path.exists(DB_PATH):
print(f"❌ 資料庫檔案不存在: {DB_PATH}")
return
try:
engine = create_engine(f"sqlite:///{DB_PATH}")
Session = sessionmaker(bind=engine)
session = Session()
# 查詢所有缺圖的商品
missing_products = session.query(Product).filter(
(Product.image_url == None) | (Product.image_url == '')
).limit(batch_size).all()
total = len(missing_products)
print(f"📊 找到 {total} 個缺圖商品(本次處理前 {batch_size} 個)\n")
if total == 0:
print("✅ 沒有需要更新的商品!")
return
success_count = 0
fail_count = 0
for idx, product in enumerate(missing_products, 1):
print(f"[{idx}/{total}] 處理: [{product.i_code}] {product.name[:50]}...")
try:
# 從商品詳情頁獲取圖片 URL
image_url = get_product_image_url(product.i_code)
if image_url:
product.image_url = image_url
session.commit()
print(f" ✅ 成功: {image_url}")
success_count += 1
else:
print(f" ⚠️ 無法獲取圖片(可能已下架或不存在)")
fail_count += 1
# 延遲,避免請求過快
time.sleep(delay)
except Exception as e:
print(f" ❌ 錯誤: {e}")
fail_count += 1
session.rollback()
session.close()
print("\n" + "=" * 60)
print("📊 更新結果")
print("=" * 60)
print(f"✅ 成功: {success_count}/{total} ({success_count/total*100:.1f}%)")
print(f"❌ 失敗: {fail_count}/{total} ({fail_count/total*100:.1f}%)")
if success_count > 0:
print(f"\n💡 提示: 已更新 {success_count} 個商品的圖片!")
if fail_count > 0:
print(f"\n⚠️ 注意: {fail_count} 個商品無法獲取圖片(可能已下架)")
except Exception as e:
print(f"❌ 批次更新失敗: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description='批次更新缺圖商品')
parser.add_argument('--batch-size', type=int, default=50, help='每批處理的商品數量(預設: 50')
parser.add_argument('--delay', type=float, default=0.5, help='每個請求之間的延遲秒數(預設: 0.5')
args = parser.parse_args()
update_missing_images(batch_size=args.batch_size, delay=args.delay)