#!/usr/bin/env python3 from __future__ import annotations import argparse import json import sys from pathlib import Path PROJ_ROOT = Path(__file__).resolve().parent.parent if str(PROJ_ROOT) not in sys.path: sys.path.insert(0, str(PROJ_ROOT)) from data.share.poster import save_poster # noqa: E402 from data.share.short_link import build_url # noqa: E402 def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( prog="gaokao-poster", description="T7.2 分享海报生成器 (Pillow + qrcode)", ) parser.add_argument("--report-json", required=True, help="报告 JSON 路径") parser.add_argument("--code", required=True, help="短码,如 ABC123") parser.add_argument( "--base-url", default="http://localhost:8000", help="用于拼接分享链接的基础 URL", ) parser.add_argument("--output", required=True, help="输出 PNG/JPG 路径") parser.add_argument( "--unmask-name", action="store_true", help="不对考生姓名脱敏(默认脱敏)", ) return parser def main(argv: list[str] | None = None) -> int: args = build_parser().parse_args(argv) report_path = Path(args.report_json) try: report = json.loads(report_path.read_text(encoding="utf-8")) except FileNotFoundError: print(f"报告不存在: {report_path}", file=sys.stderr) return 2 except json.JSONDecodeError as exc: print(f"报告 JSON 非法: {exc}", file=sys.stderr) return 2 share_url = build_url(args.code, base=args.base_url) try: result = save_poster( report, code=args.code, share_url=share_url, output_path=args.output, mask_name=not args.unmask_name, ) except (RuntimeError, ValueError) as exc: print(f"生成失败: {exc}", file=sys.stderr) return 1 print( json.dumps( { "output": str(result.output_path), "format": result.format, "size": list(result.size), "share_url": share_url, }, ensure_ascii=False, indent=2, ) ) return 0 if __name__ == "__main__": raise SystemExit(main())