scan_creative_reviews.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """Scan Tencent official dynamic creative review results.
  2. Run every 2 hours in production. This scanner only reads submitted creatives
  3. from DB and writes official review results/rejection facts back to DB.
  4. """
  5. import json
  6. import logging
  7. import os
  8. import sys
  9. from pathlib import Path
  10. _HERE = Path(__file__).parent
  11. sys.path.insert(0, str(_HERE.parent.parent))
  12. sys.path.insert(0, str(_HERE))
  13. from dotenv import load_dotenv # noqa: E402
  14. load_dotenv(_HERE / ".env")
  15. while str(_HERE) in sys.path:
  16. sys.path.remove(str(_HERE))
  17. sys.path.insert(0, str(_HERE))
  18. from tools.creative_review import scan_pending_reviews # noqa: E402
  19. logger = logging.getLogger("scan_creative_reviews")
  20. def _setup_logging() -> None:
  21. """初始化日志配置:设置格式、降噪第三方 logger,并尝试挂载 SLS 上报。"""
  22. logging.basicConfig(
  23. level=os.getenv("LOG_LEVEL", "INFO"),
  24. format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
  25. datefmt="%H:%M:%S",
  26. )
  27. for noisy in ("httpx", "httpcore", "config", "db.config"):
  28. logging.getLogger(noisy).setLevel(logging.WARNING)
  29. try:
  30. from tools.sls_setup import attach_sls_handler
  31. attach_sls_handler()
  32. except Exception as e:
  33. logger.warning("[sls] 挂载异常(降级为本地 only):%s", e)
  34. def main() -> int:
  35. """扫描待审核创意的腾讯官方审核结果并回写 DB,返回退出码(0=成功,1=有错误)。"""
  36. _setup_logging()
  37. lookback_hours = int(os.getenv("CREATIVE_REVIEW_LOOKBACK_HOURS", "72"))
  38. limit = int(os.getenv("CREATIVE_REVIEW_SCAN_LIMIT", "1000"))
  39. batch_size = int(os.getenv("CREATIVE_REVIEW_BATCH_SIZE", "100"))
  40. logger.info(
  41. "[creative_review] 扫描启动 lookback_hours=%d limit=%d batch_size=%d",
  42. lookback_hours, limit, batch_size,
  43. )
  44. summary = scan_pending_reviews(
  45. lookback_hours=lookback_hours,
  46. limit=limit,
  47. batch_size=batch_size,
  48. )
  49. logger.info(
  50. "[creative_review] 扫描完成 %s",
  51. json.dumps(summary, ensure_ascii=False),
  52. )
  53. return 0 if not summary.get("errors") else 1
  54. if __name__ == "__main__":
  55. sys.exit(main())