From 0c642bbb32a14c3ccf0a2fc58f5d7a22074a8253 Mon Sep 17 00:00:00 2001 From: admin Date: Sat, 12 Sep 2026 06:41:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=90=E5=8F=96=E6=9C=9F?= =?UTF-8?q?=E5=8F=B7=E5=8C=BA=E9=97=B4=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sreweekly-digest/SKILL.md | 1 + sreweekly-digest/scripts/README.md | 3 +++ sreweekly-digest/scripts/sreweekly.py | 23 ++++++++++++++++++----- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/sreweekly-digest/SKILL.md b/sreweekly-digest/SKILL.md index eaa63a8..13424ea 100644 --- a/sreweekly-digest/SKILL.md +++ b/sreweekly-digest/SKILL.md @@ -37,6 +37,7 @@ python3 $S # 扫描 feed → 新期存 html/ + 登记 manifes python3 $S --check # 输出 NEW:533,532 或 NONE python3 $S --extract pending # 提取所有未处理期 python3 $S --extract 533 # 指定期 / latest / all(已提取的需 --force 覆盖) +python3 $S --extract 433..464 # 期号区间(缺失的期告警跳过) python3 $S --status # 状态表(期号/日期/HTML/提取/文章数) # 可选: --feed URL / --dir PATH / --force(数据目录默认 ~/Workspace/nexus/sreweekly/) ``` diff --git a/sreweekly-digest/scripts/README.md b/sreweekly-digest/scripts/README.md index e1f1e26..f4cf37f 100644 --- a/sreweekly-digest/scripts/README.md +++ b/sreweekly-digest/scripts/README.md @@ -48,6 +48,7 @@ python3 sreweekly.py --check # 提取指定期文章为 markdown(默认联网抓正文) python3 sreweekly.py --extract 533 +python3 sreweekly.py --extract 433..464 # 期号区间(缺失的期告警跳过,不阻断) python3 sreweekly.py --extract latest # 最新一期 python3 sreweekly.py --extract pending # 所有未提取的期(n8n 每日推荐) python3 sreweekly.py --extract all # 全部(配合 --force 覆盖) @@ -62,6 +63,8 @@ python3 sreweekly.py --backfill 1..533 # 全站回溯(500+ 期,约 12- python3 sreweekly.py --backfill 450 # 只抓单期 # 回溯完再走标准提取流程: python3 sreweekly.py --extract pending +# 或只提取回溯的那段区间: +python3 sreweekly.py --extract 430..533 ``` ## 选项 diff --git a/sreweekly-digest/scripts/sreweekly.py b/sreweekly-digest/scripts/sreweekly.py index 21f4210..5d43b12 100644 --- a/sreweekly-digest/scripts/sreweekly.py +++ b/sreweekly-digest/scripts/sreweekly.py @@ -23,6 +23,7 @@ SRE Weekly 抓取与文章提取脚本 python3 sreweekly.py # 扫描 feed,新增期保存为 HTML 并登记 manifest python3 sreweekly.py --check # 只检查有无新期,输出 NEW:533,532 或 NONE(供 n8n 分支) python3 sreweekly.py --extract ID # 提取指定期(如 533)的文章 → markdown(默认抓正文) + python3 sreweekly.py --extract 433..464 # 提取期号区间(只处理 manifest 中已登记的期) python3 sreweekly.py --extract latest # 提取最新一期 python3 sreweekly.py --extract pending # 提取所有尚未提取的期(n8n 每日流程推荐) python3 sreweekly.py --extract all # 提取全部(含已提取的,需配合 --force 覆盖) @@ -145,11 +146,11 @@ MONTHS = {m: i for i, m in enumerate( ["January","February","March","April","May","June", "July","August","September","October","November","December"], 1)} -def parse_backfill_range(spec): +def parse_id_range(spec, flag_name="--backfill"): """'400..500' → (400, 500);'450' → (450, 450)。""" m = re.match(r"^\s*(\d+)\s*(?:\.\.\s*(\d+))?\s*$", spec or "") if not m: - sys.exit(f"❌ --backfill 参数格式错误(示例 400..500 或 450): {spec}") + sys.exit(f"❌ {flag_name} 参数格式错误(示例 400..500 或 450): {spec}") lo = int(m.group(1)); hi = int(m.group(2) or m.group(1)) if lo > hi: lo, hi = hi, lo return lo, hi @@ -179,7 +180,7 @@ def extract_title_from_page(html_text, iid): return t or f"SRE Weekly Issue #{iid}" def cmd_backfill(args, manifest, base_dir): - lo, hi = parse_backfill_range(args.backfill) + lo, hi = parse_id_range(args.backfill, "--backfill") html_dir = os.path.join(base_dir, "html") page_cache_dir = os.path.join(base_dir, "pages") # 存整页 HTML 作缓存 os.makedirs(html_dir, exist_ok=True) @@ -515,7 +516,7 @@ def render_markdown(article, entry, body_md=None, fetch_error=None): return "\n".join(out) + "\n" def resolve_targets(target, manifest): - """解析 --extract 的目标: ID / latest / pending / all → 期号列表。""" + """解析 --extract 的目标: ID / FROM..TO / latest / pending / all → 期号列表。""" issues = manifest["issues"] if target == "latest": ids = sorted(issues.keys(), key=lambda x: (isinstance(x, str), x)) @@ -527,6 +528,18 @@ def resolve_targets(target, manifest): if target == "all": return list(issues.keys()) t = str(target) + if ".." in t: + lo, hi = parse_id_range(t, "--extract") + ids, missing = [], [] + for n in range(lo, hi + 1): + iid = str(n) + (ids if iid in issues else missing).append(iid) + if missing: + preview = ",".join(missing[:10]) + ("..." if len(missing) > 10 else "") + print(f"⚠️ 范围 {lo}..{hi} 中 {len(missing)} 期不在 manifest(跳过): {preview}", file=sys.stderr) + if not ids: + sys.exit(f"❌ 范围 {lo}..{hi} 中没有已登记的期,请先 --backfill 或扫描") + return ids if t not in issues: sys.exit(f"❌ 期 #{t} 不在 manifest 中,请先扫描") return [t] @@ -574,7 +587,7 @@ def main(): ap.add_argument("--feed", default=DEFAULT_FEED, help=f"RSS 地址(默认 {DEFAULT_FEED})") ap.add_argument("--dir", default=DEFAULT_DIR, help=f"工作目录(默认 {DEFAULT_DIR})") ap.add_argument("--check", action="store_true", help="只检查有无新期,输出 NEW:id,id 或 NONE") - ap.add_argument("--extract", metavar="ID|latest|pending|all", help="提取文章 → markdown") + ap.add_argument("--extract", metavar="ID|FROM..TO|latest|pending|all", help="提取文章 → markdown(支持区间如 433..464)") ap.add_argument("--backfill", metavar="FROM..TO", help="回溯抓取指定期号区间(绕过 RSS 限制,例:--backfill 400..500)") ap.add_argument("--status", action="store_true", help="打印 manifest 状态表") ap.add_argument("--issues", action="store_true", help="列出已登记的所有期")