"""Step 5: 生成结构化总结""" import argparse, json, os, sys from datetime import datetime, timedelta from collections import defaultdict sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from paths import DATA_DIR, LINKS_DIR, DOCS_DIR, REPORTS_DIR def load_json(path): if not os.path.isfile(path): return None with open(path,"r",encoding="utf-8") as f: return json.load(f) def main(): p = argparse.ArgumentParser() p.add_argument("--since",type=str); p.add_argument("--days",type=int) p.add_argument("--full",action="store_true"); p.add_argument("--brief",action="store_true") args = p.parse_args() messages = load_json(os.path.join(DATA_DIR,"raw-messages","all_messages_combined.json")) or {} content = load_json(os.path.join(LINKS_DIR,"all_feishu_content.json")) or {} files = load_json(os.path.join(LINKS_DIR,"all_file_attachments.json")) or [] docs = {} for d in content.get("documents",[]): did = d.get("doc_id","") or d.get("url","") if did: docs[did] = d if args.since: since = datetime.now().strftime("%Y-%m-%d 00:00:00") if args.since=="today" else (datetime.now()-timedelta(days=1)).strftime("%Y-%m-%d 00:00:00") if args.since=="yesterday" else args.since messages = {g:[m for m in msgs if m.get("createTime","")>=since] for g,msgs in messages.items()} elif args.days: since = (datetime.now()-timedelta(days=args.days)).strftime("%Y-%m-%d 00:00:00") messages = {g:[m for m in msgs if m.get("createTime","")>=since] for g,msgs in messages.items()} lines = [f"# 钉钉群聊飞书文档采集报告", f"> 生成: {datetime.now().strftime('%Y-%m-%d %H:%M')}", ""] total_m = sum(len(v) for v in messages.values()) lines += ["## 数据总览","","| 指标 | 数量 |","|------|------|", f"| 消息 | {total_m} |", f"| 文档 | {len(docs)} |", f"| 附件 | {len(files)} |", ""] for grp, msgs in messages.items(): if not msgs: continue times = sorted([m.get("createTime","") for m in msgs]) gd = [d for d in docs.values() if d.get("group")==grp] gf = [f for f in files if f.get("group")==grp] lines += [f"### {grp}", f"- 消息: {len(msgs)} ({times[0]} ~ {times[-1]})", f"- 文档: {len(gd)}", f"- 附件: {len(gf)}", ""] if args.brief: continue senders = defaultdict(lambda: {"m":0,"d":0}) for m in msgs: senders[m.get("sender","?")]["m"]+=1 for d in gd: senders[d.get("sender","?")]["d"]+=1 lines += ["| 发送者 | 消息 | 文档 |","|--------|------|------|"] for s,st in sorted(senders.items(),key=lambda x:-(x[1]["m"]+x[1]["d"])): lines.append(f"| {s} | {st['m']} | {st['d']} |") lines.append("") lines.append("**最新消息:**") for m in sorted(msgs,key=lambda x:x.get("createTime",""),reverse=True)[:10]: c = m.get('content','')[:80].replace('\n',' ') lines.append(f"- [{m.get('createTime','')}] **{m.get('sender','?')}**: {c}") lines.append("") os.makedirs(REPORTS_DIR, exist_ok=True) report = "\n".join(lines) for name in ["latest_summary.md", f"summary_{datetime.now().strftime('%Y%m%d')}.md"]: with open(os.path.join(REPORTS_DIR,name),"w",encoding="utf-8") as f: f.write(report) print(f"报告已生成: {REPORTS_DIR}") if __name__ == "__main__": main()