"""Scan Tencent official dynamic creative review results. Run every 2 hours in production. This scanner only reads submitted creatives from DB and writes official review results/rejection facts back to DB. """ import json import logging import os import sys from pathlib import Path _HERE = Path(__file__).parent sys.path.insert(0, str(_HERE.parent.parent)) sys.path.insert(0, str(_HERE)) from dotenv import load_dotenv # noqa: E402 load_dotenv(_HERE / ".env") while str(_HERE) in sys.path: sys.path.remove(str(_HERE)) sys.path.insert(0, str(_HERE)) from tools.creative_review import scan_pending_reviews # noqa: E402 logger = logging.getLogger("scan_creative_reviews") def _setup_logging() -> None: """初始化日志配置:设置格式、降噪第三方 logger,并尝试挂载 SLS 上报。""" logging.basicConfig( level=os.getenv("LOG_LEVEL", "INFO"), format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", datefmt="%H:%M:%S", ) for noisy in ("httpx", "httpcore", "config", "db.config"): logging.getLogger(noisy).setLevel(logging.WARNING) try: from tools.sls_setup import attach_sls_handler attach_sls_handler() except Exception as e: logger.warning("[sls] 挂载异常(降级为本地 only):%s", e) def main() -> int: """扫描待审核创意的腾讯官方审核结果并回写 DB,返回退出码(0=成功,1=有错误)。""" _setup_logging() lookback_hours = int(os.getenv("CREATIVE_REVIEW_LOOKBACK_HOURS", "72")) limit = int(os.getenv("CREATIVE_REVIEW_SCAN_LIMIT", "1000")) batch_size = int(os.getenv("CREATIVE_REVIEW_BATCH_SIZE", "100")) logger.info( "[creative_review] 扫描启动 lookback_hours=%d limit=%d batch_size=%d", lookback_hours, limit, batch_size, ) summary = scan_pending_reviews( lookback_hours=lookback_hours, limit=limit, batch_size=batch_size, ) logger.info( "[creative_review] 扫描完成 %s", json.dumps(summary, ensure_ascii=False), ) return 0 if not summary.get("errors") else 1 if __name__ == "__main__": sys.exit(main())