{
  "module": "article_processor",
  "version": "1.2",
  "purpose": "文章抓取服务运行在 Windows (192.168.1.16:5810)，负责抓取微信公众号全文链接并转换为纯文本，支持 OCR 图片识别。",
  "ui_location": "Infrastructure tab → Platform → 文章抓取服务 (5810)",

  "human_help": {
    "title": "文章抓取服务 (:5810)",
    "description": [
      "这是整个系统的'阅读器'。当莫荷或小小莫需要阅读一个微信公众号文章链接时，由这个服务负责：",
      "① 调用 wechat_fetcher.py（DrissionPage 版）用本地 Chrome + 持久微信 profile 渲染页面",
      "② 等页面加载完成，提取全文转为 Markdown",
      "③ 如果包含图片，调用 SenseNova 视觉 API 识别图片文字",
      "④ 返回结构化内容给请求方",
      "依赖微信 mp.weixin.qq.com 的读者登录态（持久 profile 中已保存），不用每次扫码。"
    ],
    "usage": [
      "监控状态：Infrastructure → Platform 下查看状态和最近抓取信息",
      "如果 health_data 中有 error：表示最近一次抓取失败，查看 error 内容",
      "点击服务旁的 § 查看 AI 接口详情"
    ],
    "troubleshooting": [
      "如果状态 stopped：检查 Windows 上 article_processor.py 进程",
      "如果抓取失败返回 '等待登录超时'：Chrome profile 的读者会话已过期，运行 wechat_fetcher.py --login 重新扫码",
      "如果图片 OCR 失败：检查 SenseNova API key 是否有效",
      "日志位置：gateway/logs/article_processor.log"
    ],
    "related": "莫荷微信（依赖文章抓取服务处理微信中的链接）"
  },

  "ai_spec": {
    "apis": [
      {"method": "GET", "path": "/health", "returns": "{ok, service, port, ocr_model, status, last_fetch}", "desc": "服务状态 + OCR 模型信息 + 上次抓取结果"},
      {"method": "GET", "path": "/logs", "returns": "{ok, lines[]}", "desc": "最近 N 行日志 — N 通过 header 'X-Lines' 指定（默认 200），不是 query 参数！示例: curl -H 'X-Lines: 50' :5810/logs"},
      {"method": "POST", "path": "/process", "body": "{\"url\":\"...\"}", "returns": "{ok, title, content, images[]}", "desc": "抓取并处理文章（主端点）"},
      {"method": "POST", "path": "/fetch-and-ocr", "body": "{\"url\":\"...\"}", "returns": "同 /process", "desc": "抓取 + OCR 一体化端点（/process 的变体，spec 1.0 未声明）"}
    ],
    "dependencies": [
      "依赖本地 Chrome + 持久 profile（DrissionPage 驱动）",
      "依赖 mp.weixin.qq.com 读者登录态（持久 cookie）",
      "依赖 SenseNova 视觉 API 识别图片文字",
      "依赖网络连通性访问微信公众号和服务端"
    ],
    "constraints": [
      "DrissionPage 驱动本地 Chrome（非无头，可见浏览器），微信会检测无头模式",
      "Chrome profile 持久化在 wechat_fetcher 配置目录，会话过期需重新扫码",
      "OCR 使用 SenseNova（Windows 自包含，不依赖小果/246）",
      "Linux 上访问此服务时需要 EasyTier VPN 连通"
    ],
    "related_files": [
      "projects/self-growing-knowledge/scripts/article_processor.py — HTTP 服务端",
      "projects/self-growing-knowledge/scripts/wechat_fetcher.py — DrissionPage 实际抓取",
      "gateway/scripts/templates/dashboard.html — fI() 状态展示",
      "gateway/scripts/specs/article_processor.json — 本 spec 文件"
    ]
  }
}
