scan_creative_reviews.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. logging.basicConfig(
  22. level=os.getenv("LOG_LEVEL", "INFO"),
  23. format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
  24. datefmt="%H:%M:%S",
  25. )
  26. for noisy in ("httpx", "httpcore", "config", "db.config"):
  27. logging.getLogger(noisy).setLevel(logging.WARNING)
  28. try:
  29. from tools.sls_setup import attach_sls_handler
  30. attach_sls_handler()
  31. except Exception as e:
  32. logger.warning("[sls] 挂载异常(降级为本地 only):%s", e)
  33. def main() -> int:
  34. _setup_logging()
  35. lookback_hours = int(os.getenv("CREATIVE_REVIEW_LOOKBACK_HOURS", "72"))
  36. limit = int(os.getenv("CREATIVE_REVIEW_SCAN_LIMIT", "1000"))
  37. batch_size = int(os.getenv("CREATIVE_REVIEW_BATCH_SIZE", "100"))
  38. logger.info(
  39. "[creative_review] 扫描启动 lookback_hours=%d limit=%d batch_size=%d",
  40. lookback_hours, limit, batch_size,
  41. )
  42. summary = scan_pending_reviews(
  43. lookback_hours=lookback_hours,
  44. limit=limit,
  45. batch_size=batch_size,
  46. )
  47. logger.info(
  48. "[creative_review] 扫描完成 %s",
  49. json.dumps(summary, ensure_ascii=False),
  50. )
  51. return 0 if not summary.get("errors") else 1
  52. if __name__ == "__main__":
  53. sys.exit(main())