scan_creative_reviews.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. import time
  10. from pathlib import Path
  11. _HERE = Path(__file__).parent
  12. sys.path.insert(0, str(_HERE.parent.parent))
  13. sys.path.insert(0, str(_HERE))
  14. from dotenv import load_dotenv # noqa: E402
  15. load_dotenv(_HERE / ".env")
  16. while str(_HERE) in sys.path:
  17. sys.path.remove(str(_HERE))
  18. sys.path.insert(0, str(_HERE))
  19. from tools.creative_review import scan_pending_reviews # noqa: E402
  20. logger = logging.getLogger("scan_creative_reviews")
  21. def _setup_logging() -> None:
  22. """初始化日志配置:设置格式、降噪第三方 logger,并尝试挂载 SLS 上报。"""
  23. from logging_setup import setup_logging
  24. setup_logging(level=os.getenv("LOG_LEVEL", "INFO"))
  25. def main() -> int:
  26. """扫描待审核创意的腾讯官方审核结果并回写 DB,返回退出码(0=成功,1=有错误)。"""
  27. _setup_logging()
  28. lookback_hours = int(os.getenv("CREATIVE_REVIEW_LOOKBACK_HOURS", "72"))
  29. limit = int(os.getenv("CREATIVE_REVIEW_SCAN_LIMIT", "1000"))
  30. batch_size = int(os.getenv("CREATIVE_REVIEW_BATCH_SIZE", "100"))
  31. logger.info(
  32. "event=creative_review stage=scan result=started lookback_hours=%d "
  33. "limit=%d batch_size=%d",
  34. lookback_hours, limit, batch_size,
  35. )
  36. started = time.monotonic()
  37. try:
  38. summary = scan_pending_reviews(
  39. lookback_hours=lookback_hours,
  40. limit=limit,
  41. batch_size=batch_size,
  42. )
  43. except Exception:
  44. logger.exception(
  45. "event=creative_review stage=scan result=failed duration_ms=%d",
  46. int((time.monotonic() - started) * 1000),
  47. )
  48. raise
  49. logger.info(
  50. "event=creative_review stage=scan result=%s duration_ms=%d summary=%s",
  51. "failed" if summary.get("errors") else "succeeded",
  52. int((time.monotonic() - started) * 1000),
  53. json.dumps(summary, ensure_ascii=False),
  54. )
  55. return 0 if not summary.get("errors") else 1
  56. if __name__ == "__main__":
  57. sys.exit(main())