feat: 静默日跳过企微 webhook 推送
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -13,6 +15,7 @@ from daily.config import OUTPUT_DIR, ROOT, env_int, wecom_chunk_bytes
|
|||||||
from daily.wecom_split import split_wecom_messages
|
from daily.wecom_split import split_wecom_messages
|
||||||
|
|
||||||
_PUSH_GAP_MS = 300
|
_PUSH_GAP_MS = 300
|
||||||
|
_DATE_RE = re.compile(r"(\d{4}-\d{2}-\d{2})\.wecom\.md$")
|
||||||
|
|
||||||
|
|
||||||
def _load_webhook_key() -> str:
|
def _load_webhook_key() -> str:
|
||||||
@@ -43,6 +46,31 @@ def _resolve_report_path(arg: str | None) -> Path:
|
|||||||
raise RuntimeError("未找到 .wecom.md 报告,请先运行 python -m daily")
|
raise RuntimeError("未找到 .wecom.md 报告,请先运行 python -m daily")
|
||||||
|
|
||||||
|
|
||||||
|
def _push_gate_for_report(path: Path) -> dict | None:
|
||||||
|
match = _DATE_RE.search(path.name)
|
||||||
|
if not match:
|
||||||
|
return None
|
||||||
|
data_path = path.parent / f"{match.group(1)}.data.json"
|
||||||
|
if not data_path.exists():
|
||||||
|
data_path = OUTPUT_DIR / f"{match.group(1)}.data.json"
|
||||||
|
if not data_path.exists():
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
payload = json.loads(data_path.read_text(encoding="utf-8"))
|
||||||
|
except (OSError, ValueError):
|
||||||
|
return None
|
||||||
|
meta = payload.get("meta") or {}
|
||||||
|
gate = meta.get("push_gate")
|
||||||
|
return gate if isinstance(gate, dict) else None
|
||||||
|
|
||||||
|
|
||||||
|
def should_skip_push(report_path: Path) -> bool:
|
||||||
|
gate = _push_gate_for_report(report_path)
|
||||||
|
if not gate:
|
||||||
|
return False
|
||||||
|
return bool(gate.get("silent")) and not gate.get("should_push")
|
||||||
|
|
||||||
|
|
||||||
def _post_markdown(client: httpx.Client, url: str, content: str) -> None:
|
def _post_markdown(client: httpx.Client, url: str, content: str) -> None:
|
||||||
payload = {"msgtype": "markdown", "markdown": {"content": content}}
|
payload = {"msgtype": "markdown", "markdown": {"content": content}}
|
||||||
resp = client.post(url, json=payload)
|
resp = client.post(url, json=payload)
|
||||||
@@ -54,6 +82,9 @@ def _post_markdown(client: httpx.Client, url: str, content: str) -> None:
|
|||||||
|
|
||||||
def send_report(report_path: Path | None = None) -> None:
|
def send_report(report_path: Path | None = None) -> None:
|
||||||
path = _resolve_report_path(str(report_path) if report_path else None)
|
path = _resolve_report_path(str(report_path) if report_path else None)
|
||||||
|
if should_skip_push(path):
|
||||||
|
print(f"[silent] no push gate matched for {path.name}")
|
||||||
|
return
|
||||||
if not path.exists():
|
if not path.exists():
|
||||||
raise RuntimeError(f"报告文件不存在: {path}")
|
raise RuntimeError(f"报告文件不存在: {path}")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user