{"id":"da912ca1-6acf-49b2-9ff5-673297b9b959","entityType":"agent","slug":"clawhub-54lynnn-stock-tracker","name":"stock-tracker","canonicalUrl":"https://www.xpersona.co/agent/clawhub-54lynnn-stock-tracker","canonicalPath":"/agent/clawhub-54lynnn-stock-tracker","generatedAt":"2026-10-12T13:16:36.692Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-12T01:15:25.001Z","emptyReason":null},"description":"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。 Skill: stock-tracker Owner: 54lynnn Summary: 东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。 Tags: latest:2.2.0 Version history: v2.2.0 | 2026-07-01T01:18:27.859Z | user v2.2.0: 新增过滤规则（解除质押、公司理财、可转债审计报告、质押展期）+ config_manager/dependencies/error_handler重构 + 测试用例 v2.1.0 | 2026-06-13T07:51:40.924Z | user 新增公告过滤规则文档，记录6轮正则过滤规则演进 v2.0.10 | 2026-06-07T13:28:44.548Z | user fix: use absolute file:/// paths for references l","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 962 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s17eg5gndg4q9p16rk2nqbpje183gv2k:stock-tracker","sourceUrl":"https://clawhub.ai/54lynnn/stock-tracker","homepage":"https://clawhub.ai/54lynnn/skills/stock-tracker","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/54lynnn/stock-tracker","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/54lynnn/skills/stock-tracker","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。 Skill: stock-tracker Owner: 54lynnn Summary: 东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。 Tags: latest:"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:15:25.001Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:15:25.001Z","emptyReason":null},"stars":null,"forks":null,"downloads":962,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"2.2.0","tractionLabel":"962 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:15:24.939Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T01:15:25.001Z","lastCrawledAt":"2026-10-12T01:15:24.939Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T01:15:24.939Z","lastVerifiedAt":null,"highlights":[{"version":"2.2.0","createdAt":"2026-07-01T01:18:27.859Z","changelog":"v2.2.0: 新增过滤规则（解除质押、公司理财、可转债审计报告、质押展期）+ config_manager/dependencies/error_handler重构 + 测试用例","fileCount":41,"zipByteSize":95482},{"version":"2.1.0","createdAt":"2026-06-13T07:51:40.924Z","changelog":"新增公告过滤规则文档，记录6轮正则过滤规则演进","fileCount":26,"zipByteSize":71020},{"version":"2.0.10","createdAt":"2026-06-07T13:28:44.548Z","changelog":"fix: use absolute file:/// paths for references links in README","fileCount":26,"zipByteSize":70659},{"version":"2.0.9","createdAt":"2026-06-07T13:25:14.435Z","changelog":"chore: sync directory name with GitHub/ClawHub slug","fileCount":26,"zipByteSize":70620},{"version":"2.0.8","createdAt":"2026-06-07T13:19:49.020Z","changelog":"chore: remove HANDOVER.md from git tracking","fileCount":26,"zipByteSize":70550},{"version":"2.0.7","createdAt":"2026-06-07T13:15:35.394Z","changelog":"refactor: simplify README.md to ~150 lines, move technical details to references/","fileCount":27,"zipByteSize":75852},{"version":"2.0.6","createdAt":"2026-06-07T13:00:42.280Z","changelog":"docs: add 开源 section with GitHub link","fileCount":23,"zipByteSize":74364},{"version":"2.0.5","createdAt":"2026-06-07T12:58:05.810Z","changelog":"refactor: remove 依赖 and 注意事项 sections (belong in README)","fileCount":23,"zipByteSize":74428}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17eg5gndg4q9p16rk2nqbpje183gv2k:stock-tracker","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T13:16:36.687Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-54lynnn-stock-tracker/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-12T01:15:25.001Z","emptyReason":null},"readme":"Skill: stock-tracker\n\nOwner: 54lynnn\n\nSummary: 东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。\n\nTags: latest:2.2.0\n\nVersion history:\n\nv2.2.0 | 2026-07-01T01:18:27.859Z | user\n\nv2.2.0: 新增过滤规则（解除质押、公司理财、可转债审计报告、质押展期）+ config_manager/dependencies/error_handler重构 + 测试用例\n\nv2.1.0 | 2026-06-13T07:51:40.924Z | user\n\n新增公告过滤规则文档，记录6轮正则过滤规则演进\n\nv2.0.10 | 2026-06-07T13:28:44.548Z | user\n\nfix: use absolute file:/// paths for references links in README\n\nv2.0.9 | 2026-06-07T13:25:14.435Z | user\n\nchore: sync directory name with GitHub/ClawHub slug\n\nv2.0.8 | 2026-06-07T13:19:49.020Z | user\n\nchore: remove HANDOVER.md from git tracking\n\nv2.0.7 | 2026-06-07T13:15:35.394Z | user\n\nrefactor: simplify README.md to ~150 lines, move technical details to references/\n\nv2.0.6 | 2026-06-07T13:00:42.280Z | user\n\ndocs: add 开源 section with GitHub link\n\nv2.0.5 | 2026-06-07T12:58:05.810Z | user\n\nrefactor: remove 依赖 and 注意事项 sections (belong in README)\n\nv2.0.4 | 2026-06-07T12:52:19.750Z | user\n\ndocs: add natural language example for first-time setup\n\nv2.0.3 | 2026-06-07T12:47:57.015Z | user\n\nrefactor: move natural language example to top of Agent Run mode\n\nv2.0.2 | 2026-06-07T12:40:44.881Z | user\n\ndocs: add natural language usage examples at top of SKILL.md\n\nv2.0.1 | 2026-06-07T12:26:25.895Z | user\n\ndocs: add cross-references between GitHub and ClawHub\n\nv2.0.0 | 2026-06-07T12:21:33.669Z | user\n\nv2.0.0: 重构为双模式技能（run/dashboard），优化 digest 输出\n\nArchive index:\n\nArchive v2.2.0: 41 files, 95482 bytes\n\nFiles: config.json (159b), dashboard.sh (1068b), docs/reviews/2026-06-24/任务2-代码质量-消除重复逻辑.md (1579b), docs/reviews/2026-06-24/任务3-可靠性-事务回滚-Cookie检测.md (1540b), docs/reviews/2026-06-24/任务4-功能增强-Dashboard搜索-CSV导出.md (1311b), docs/reviews/2026-06-24/性能优化-LLM批量判断.md (1806b), README.md (5957b), references/architecture.md (7858b), references/classification.md (13315b), references/text-cleaning.md (6183b), references/token-cost.md (2260b), requirements.txt (49b), run.sh (1501b), scripts/ann_detail.py (15612b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/config_manager.py (4180b), scripts/daily_summary.py (20928b), scripts/dashboard.py (13070b), scripts/db.py (19841b), scripts/dependencies.py (977b), scripts/eastmoney_api.py (13552b), scripts/error_handler.py (1396b), scripts/llm_judge.py (14876b), scripts/reclassify_all.py (4229b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_tracker.py (16815b), scripts/text_cleaner.py (6526b), skill-card.md (2622b), SKILL.md (5651b), tests/test_config_manager.py (8447b), tests/test_db.py (4658b), tests/test_dependencies.py (2699b), tests/test_error_handler.py (5068b), tests/test_llm_judge.py (2726b), tests/test_stock_tracker.py (11444b), tests/test_text_cleaner.py (4980b), tests/test_type_annotations.py (11941b), _meta.json (132b)\n\nFile v2.2.0:SKILL.md\n\n---\nname: \"stock-tracker\"\nversion: \"2.2.0\"\ndescription: \"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。\"\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"📊\",\n        \"requires\": { \"python\": \"3.9+\" },\n        \"install\":\n          [\n            {\n              \"id\": \"deps\",\n              \"kind\": \"shell\",\n              \"command\": \"cd {{SKILL_DIR}} && pip install requests pdfplumber flask\",\n              \"label\": \"Install Python dependencies\",\n            },\n          ],\n      },\n  }\n---\n\n# 📊 Stock Tracker - 东方财富自选股公告追踪\n\n**双模式技能** — Agent 定时自动追踪 + 用户 Web 仪表盘查看。\n\n告诉 agent 你想做什么，例如：\n\n> \"帮我看看持仓板块这两天有什么重要公告\"\n> \"每天8点提醒我有价值的自选股公告\"\n> \"帮我打开公告仪表盘看看\"\n\n## 模式一：Agent Run 模式\n\nAgent 定时运行 `run.sh`，自动抓取公告、生成摘要，输出有价值公告的 digest 转发给用户。\n\n告诉 agent 即可：\n\n> \"帮我设置 stock-tracker 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动运行：\n\n```bash\n# 用法: bash run.sh [group] [days] [source]\nbash run.sh mygroup 15 eastmoney\n```\n\n### 输出示例\n\n**有公告时：**\n```\nDIGEST_TOTAL:3\n1.\n【000001平安银行】-【平安银行2026年第一季度报告】\n【季度报告】...\n\n2.\n【600519贵州茅台】-【贵州茅台关于回购股份的进展公告】\n累计回购金额XX亿元...\n```\n\n**无公告时：**\n```\nDIGEST_EMPTY:最近1天test板块无高价值公告\n```\n\n---\n\n## 模式二：Dashboard 模式\n\n用户手动运行，抓取公告 + 生成摘要 + 启动 Web 仪表盘，浏览器查看所有公告详情。\n\n告诉 agent 即可：\n\n> \"帮我跑 stock-tracker 的 dashboard 模式，抓取 mygroup 板块最近15天的公告并打开仪表盘\"\n\n或者手动运行：\n\n```bash\n# 用法: bash dashboard.sh [group] [days] [source]\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n脚本自动执行一步（摘要已集成到主流程）：\n1. `stock_tracker.py --fetch-content` — 抓取公告 + 全文 + LLM 分类 + 自动生成摘要\n2. `dashboard.py` — 启动 Flask 仪表盘（默认端口 5001）\n\n启动后浏览器访问 `http://localhost:5001`，按 Ctrl+C 停止。\n\n**仪表盘功能：**\n- 股票列表表格：7天/15天/30天/全部的有价值公告比例\n- 点击展开：懒加载公告详情（标题、日期、摘要、正文、原文链接）\n- 类型标签：`大类 / 小类`（如 `股权股本类 / 回购`）\n- 搜索过滤，响应式设计\n- CSV 导出：点击右上角「导出 CSV」下载近 30 天有价值公告\n\n---\n\n## 首次设置\n\n告诉 agent 即可：\n\n> \"帮我初始化 stock-tracker，安装依赖、配置 Cookie 和 LLM\"\n\n或者按以下步骤手动设置：\n\n### 1. 安装依赖\n\n```bash\ncd ~/.openclaw/workspace/skills/stock-tracker\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n东方财富网页版登录后的 Cookie，用于获取自选股列表。\n\n1. 浏览器打开 [https://quote.eastmoney.com/zixuan/lite.html](https://quote.eastmoney.com/zixuan/lite.html) 并登录\n2. F12 → Console → 输入 `copy(document.cookie)` 回车\n3. 粘贴到 `cookie.txt`\n\n**自动续签（可选）：**\n```bash\npip install playwright && playwright install chromium\npython3 scripts/refresh_cookie.py\n```\n\n### 3. 配置 LLM（可选）\n\nLLM 用于标题价值判断、公告分类和摘要生成。未配置时仅使用正则过滤。\n\n```bash\n# .env 文件\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n```json\n// config.json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_tracker.py --group test --days 15 --fetch-content\npython3 scripts/stock_tracker.py --stats\n```\n\n### 5. 配置定时任务\n\n告诉 agent 即可，例如：\n\n> \"帮我设置 stock-tracker 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动配置：\n\n```bash\nopenclaw cron add \\\n  --name stock-tracker \\\n  --cron \"0 1 * * *\" \\\n  --message \"运行股票公告扫描：cd {{SKILL_DIR}} && bash run.sh mygroup 15 eastmoney\"\n```\n---\n\n## 公告过滤规则\n\n三级过滤体系自动跳过低价值公告：\n\n**第一级：正则过滤**（标题匹配，全文采集前）\n- 公司章程、信用评级、募集说明书\n- 债券程序性公告（付息、上市、摘牌、发行结果等）\n- 董事会报告、法律意见书\n- 股东会决议公告、投票表决结果\n- 薪酬制度、周年会通告\n- 担保类公告（提供担保、为xx担保、合计xx担保等）\n- 公司内部制度文件（管理制度、议事规则、工作细则等）\n- 回购注销+股权激励/限制性股票\n- 业绩说明会/业绩发布会\n- 限制性股票/股票期权预留授予、完成登记\n- 限制性股票作废（量小无市场影响）\n\n**第二级：LLM 价值判断**（全文采集后）\n- AI 判断公告是否包含实质经营信息\n- 按8大类64小类自动分类\n\n**第三级：LLM 摘要生成**（仅保留的公告）\n- 自动生成结构化摘要\n\n用户可随时指定新的过滤类型，我会自动添加到正则规则中。\n\n完整技术文档、公告分类体系、Token 消耗分析等详见 [GitHub](https://github.com/54Lynnn/stock-tracker)\n\n## 开源\n\n- **GitHub**: [github.com/54Lynnn/stock-tracker](https://github.com/54Lynnn/stock-tracker)\n\nFile v2.2.0:README.md\n\n# Stock Tracker - 东方财富自选股公告追踪\n\n自动追踪东方财富自选股公告，三级过滤 + LLM 分类摘要 + Web 仪表盘。支持 Agent 定时推送和手动查看。\n\n> 通过 ClawHub 安装：`clawhub install stock-tracker`\n\n---\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\ncd /path/to/stock-tracker\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n浏览器登录 [东方财富自选股](https://quote.eastmoney.com/zixuan/lite.html)，F12 → Console → `copy(document.cookie)`，粘贴到 `cookie.txt`。\n\n自动续签：`pip install playwright && playwright install chromium && python3 scripts/refresh_cookie.py`\n\n### 3. 配置 LLM（可选）\n\n```bash\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n`config.json` 中配置模型地址等参数（默认使用 DeepSeek V4 Flash）。未配置时自动禁用 LLM，仅使用正则过滤。\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_tracker.py --group test --days 15 --fetch-content\npython3 scripts/stock_tracker.py --stats\n```\n\n---\n\n## 两种模式\n\n### Agent Run 模式\n\n告诉 agent：`\"每天8点提醒我有价值的自选股公告\"`\n\n或手动运行：\n\n```bash\nbash run.sh mygroup 15 eastmoney\n```\n\n输出 digest 到 stdout（agent 读取转发），无公告时输出 `DIGEST_EMPTY:...`。\n\n### Dashboard 模式\n\n告诉 agent：`\"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"`\n\n或手动运行：\n\n```bash\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n自动执行：抓取 → 摘要 → 启动 Web 仪表盘（`http://localhost:5001`），支持 CSV 导出，Ctrl+C 停止。\n\n---\n\n## 常用命令\n\n```bash\npython3 scripts/stock_tracker.py --stats                 # 数据库统计\npython3 scripts/stock_tracker.py --list                  # 最近公告\npython3 scripts/stock_tracker.py --list --stock 600519   # 指定股票\npython3 scripts/stock_tracker.py --list-groups           # 可用分组\npython3 scripts/stock_tracker.py --clean                 # 清洗正文\n```\n\n---\n\n## 文件结构\n\n```\nstock-tracker/\n  SKILL.md              # Agent 入口文档\n  README.md             # 本文档\n  config.json           # LLM 配置\n  cookie.txt            # 东方财富 Cookie\n  .env                  # LLM API Key\n  run.sh                # Agent Run 模式\n  dashboard.sh          # Dashboard 模式\n  scripts/              # Python 脚本\n    stock_tracker.py    # 主入口\n    eastmoney_api.py    # 东方财富 API\n    cninfo_api.py       # 巨潮资讯 API\n    ann_detail.py       # 公告详情获取\n    llm_judge.py        # LLM 标题判断\n    text_cleaner.py     # 正文清洗\n    daily_summary.py    # 摘要生成\n    db.py               # 数据库操作\n    dashboard.py        # Flask 仪表盘\n    refresh_cookie.py   # Cookie 自动续签\n    dependencies.py     # 依赖管理\n    error_handler.py    # 错误处理\n    config_manager.py   # 配置管理\n  tests/                # 单元测试\n  logs/                 # 运行日志\n  .stock-tracker-state/ # SQLite 数据库\n  references/           # 技术参考文档\n```\n\n---\n\n## 配置\n\n### config.json\n\n```json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### .env\n\n```\nLLM_API_KEY=sk-your-api-key-here\n```\n\n### 数据源\n\n默认全部走东方财富 API（A股+港股）。指定 `--source cninfo` 时 A 股走巨潮资讯网（PDF 更稳定），港股仍走东方财富。\n\n## 数据库字段\n\n| 字段 | 说明 |\n|------|------|\n| `ann_id` | 公告唯一标识 |\n| `stock_code` | 股票代码 |\n| `stock_name` | 股票名称 |\n| `title` | 公告标题 |\n| `ann_date` | 公告日期 |\n| `ann_type` | 公告类型 |\n| `url` | 公告链接 |\n| `art_code` | 文章编码 |\n| `full_text` | 原始正文 |\n| `clean_text` | 清洗后正文 |\n| `status` | 状态（valuable/filtered） |\n| `ann_type_tag` | 小类标签 |\n| `ann_type_category` | 大类标签 |\n| `display_time_dfcf` | 东方财富显示时间 |\n| `summary` | LLM 摘要 |\n| `first_seen_at` | 首次抓取时间 |\n\n## 单元测试\n\n```bash\n# 运行所有测试\npython3 -m pytest tests/ -v\n\n# 运行特定模块测试\npython3 -m pytest tests/test_text_cleaner.py -v\npython3 -m pytest tests/test_llm_judge.py -v\npython3 -m pytest tests/test_db.py -v\n```\n\n当前共 107 个单元测试，覆盖所有核心模块。\n\n---\n\n## 依赖\n\n- Python 3.9+ / requests / pdfplumber / flask / sqlite3\n- playwright（可选，Cookie 自动续签）\n\n---\n\n## 公告过滤规则\n\n三级过滤体系自动跳过低价值公告：\n\n**第一级：正则过滤**（标题匹配，全文采集前）\n- 公司章程、信用评级、募集说明书\n- 债券程序性公告（付息、上市、摘牌、发行结果等）\n- 董事会报告、法律意见书\n- 股东会决议公告、投票表决结果\n- 薪酬制度、周年会通告\n- 担保类公告（提供担保、为xx担保、合计xx担保等）\n- 公司内部制度文件（管理制度、议事规则、工作细则等）\n- 回购注销+股权激励/限制性股票\n- 业绩说明会/业绩发布会\n- 限制性股票/股票期权预留授予、完成登记\n- 限制性股票作废（量小无市场影响）\n\n**第二级：LLM 价值判断**（全文采集后）\n- AI 判断公告是否包含实质经营信息\n- 按8大类64小类自动分类\n\n**第三级：LLM 摘要生成**（仅保留的公告）\n- 自动生成结构化摘要\n\n用户可随时指定新的过滤类型，自动添加到正则规则中。\n\n---\n\n## 技术参考\n\n详细文档见 `references/` 目录：\n\n- [系统架构](references/architecture.md) — 数据流、模块详解、过滤策略\n- [公告分类体系](references/classification.md) — A股8大类64小类 + 港股7大类41小类\n- [Token消耗分析](references/token-cost.md) — LLM 调用成本优化\n- [正文清洗规则](references/text-cleaning.md) — 14类清洗规则详解\n\nFile v2.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn742cdrc476d1kbhpsvnrnznx81x4r7\",\n  \"slug\": \"stock-tracker\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1782868707859\n}\n\nFile v2.2.0:references/architecture.md\n\n# 系统架构\n\n## 数据流总览\n\n```\n东方财富/巨潮资讯\n      │\n      ▼\neastmoney_api.py / cninfo_api.py  ─── 获取公告列表\n      │\n      ▼\nstock_tracker.py ─── 主入口，协调各模块\n      │\n      ├─ Phase 1a: 正则跳过判断 (ann_detail.should_skip_content)\n      │     │  13 条 SKIP_CONTENT_PATTERNS，极速过滤\n      │     ▼\n      ├─ Phase 1b: LLM 标题价值判断 (llm_judge.py)\n      │     │  并发 20 workers，判断 valuable / non-valuable\n      │     ▼\n      ├─ Phase 2: 并发下载正文 (ann_detail.fetch_announcement_content)\n      │     │  优先 API，回退 PDF 提取，max_workers=5\n      │     ▼\n      ├─ Phase 3: 顺序清洗 (text_cleaner.py) + 分批保存到 DB\n      │     ▼\n      ├─ daily_summary.py ─── 为有价值公告生成 LLM 摘要\n      │     │  BATCH_SIZE=1, workers=20, 定期报告跳过 LLM\n      │     ▼\n      └─ dashboard.py ─── Flask Web 仪表盘，lazy loading\n```\n\n## 模块分解\n\n### stock_tracker.py（主入口）\n\n**CLI 参数：**\n\n| 参数 | 用途 |\n|------|------|\n| `--force` | 强制重新抓取所有公告（覆盖已见检查） |\n| `--days N` | 抓取最近 N 天公告 |\n| `--dry-run` | 试运行，不更新数据库 |\n| `--group` | 只追踪指定分组（模糊匹配） |\n| `--list-groups` | 列出所有可用分组 |\n| `--stats` | 查看数据库统计 |\n| `--list` | 列出历史公告 |\n| `--fetch-content` | 补抓缺少全文的公告正文 |\n| `--clean` | 清洗已获取的公告正文 |\n| `--prune` | 清理无正文的空记录 |\n| `--source` | eastmoney（默认）或 cninfo |\n\n### 新增模块（2026-06-14）\n\n**dependencies.py（依赖管理）**：\n- 统一管理模块间依赖\n- 使用延迟导入避免循环依赖\n- 提供 `get_db()`、`get_llm_judge()` 等函数\n\n**error_handler.py（错误处理）**：\n- 定义异常类层次结构\n- `StockTrackerError` 基类\n- `DatabaseError`、`APIError`、`ConfigError`、`CookieError`、`DataError` 子类\n- `handle_error()` 统一错误处理函数\n\n**config_manager.py（配置管理）**：\n- 使用 `dataclass` 定义类型安全的配置类\n- `LLMConfig`、`NotifyConfig`、`AppConfig` 数据类\n- `ConfigManager` 类统一管理配置加载、保存和 API Key\n\n**执行流程：**\n1. 解析参数 → 执行子命令（stats/list/clean/prune/fetch-content）或完整运行\n2. 完整运行：获取自选股列表 → 获取公告列表 → 过滤已见 → 获取全文 → 入库\n\n### eastmoney_api.py（东方财富数据获取）\n\n**自选股获取（3 级回退）：**\n1. **myfavor API** `https://myfavor.eastmoney.com/v4/webouter` — 支持分组过滤\n2. **Cookie 解析** — 从 `selfSelectStocks` 字段正则提取\n3. **config.json** — 手动配置硬编码列表\n\n**公告 API：**\n- `https://np-anotice-stock.eastmoney.com/api/security/ann`\n- `ann_type=A` 为 A 股，`ann_type=H` 为港股\n- 参数：`stock_list={market},{code}`\n\n**Market 字段值：**\n\n| 值 | 市场 | 标签 |\n|----|------|------|\n| 0 | 深圳 | SZ |\n| 1 | 上海 | SH |\n| 100 | 美股 | US |\n| 104 | 期货 | FUT |\n| 116 | 港股 | HK |\n| 119 | 外汇 | FX |\n| 124 | 港股通 | HKI |\n| 134 | 港股通(深) | HKF |\n| 251 | 其他 | OTHER |\n\n### cninfo_api.py（巨潮资讯网数据获取）\n\n**API 端点：**\n- 列表：`POST https://www.cninfo.com.cn/new/hisAnnouncement/query`\n- PDF 基址：`https://static.cninfo.com.cn/{adjunctUrl}`\n\n**请求参数：**\n- `searchkey`: 股票代码\n- `seDate`: 日期范围 `YYYY-MM-DD~YYYY-MM-DD`\n- `pageNum` / `pageSize`: 分页\n- `column`: szse\n\n### ann_detail.py（公告正文获取）\n\n**内容获取优先级：**\n1. **内容 API** `https://np-cnotice-stock.eastmoney.com/api/content/ann`（需东方财富网络环境）\n2. **PDF 下载 + 文本提取** `https://pdf.dfcfw.com/pdf/H2_{art_code}_1.pdf`\n3. 外部传入 `pdf_url_override`（巨潮 PDF 链接）：直接下载 PDF\n\n**跳过全文采集的标题模式（13 条）：**\n1. 公司章程\n2. 信用评级 / 跟踪评级\n3. 募集说明书\n4. 付息公告\n5. 上市公告 / 摘牌\n6. 发行结果公告 / 票面利率 / 簿记建档 / 更名公告 / 发行完毕\n7. 董事会报告\n8. 法律意见书\n9. 股东会决议公告 / 股东会表决结果 / 投票表决结果\n10. 薪酬\n11. 周年会通告\n12. 担保额度\n13. 召开情况\n\n**TOC 提取：**\n超长文档（通函、海外市场公告、股东会会议资料、发行公告）只提取目录或开头 2000 字。\n\n### llm_judge.py（LLM 标题价值判断）\n\n**核心功能：**\n- 判断公告标题是否有价值（valuable / non-valuable）\n- 输出 category（大类）和 type（小类）\n- 使用 JSON mode（`response_format: {\"type\": \"json_object\"}`）\n- Fail-open：所有重试失败后默认视为有价值\n\n**重试策略：** 最多 2 次重试，间隔递增\n\n**System Prompt 结构：**\n1. A 股 8 大类 + HK 7 大类分类体系\n2. 高价值 type 列表\n3. 低价值 type 列表\n4. 需要结合标题判断的 type（董事会公告、借贷担保、利润分配）\n\n### text_cleaner.py（公告正文清洗）\n\n详见 `text-cleaning.md`。\n\n### daily_summary.py（每日公告摘要）\n\n**批处理参数：**\n- `BATCH_SIZE=1`：每次 LLM 调用只处理一条公告（避免超长上下文）\n- `max_workers=20`：并发线程数\n- `SKIP_LLM_TYPES`：定期报告类型跳过 LLM，使用固定摘要 `【类型】标题`\n\n**输出模式：**\n- `--digest` 输出格式化摘要列表（STDOUT），供 agent 读取转发\n- 格式：`DIGEST_TOTAL:N` → 编号列表\n\n### db.py（SQLite 存储）\n\n**核心特性：**\n- WAL 模式：`PRAGMA journal_mode=WAL`\n- UPSERT 含 null 保护：`ON CONFLICT(ann_id) DO UPDATE SET ... CASE WHEN excluded.x != '' THEN excluded.x ELSE announcements.x END`\n- 自动迁移：`_migrate_schema()` 增量添加新字段（full_text, clean_text, attach_url, summary, status, ann_type_tag, ann_type_category, clean_text_length）\n\n### dashboard.py（Flask Web 仪表盘）\n\n**路由：**\n| 端点 | 说明 |\n|------|------|\n| `GET /` | 首页（单页应用） |\n| `GET /api/stocks` | 股票概览统计（7/15/30天/全部） |\n| `GET /api/announcements/<code>` | 个股公告列表（lazy loading） |\n\n**前端特性：**\n- 股票表格行可展开\n- 搜索框实时过滤\n- 浮动个股栏（滚动时固定显示当前展开股票）\n- 分类标签展示\n\n## 过滤策略（3 层）\n\n```\n公告列表\n   │\n   ▼\nLayer 1: 正则跳过 (should_skip_content)\n   │  13 条 SKIP_CONTENT_PATTERNS\n   │  公司章程、信用评级、募集说明书、付息公告、上市公告等\n   │  跳过 → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 2: LLM 标题判断 (llm_judge.judge)\n   │  valuable → 继续下载全文\n   │  non-valuable → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 3: 下载失败\n   │  API/PDF 均失败 → status=filtered\n   │\n   ▼\n最终 DB 入库\n   valuable 有价值 | filtered 已过滤\n```\n\n## LLM 有价值/无价值类型\n\n**高价值 type（几乎总是下载）：**\n- 财务报告类全部（业绩预告、业绩快报、季度/半年/年度报告）\n- 交易提示类全部（停牌提示、交易异动、澄清公告、风险提示、特别处理、终止上市等）\n- 重大事项类：资产重组、收购兼并、股权激励、关联交易、违纪违规\n- 股权股本类：回购股权、权益变动\n- 一般公告类：法律纠纷、产销经营快报、机构调研公告\n- 港股：翌日报表、须公布的交易\n\n**低价值 type（几乎总是跳过）：**\n- 中介公告（法律意见书、保荐机构核查意见、律师核查意见）\n- 股东大会通知\n- 薪酬管理制度、董事会议事规则、公司章程修正案\n- 债券付息公告、发行结果公告\n\nFile v2.2.0:references/classification.md\n\n# 公告分类体系\n\n## A股 8大类64小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 招股类 | 申报稿 | 募集资金用途、财务数据概览 | LLM 判断 |\n| 2 | 招股类 | 申报反馈 | 监管问询要点、回复内容 | LLM 判断 |\n| 3 | 招股类 | 招股说明书 | 发行规模、定价、募集资金投向 | LLM 判断 |\n| 4 | 招股类 | 发行定价 | 发行价格、市盈率、发行日期 | LLM 判断 |\n| 5 | 招股类 | 发行结果 | 实际发行股数、募集资金总额 | LLM 判断 |\n| 6 | 招股类 | 上市公告书 | 上市日期、交易安排 | LLM 判断 |\n| 7 | 财务报告类 | 业绩预告 | 预计营收/利润数字、同比增减幅度、业绩变动原因 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告类 | 业绩快报 | 实际营收/利润数字、同比增减、与预告差异 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告类 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 10 | 财务报告类 | 半年报告 | 半年度财务数据、经营讨论 | 跳过 LLM，固定摘要 |\n| 11 | 财务报告类 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 12 | 财务报告类 | 补充更正 | 更正内容、更正前后对比 | 跳过 LLM，固定摘要 |\n| 13 | 重大事项类 | 利润分配 | 每股分红金额、分红总额、股权登记日、除权除息日 | LLM 判断 |\n| 14 | 重大事项类 | 股份增减持 | 增减持主体、变动股数、变动后持股比例、原因及后续计划 | LLM 判断 |\n| 15 | 重大事项类 | 资金投向 | 投资项目、投资金额、预期收益、资金来源、实施周期 | LLM 判断 |\n| 16 | 重大事项类 | 资产重组 | 重组标的、交易金额、交易对手、重组方式、标的公司主营业务及行业、重组后对业务布局的影响 | LLM 判断 |\n| 17 | 重大事项类 | 收购兼并 | 交易标的、交易金额、交易对手、收购目的、标的公司主营业务及行业、标的估值及溢价率 | LLM 判断 |\n| 18 | 重大事项类 | 重大合同 | 合同金额、合同对手方、合同期限、合同内容、付款方式及条件、合同履行对营收/利润的影响、违约风险 | LLM 判断 |\n| 19 | 重大事项类 | 股权激励 | 授予/行权价格、激励对象人数及构成、限售期及解锁条件、业绩考核目标、总量占股本比例 | LLM 判断 |\n| 20 | 重大事项类 | 关联交易 | 交易对方（关联方关系）、交易金额、定价依据及公允性、交易目的及必要性、对上市公司独立性的影响 | LLM 判断 |\n| 21 | 重大事项类 | 借贷担保 | 担保金额、担保对象、被担保方财务状况、担保期限、反担保措施 | LLM 判断（大额→有价值，常规→无价值） |\n| 22 | 重大事项类 | 委托理财 | 理财金额、产品类型、预期收益率、期限、风险等级 | LLM 判断 |\n| 23 | 重大事项类 | 违纪违规 | 违规主体、违规事项、处罚措施、整改方案 | LLM 判断 |\n| 24 | 重大事项类 | 政策影响 | 政策内容、对公司业务的具体影响、公司应对措施 | LLM 判断 |\n| 25 | 重大事项类 | 人事变动 | 具体人名、原职务、新职务、变动原因 | LLM 判断 |\n| 26 | 交易提示类 | 停牌提示 | 停牌原因、预计停牌时间、复牌条件 | 自动有价值 |\n| 27 | 交易提示类 | 交易异动 | 异动类型（涨停/跌停/换手率）、异动原因、是否需核查 | 自动有价值 |\n| 28 | 交易提示类 | 澄清公告 | 澄清事项、市场传闻内容、事实情况、对股价影响 | 自动有价值 |\n| 29 | 交易提示类 | 风险提示 | 风险类型、风险内容、可能影响、应对措施 | 自动有价值 |\n| 30 | 交易提示类 | 特别处理 | ST/ST\\* 原因、风险警示内容、可能后果 | 自动有价值 |\n| 31 | 交易提示类 | 终止上市 | 终止原因、退市整理期、投资者保护措施 | 自动有价值 |\n| 32 | 交易提示类 | 恢复上市 | 恢复上市原因、复牌后交易安排、公司当前经营状况 | 自动有价值 |\n| 33 | 交易提示类 | 暂停上市 | 暂停上市原因、后续恢复条件、投资者风险提示 | 自动有价值 |\n| 34 | 配股类 | 配股预案 | 配股比例（几配几）、配股价格、募集资金总额、配股目的及资金用途、对每股收益的摊薄影响 | LLM 判断 |\n| 35 | 配股类 | 配股说明书 | 配股比例、配股价格、募集资金用途、配股条件、对现有股东的影响 | LLM 判断 |\n| 36 | 配股类 | 配股获准 | 获准日期、配股方案关键条款、后续时间安排 | LLM 判断 |\n| 37 | 配股类 | 配股发行 | 实际发行股数、实际募集资金、发行结果、上市日期 | LLM 判断 |\n| 38 | 配股类 | 配股上市 | 上市日期、配股价、对股价的影响 | LLM 判断 |\n| 39 | 增发类 | 增发预案 | 增发原因及资金需求、增发股数及价格、募集资金总额及投向、发行对象（公开/定向）、对每股收益的摊薄影响 | LLM 判断 |\n| 40 | 增发类 | 增发说明书 | 增发方案详情、募集资金用途、发行条件、风险因素 | LLM 判断 |\n| 41 | 增发类 | 增发获准 | 获准日期、方案关键条款、后续安排 | LLM 判断 |\n| 42 | 增发类 | 增发发行 | 实际发行股数、实际募集资金、发行价格、发行结果 | LLM 判断 |\n| 43 | 增发类 | 增发上市 | 上市日期、对股价的影响 | LLM 判断 |\n| 44 | 股权股本类 | 权益变动 | 变动主体、变动前持股数量及比例、变动股数、变动后持股比例、变动方式（二级市场/协议转让等） | LLM 判断 |\n| 45 | 股权股本类 | 股本变动 | 变动原因、变动前后股本结构、新增股份性质 | LLM 判断 |\n| 46 | 股权股本类 | 质押冻结 | 质押/冻结主体、质押股数、占持股比例、质权人、质押融资用途、平仓风险 | LLM 判断 |\n| 47 | 股权股本类 | 质押式回购 | 回购主体、回购金额、质押标的、期限、到期安排 | LLM 判断 |\n| 48 | 股权股本类 | 回购股权 | 累计回购金额、回购股数、占总股本比例、回购计划总额及完成进度 | LLM 判断 |\n| 49 | 股权股本类 | 约定购回 | 购回主体、购回金额、标的证券、期限、购回价格 | LLM 判断 |\n| 50 | 股权股本类 | 股权分置改革 | 改革方案概要、对价安排、流通股与非流通股比例变化 | LLM 判断 |\n| 51 | 一般公告类 | 董事会公告 | 议案内容、表决结果、重大决议 | LLM 判断（具体议案→有价值，纯程序→无价值） |\n| 52 | 一般公告类 | 股东大会 | 会议审议议案、投票结果、重要决议 | LLM 判断 |\n| 53 | 一般公告类 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率 | LLM 判断 |\n| 54 | 一般公告类 | 中介公告 | 法律意见书、保荐机构核查意见 | 自动无价值 |\n| 55 | 一般公告类 | 法律纠纷 | 原告被告、涉案金额、诉讼进展、判决结果、对公司财务的潜在影响 | LLM 判断 |\n| 56 | 一般公告类 | 机构调研公告 | 调研机构名单、调研时间、公司回复要点、投资者关注的核心问题 | LLM 判断 |\n| 57 | 一般公告类 | 其他补充更正 | 更正内容、更正前后对比 | LLM 判断 |\n| 58 | 一般公告类 | 公司资料变更 | 变更事项（名称/地址/注册资本等）、变更前后 | LLM 判断 |\n| 59 | 一般公告类 | 融资融券 | 融资融券余额变化、标的调整 | LLM 判断 |\n| 60 | 一般公告类 | 员工持股 | 持股计划规模、参与人数、股票来源、锁定期、业绩考核条件 | LLM 判断 |\n| 61 | 一般公告类 | 产销经营快报 | 主要产品产销量、同比变化、经营亮点、行业景气度 | LLM 判断 |\n| 62 | 一般公告类 | 个股其他公告 | 通用兜底类别 | LLM 判断 |\n| 63 | 一般公告类 | ESG报告 | 环境/社会/治理关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 64 | 一般公告类 | 函件 | 一般函件往来 | LLM 判断 |\n\n## 港股 7大类41小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 业绩快报 | 业绩预告 | 预计财务数据、同比增减、变动原因 | LLM 判断 |\n| 2 | 业绩快报 | 季度业绩 | 季度经营数据、同比分析 | LLM 判断 |\n| 3 | 业绩快报 | 中期业绩 | 中期财务数据、业务回顾 | LLM 判断 |\n| 4 | 业绩快报 | 末期业绩 | 全年财务数据、末期分红建议 | LLM 判断 |\n| 5 | 业绩快报 | 业绩发布会 | 发布会日期、管理层发言要点、分析师问答 | LLM 判断 |\n| 6 | 财务报告 | 环境及管治报告 | ESG 关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 7 | 财务报告 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告 | 中期报告 | 中期财务数据、管理层讨论 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 10 | 上市文件 | 预览资料 | 上市公司业务概览、财务摘要、行业定位 | LLM 判断 |\n| 11 | 上市文件 | 发售以供认购 | 发售价格、发售数量、集资额、认购安排、对股价影响 | LLM 判断 |\n| 12 | 上市文件 | 招股说明书 | 发行规模、定价、募集资金投向、风险因素 | LLM 判断 |\n| 13 | 上市文件 | 公开招股 | 招股价格区间、招股数量、集资额、上市日期、保荐人 | LLM 判断 |\n| 14 | 上市文件 | 供股 | 供股比例（几供几）、供股价格、募集资金总额、供股目的及资金用途、对现有股东的影响 | LLM 判断 |\n| 15 | 上市文件 | 资本化发行 | 发行方式、发行对象、对股本结构的影响、是否涉及大股东 | LLM 判断 |\n| 16 | 上市文件 | 介绍上市 | 介绍上市方式、不涉及公开发售的原因、上市日期、保荐人 | LLM 判断 |\n| 17 | 上市文件 | 发售现有证券 | 出售股东身份、发售股数、售价、较市价折让幅度、出售原因 | LLM 判断 |\n| 18 | 上市文件 | 聆讯资料 | 聆讯日期、上市申请关键信息 | LLM 判断 |\n| 19 | 上市文件 | 其它上市文件 | 其他上市相关文件 | LLM 判断 |\n| 20 | 股权股本 | 权益变动 | 变动主体、变动前持股比例、变动股数、变动后持股比例、变动方式 | LLM 判断 |\n| 21 | 股权股本 | 证券/股本 | 证券发行、股本结构变化、新增股份 | LLM 判断 |\n| 22 | 股权股本 | 交易披露 | 关联交易披露、重大交易披露 | LLM 判断 |\n| 23 | 股权股本 | 翌日报表 | 买入/卖出股数、成交价格、涉及股东名称及身份 | LLM 判断 |\n| 24 | 股权股本 | 月报表 | 月度股份变动汇总、各增减持主体及股数、变动后持股比例 | LLM 判断 |\n| 25 | 公告及通函 | 重大事项 | 重大交易、业务调整、资产处置 | LLM 判断 |\n| 26 | 公告及通函 | 新上市 | 新上市公司名称、主营业务及行业、发行规模及定价、集资用途、上市后表现预期 | LLM 判断 |\n| 27 | 公告及通函 | 会议/表决 | 股东会/董事会会议决议、表决结果 | LLM 判断 |\n| 28 | 公告及通函 | 关联交易 | 交易对手（关联方关系）、交易金额、定价依据、交易目的 | LLM 判断 |\n| 29 | 公告及通函 | 须公布的交易 | 交易性质（收购/出售/合营）、交易金额、交易对手、是否构成重大交易、对财务状况的影响 | LLM 判断 |\n| 30 | 公告及通函 | 公司变动 | 公司名称变更、注册地址变更、董事会成员变动 | LLM 判断 |\n| 31 | 公告及通函 | 财务资料 | 财务数据补充披露、澄清 | LLM 判断 |\n| 32 | 公告及通函 | 杂项 | 其他公告事项 | LLM 判断 |\n| 33 | 一般公告 | 交易安排 | 关键日期（除净日、过户截止日、派息日）、每股派息金额 | LLM 判断 |\n| 34 | 一般公告 | 创业板资料 | 创业板公司特定披露要求 | LLM 判断 |\n| 35 | 一般公告 | 监管者公告 | 监管机构名称、监管事项、处罚/警告措施、对公司经营的影响 | LLM 判断 |\n| 36 | 一般公告 | 委任代表表格 | 委任代表表格（通常无实质内容） | LLM 判断 |\n| 37 | 一般公告 | 宪章文件 | 公司章程、组织章程大纲及细则 | LLM 判断 |\n| 38 | 债券及结构性产品 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率、实际杠杆 | LLM 判断 |\n| 39 | 债券及结构性产品 | 权证上市 | 权证条款（标的/行权价/到期日）、上市日期、初始价格 | LLM 判断 |\n| 40 | 债券及结构性产品 | 债务证券公告 | 债券规模、票面利率、期限、信用评级、担保情况、募集资金用途 | LLM 判断 |\n| 41 | 债券及结构性产品 | 其它 | 其他结构性产品公告 | LLM 判断 |\n\n**备注：**\n- `market=0`（深圳）和 `market=1`（上海）均为 A 股\n- `market=116` 为港股\n- A 股分类存储在 `A_CATEGORY_MAP`，港股分类存储在 `HK_CATEGORY_MAP`\n- 港股公告 API 使用 `ann_type=H`，A 股使用 `ann_type=A`\n\nFile v2.2.0:references/text-cleaning.md\n\n# 公告正文清洗规则\n\n共 14 条规则，按应用顺序依次执行。每规则为正则模式，使用 `re.MULTILINE` 编译。\n\n## 规则 1: 股票代码表头行\n\n**匹配示例：**\n- `证券代码:600961 证券简称:株冶集团 公告编号:2026-021`\n- `证券代码:601669 股票简称:中国电建 公告编号:临2026-028`\n\n**正则：** `证券代码[：:]\\s*\\S+\\s+(?:证券|股票)简称[：:]\\s*\\S+\\s+(公告编号[：:]\\s*\\S+)?`\n\n**行为：** 全部移除，不保留任何信息。\n\n---\n\n## 规则 2: 纯公司名行\n\n**匹配示例：**\n- `株洲冶炼集团股份有限公司`\n- `中国电力建设股份有限公司`\n\n**正则：** `^\\s*\\S{4,20}(股份有限)?公司\\s*$`\n\n**行为：** 删除独立成行的公司全称（仅限于单独占一行的情况，不删除段落内的公司名）。\n\n---\n\n## 规则 3: 董事会/监事会免责声明\n\n**10 个变体：**\n\n| # | 变体模式 |\n|---|---------|\n| 3a | 本公司及董事会全体成员保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3b | 本公司董事会及全体董事保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3c | 本公司及全体董事……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3d | 本公司及……监事……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3e | 本公司及……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3f | 本公司……董事……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3g | 不存在……虚假……误导……重大遗漏……承担……责任 |\n| 3h | 对其内容的真实性、准确性和完整性承担法律责任 |\n| 3i | 全体董事……保证……内容……真实……准确……完整……责任 |\n| 3j | 保证……不存在……虚假……误导……遗漏……法律 |\n\n**行为：** 完整移除整句声明。注意：3a-3f 的保证范围涵盖 \"虚假记载、误导性陈述或者重大遗漏\"（含\"或者\"变体），同时支持 \"承担法律责任\" 和 \"承担个别及连带法律责任\" 等变体。\n\n---\n\n## 规则 4: \"特此公告\" 结语 + 日期落款\n\n**匹配：** `\\n\\s*特此公告[。\\s]*\\n?(?:\\s*\\S*?公司\\s*(?:董事会|监事会)?\\s*\\n?)?(?:\\s*<日期>\\s*)?`\n\n**行为：** 将 \"特此公告\" 及其后的公司名和日期整体移除，替换为换行符。\n\n**规则 4b（独立日期行）：** `\\n\\s*<日期>\\s*$`\n\n**行为：** 移除独立的日期落款行，支持中文数字日期（如 `二〇二六年五月二十九日`）和阿拉伯数字日期（如 `2026年5月29日`）。\n\n---\n\n## 规则 5: 股票信息行\n\n**匹配示例：**\n- `股票简称:申万宏源 股票代码:000166`\n\n**正则：** `股票简称[：:]\\s*\\S+\\s+股票代码[：:]\\s*\\S+`\n\n**行为：** 移除出现在募集说明书等文档开头的股票简称/代码行。\n\n---\n\n## 规则 6: \"重要内容提示\" 标记\n\n**匹配：** `重要内容提示[：:]\\s*\\n?`\n\n**行为：** 只移除 \"重要内容提示：\" 这个标题标记，保留下方的提示内容。\n\n---\n\n## 规则 7: PDF 页脚/分页噪声\n\n**三个子规则：**\n\n| # | 匹配内容 | 正则 |\n|---|---------|------|\n| 7a | `第1页 共3页` 类页脚 | `\\n\\s*第\\s*\\d+\\s*页\\s*共\\s*\\d+\\s*页\\s*\\n?` |\n| 7b | 纯数字页码行 | `^\\s*\\d+\\s*$` |\n| 7c | PDF 水印文字 | `[\\w\\-]+\\.pdf\\s*\\d{4}-\\d{2}-\\d{2}\\s*\\d{2}:\\d{2}:\\d{2}` |\n\n**行为：** 7a 替换为换行符，7b 和 7c 直接移除。\n\n---\n\n## 规则 8: 声明板块\n\n**匹配：**\n- `声 明\\n[^。]*?中国证监会[^。]*?证券交易所[^。]*?责任`\n- `声 明\\n[^。]*?本募集说明书[^。]*?真实[^。]*?准确[^。]*?完整[^。]*?责任`\n\n**行为：** 移除年报、募集说明书开头的法律声明板块。\n\n---\n\n## 规则 9: 投资者关系活动记录表头\n\n**三个子规则：**\n\n| # | 匹配内容 |\n|---|---------|\n| 9a | `证券代码：xxx 证券简称：xxx` 行 |\n| 9b | `xxx股份有限公司投资者关系活动记录表` |\n| 9c | `投资者关系活动记录表` |\n\n**行为：** 移除机构调研公告的标准表头。\n\n---\n\n## 规则 10: 地址/联系信息模板\n\n**匹配：**\n- `住所[：:].*?(?:\\d{3,6}室|号|楼|大厦|路\\d+号)`\n- `邮政编码[：:]\\s*\\d{6}`\n- `联系电话[：:]\\s*\\S+`\n- `传真[：:]\\s*\\S+`\n\n**行为：** 移除文档末尾的注册地址、邮编、电话、传真等联系信息。\n\n---\n\n## 规则 11: 募集说明书评级/担保字段\n\n**匹配：**\n- `信用评级结果[：:][^。]*?[。，]`\n- `信用评级机构[：:][^。]*?[。，]`\n- `增信措施情况[：:][^。]*?[。，]`\n- `担保或其他增信情况[：:][^。]*?[。，]`\n- `发行金额[：:][^。]*?[。，]`\n- `牵头主承销商[：:].*`\n- `联席主承销商[：:].*`\n- `簿记管理人[：:].*`\n- `受托管理人[：:].*`\n\n**行为：** 移除募集说明书中固定格式的评级、担保、承销商信息。\n\n---\n\n## 规则 12: 目录页\n\n**匹配：** `目\\s*录\\s*\\n[\\s\\S]*?(?=议案|一[、）]|\\d[、）])`\n\n**行为：** 从 \"目 录\" 标记开始到第一个议案/章节标题之间的内容全部移除。适用于年报、股东会会议资料等包含目录的文档。\n\n---\n\n## 规则 13: H股表格模板文字\n\n**匹配：**\n- `翌日披露報表\\s*\\([^)]*\\)\\s*`\n- `表格類別[：:]\\s*\\S+\\s+狀態[：:]\\s*\\S+\\s*`\n- `如上市發行人的已發行股份[^。]*?作出披露，必須填妥第一章節。`\n\n**行为：** 移除港股翌日披露报表的标准表格模板文字。\n\n---\n\n## 规则 14: 多余空白行\n\n**匹配：**\n- `\\n{3,}` → 替换为 `\\n\\n`（保留最多一个空行）\n- `^\\s*\\n` → 移除文档开头的空行\n\n**行为：** 压缩多余连续空行，清理文档首尾空白，最后执行 `strip()`。\n\n---\n\n## 执行统计\n\n```python\ndef get_stats(original: str, cleaned: str) -> dict:\n    \"\"\"返回清洗前后的字数对比\"\"\"\n```\n\n清洗效率通常可减少 15%-30% 的字符数（取决于文档类型），招股说明书和年度报告等模板化程度高的文档节省更明显。\n\nFile v2.2.0:references/token-cost.md\n\n# Token 消耗分析\n\n## 各操作 Token 消耗表\n\n| 操作 | Token 消耗 | 说明 |\n|------|-----------|------|\n| LLM 标题判断 | ~100 token/条 | 标题独立调用，单条非常轻量 |\n| LLM 摘要生成 | ~1500 输入 + 500 输出 | BATCH_SIZE=1，每条公告独立调用 |\n| 定期报告跳过 | 0 | 使用固定摘要 `【类型】标题`，不调 LLM |\n| Digest 输出 | 0 | 从 DB 读取已有摘要，不调 LLM |\n| 无新公告 | 0 | 直接跳过，无 API 调用 |\n\n## 优化策略\n\n### 1. 正则预过滤大幅减少 LLM 调用\n\n13 条 `SKIP_CONTENT_PATTERNS` 在 Phase 1a 顺序执行，极速过滤掉公司章程、信用评级、募集说明书等纯模板文档。只有通过正则检查的公告才进入 Phase 1b 的 LLM 判断。\n\n### 2. LLM 标题判断成本极低\n\n每条公告仅用标题做判断（~100 token），不涉及正文。20 workers 并发处理，延迟极低。\n\n### 3. 低价值公告不下载正文\n\nLLM 判断为 non-valuable 的公告直接跳过 Phase 2（正文下载），节省 PDF 下载带宽和后续 LLM 摘要 token。\n\n### 4. 摘要阶段跳过定期报告\n\n`SKIP_LLM_TYPES` 包括 6 种定期报告类型：业绩预告、业绩快报、季度报告、半年报告、年度报告、补充更正。这些公告正文极长（年度报告可达数万字），直接用 `【类型】标题` 作为摘要，完全不调用 LLM。\n\n### 5. BATCH_SIZE=1 避免超长上下文\n\nBATCH_SIZE 固定为 1，每次 LLM 调用处理一条公告。虽然单次调用效率较低，但避免了超长上下文带来的 token 浪费和摘要质量下降。\n\n### 6. Digest 不消耗 Token\n\n`--digest` 模式直接从 DB 读取已有摘要做格式化输出，无任何 LLM 调用。\n\n### 7. 按需增量处理\n\n`--hours` 参数只处理最近 N 小时入库的公告，避免全量回溯。\n\n### 8. 每日场景估算\n\n假设每天 200 条新公告，其中 50% 通过正则过滤：\n- Phase 1b LLM 标题判断：100 条 × ~100 token = ~10K token\n- 其中 ~30% 被判断为 valuable（30 条）\n- Phase 3 LLM 摘要生成：30 条 × ~2000 token = ~60K token\n- 其中 6 条定期报告跳过 LLM：24 条 × ~2000 token = ~48K token\n\n**日总消耗：~58K token**\n**月总消耗（22 交易日）：~1.28M token**\n\nFile v2.2.0:docs/reviews/2026-06-24/任务2-代码质量-消除重复逻辑.md\n\n# 任务复盘：代码质量 - 消除重复初始化逻辑\n\n## 任务信息\n\n- **项目名称**：stock-tracker\n- **任务目标**：消除 stock_tracker.py 中 LLMJudge 的重复初始化逻辑，统一使用 from_config() 工厂方法\n- **完成日期**：2026-06-24\n- **最终 commit**：d29f6b7 (refactor: simplify LLMJudge init in stock_tracker.py + format db.py migrate schema)\n\n## 标签\n\n- #全部顺利\n\n## 完成度评估\n\n- [x] 全部完成\n\n## 验证结果\n\n| 检查项 | 结果 | 说明 |\n|--------|------|------|\n| 项目能启动 | 通过 | Flask Dashboard 正常启动在 http://localhost:5001 |\n| 新功能可用 | 通过 | LLM 批量判断 + 简化初始化均正常工作 |\n| 原有功能正常 | 通过 | 公告抓取、过滤、入库、Dashboard 展示均正常 |\n| 已截图存档 | 是 | 03-home.png, 04-stock-detail.png |\n| 已提交 commit | 是 | d29f6b7 |\n\n## 改动文件清单\n\n| 文件 | 改动类型 | 说明 |\n|------|----------|------|\n| `scripts/stock_tracker.py` | 修改 | 将 7 行手动初始化 LLMJudge 的代码替换为 1 行 `LLMJudge.from_config(config)` |\n| `scripts/db.py` | 格式化 | `_migrate_schema` 从单行 for 循环改为可读的列表 + 多行格式 |\n\n## 遇到的问题\n\n无。\n\n## 做得好的地方\n\n- 消除了 stock_tracker.py 和 llm_judge.py 之间的重复初始化逻辑\n- 修改后 stock_tracker.py 不再直接接触 API key，提高了安全性\n- db.py 格式化使迁移逻辑更清晰易读\n\n## 下次可以改进的地方\n\n- 无\n\n## 截图位置\n\n`d:\\project\\stock-tracker\\docs\\screenshots\\2026-06-24\\`\n\nFile v2.2.0:docs/reviews/2026-06-24/任务3-可靠性-事务回滚-Cookie检测.md\n\n# 任务复盘：可靠性 - 事务回滚保护 + Cookie 过期检测\n\n## 任务信息\n\n- **项目名称**：stock-tracker\n- **任务目标**：给 db.py 写操作添加事务回滚保护，给 eastmoney_api.py 添加 Cookie 过期检测\n- **完成日期**：2026-06-24\n- **最终 commit**：4830c2b (fix: add transaction rollback to db.py write ops + Cookie expiry warning)\n\n## 标签\n\n- #全部顺利\n\n## 完成度评估\n\n- [x] 全部完成\n\n## 验证结果\n\n| 检查项 | 结果 | 说明 |\n|--------|------|------|\n| 项目能启动 | 通过 | stock_tracker.py --fetch-content 正常运行完成 |\n| 新功能可用 | 通过 | LLM 批量判断 52 条，仅 3 次 API 调用 |\n| 原有功能正常 | 通过 | 公告抓取、过滤、入库均正常 |\n| 已截图存档 | 是 | 05-fetch-content-run.png |\n| 已提交 commit | 是 | 4830c2b |\n\n## 改动文件清单\n\n| 文件 | 改动类型 | 说明 |\n|------|----------|------|\n| `scripts/db.py` | 修改 | record_announcements, update_content, update_clean_text, update_summary, prune_empty 5个写操作添加 try/except + rollback |\n| `scripts/eastmoney_api.py` | 修改 | get_stocks 中 myfavor API 返回空时添加 Cookie 过期警告 |\n\n## 遇到的问题\n\n无。\n\n## 做得好的地方\n\n- 所有写操作都有事务保护，异常时自动回滚\n- Cookie 过期时有明确的日志提示，方便排查\n- 106/107 测试通过\n\n## 下次可以改进的地方\n\n- 可以考虑给 timeout 也统一配置化\n\n## 截图位置\n\n`d:\\project\\stock-tracker\\docs\\screenshots\\2026-06-24\\`\n\nFile v2.2.0:docs/reviews/2026-06-24/任务4-功能增强-Dashboard搜索-CSV导出.md\n\n# 任务复盘：功能增强 - Dashboard 搜索 + CSV 导出\n\n## 任务信息\n\n- **项目名称**：stock-tracker\n- **任务目标**：为 Dashboard 添加 CSV 导出功能\n- **完成日期**：2026-06-24\n- **最终 commit**：（待提交）\n\n## 标签\n\n- #全部顺利\n\n## 完成度评估\n\n- [x] 全部完成\n\n## 验证结果\n\n| 检查项 | 结果 | 说明 |\n|--------|------|------|\n| 项目能启动 | 通过 | Flask Dashboard 正常启动在 http://localhost:5001 |\n| 新功能可用 | 通过 | /api/export/csv 成功下载 announcements_20260624.csv |\n| 原有功能正常 | 通过 | Dashboard 首页、搜索、公告详情均正常 |\n| 已截图存档 | 是 | 06-dashboard-csv-export.png |\n| 已提交 commit | 是 | 待提交 |\n\n## 改动文件清单\n\n| 文件 | 改动类型 | 说明 |\n|------|----------|------|\n| `scripts/dashboard.py` | 新增路由 | /api/export/csv，返回 CSV 文件（含 BOM，Excel 兼容） |\n| `scripts/db.py` | 新增函数 | get_all_valuable_announcements()，查询所有有价值公告供导出 |\n\n## 遇到的问题\n\n无。\n\n## 做得好的地方\n\n- CSV 含 BOM 头（\\ufeff），Excel 打开不会乱码\n- 导出文件名含日期，方便区分\n- 数据库查询函数独立，复用性好\n\n## 截图位置\n\n`d:\\project\\stock-tracker\\docs\\screenshots\\2026-06-24\\`\n\nFile v2.2.0:docs/reviews/2026-06-24/性能优化-LLM批量判断.md\n\n# 任务复盘：性能优化 - LLM 批量判断\n\n## 任务信息\n\n- **项目名称**：stock-tracker\n- **任务目标**：将 LLM 标题判断从逐条调用改为批量调用，减少 API 请求次数\n- **完成日期**：2026-06-24\n- **最终 commit**：7f18197 (feat: LLM batch judgment - reduce API calls from N to N/10)\n\n## 标签\n\n- #全部顺利\n- #性能问题\n\n## 完成度评估\n\n- [x] 全部完成\n\n## 验证结果\n\n| 检查项 | 结果 | 说明 |\n|--------|------|------|\n| 项目能启动 | 通过 | Flask Dashboard 正常启动在 http://localhost:5001 |\n| 新功能可用 | 通过 | LLM 批量判断正常工作，169 条公告仅需 17 次 API 调用 |\n| 原有功能正常 | 通过 | 公告抓取、过滤、入库、Dashboard 展示均正常 |\n| 已截图存档 | 是 | 01-dashboard-home.png, 02-dashboard-stock-detail.png |\n| 已提交 commit | 是 | 7f18197 |\n\n## 改动文件清单\n\n| 文件 | 改动类型 | 说明 |\n|------|----------|------|\n| `scripts/llm_judge.py` | 新增方法 | +judge_batch(), +_judge_batch_single(), +_parse_batch_response(), +_normalize_batch_item(), +BATCH_SYSTEM_PROMPT |\n| `scripts/ann_detail.py` | 修改方法 | Phase 1b 从 ThreadPoolExecutor 逐条调用改为 judge_batch() 批量调用，移除 judge_workers 参数 |\n\n## 遇到的问题\n\n无。\n\n## 做得好的地方\n\n- 保留了 judge() 单条方法作为兼容接口\n- 批量响应解析兼容多种格式（JSON 数组、JSON 对象、正则提取）\n- 从 169 次 API 调用减少到 17 次，减少 90%\n- 106/107 测试通过，唯一失败是已知的编码问题\n\n## 下次可以改进的地方\n\n- 可以考虑动态调整 batch_size，根据 API 响应时间自动优化\n- 可以添加批量判断的单元测试\n\n## 截图位置\n\n`d:\\project\\stock-tracker\\docs\\screenshots\\2026-06-24\\`\n\nFile v2.2.0:skill-card.md\n\n## Description:\n\nStock Tracker monitors Eastmoney self-selected stock announcements, applies rule-based and optional LLM filtering, creates classified summaries, and can present results as scheduled digests or a local web dashboard.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[54lynnn](https://clawhub.ai/user/54lynnn)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nInvestors, analysts, and agent operators use this skill to track announcements for configured stock groups, filter low-value notices, summarize important updates, and review results through digest output or a dashboard.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill handles Eastmoney session cookies and LLM API keys.\n\nMitigation: Use a dedicated environment, restrict access to cookie.txt and .env, and rotate credentials if they may have been exposed.\n\nRisk: The setup script can install recurring cron jobs.\n\nMitigation: Run scripts/setup.sh only after review and inspect the user crontab after setup.\n\nRisk: The dashboard is unauthenticated and may be reachable beyond localhost if exposed.\n\nMitigation: Run dashboard mode only on loopback or place it behind access controls.\n\nRisk: LLM features send announcement titles and text to the configured model endpoint and may incur API costs.\n\nMitigation: Review config.json before use, disable LLM features when not needed, and monitor provider usage.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/54lynnn/skills/stock-tracker)\n- [ClawHub publisher profile](https://clawhub.ai/user/54lynnn)\n- [System architecture](references/architecture.md)\n- [Announcement classification](references/classification.md)\n- [Text cleaning rules](references/text-cleaning.md)\n- [Token cost analysis](references/token-cost.md)\n- [Eastmoney self-selected stocks](https://quote.eastmoney.com/zixuan/lite.html)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell command examples and digest text output]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Dashboard mode can serve local HTML views and CSV exports; scheduled mode emits digest lines for an agent to forward.]\n\n## Skill Version(s):\n\n2.2.0 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.1.0: 26 files, 71020 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), README.md (3450b), references/architecture.md (7216b), references/classification.md (13315b), references/text-cleaning.md (6183b), references/token-cost.md (2260b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (14287b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14991b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_tracker.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2671b), SKILL.md (4543b), _meta.json (132b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: \"stock-tracker\"\nversion: \"2.0.0\"\ndescription: \"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。\"\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"📊\",\n        \"requires\": { \"python\": \"3.9+\" },\n        \"install\":\n          [\n            {\n              \"id\": \"deps\",\n              \"kind\": \"shell\",\n              \"command\": \"cd {{SKILL_DIR}} && pip install requests pdfplumber flask\",\n              \"label\": \"Install Python dependencies\",\n            },\n          ],\n      },\n  }\n---\n\n# 📊 Stock Tracker - 东方财富自选股公告追踪\n\n**双模式技能** — Agent 定时自动追踪 + 用户 Web 仪表盘查看。\n\n告诉 agent 你想做什么，例如：\n\n> \"帮我看看持仓板块这两天有什么重要公告\"\n> \"每天8点提醒我有价值的自选股公告\"\n> \"帮我打开公告仪表盘看看\"\n\n## 模式一：Agent Run 模式\n\nAgent 定时运行 `run.sh`，自动抓取公告、生成摘要，输出有价值公告的 digest 转发给用户。\n\n告诉 agent 即可：\n\n> \"帮我设置 stock-tracker 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动运行：\n\n```bash\n# 用法: bash run.sh [group] [days] [source]\nbash run.sh mygroup 15 eastmoney\n```\n\n### 输出示例\n\n**有公告时：**\n```\nDIGEST_TOTAL:3\n1.\n【000001平安银行】-【平安银行2026年第一季度报告】\n【季度报告】...\n\n2.\n【600519贵州茅台】-【贵州茅台关于回购股份的进展公告】\n累计回购金额XX亿元...\n```\n\n**无公告时：**\n```\nDIGEST_EMPTY:最近1天test板块无高价值公告\n```\n\n---\n\n## 模式二：Dashboard 模式\n\n用户手动运行，抓取公告 + 生成摘要 + 启动 Web 仪表盘，浏览器查看所有公告详情。\n\n告诉 agent 即可：\n\n> \"帮我跑 stock-tracker 的 dashboard 模式，抓取 mygroup 板块最近15天的公告并打开仪表盘\"\n\n或者手动运行：\n\n```bash\n# 用法: bash dashboard.sh [group] [days] [source]\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n脚本自动执行三步：\n1. `stock_tracker.py --fetch-content` — 抓取公告 + 全文 + LLM 分类\n2. `daily_summary.py` — 生成摘要\n3. `dashboard.py` — 启动 Flask 仪表盘（默认端口 5001）\n\n启动后浏览器访问 `http://localhost:5001`，按 Ctrl+C 停止。\n\n**仪表盘功能：**\n- 股票列表表格：7天/15天/30天/全部的有价值公告比例\n- 点击展开：懒加载公告详情（标题、日期、摘要、正文、原文链接）\n- 类型标签：`大类 / 小类`（如 `股权股本类 / 回购`）\n- 搜索过滤，响应式设计\n\n---\n\n## 首次设置\n\n告诉 agent 即可：\n\n> \"帮我初始化 stock-tracker，安装依赖、配置 Cookie 和 LLM\"\n\n或者按以下步骤手动设置：\n\n### 1. 安装依赖\n\n```bash\ncd ~/.openclaw/workspace/skills/stock-tracker\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n东方财富网页版登录后的 Cookie，用于获取自选股列表。\n\n1. 浏览器打开 [https://quote.eastmoney.com/zixuan/lite.html](https://quote.eastmoney.com/zixuan/lite.html) 并登录\n2. F12 → Console → 输入 `copy(document.cookie)` 回车\n3. 粘贴到 `cookie.txt`\n\n**自动续签（可选）：**\n```bash\npip install playwright && playwright install chromium\npython3 scripts/refresh_cookie.py\n```\n\n### 3. 配置 LLM（可选）\n\nLLM 用于标题价值判断、公告分类和摘要生成。未配置时仅使用正则过滤。\n\n```bash\n# .env 文件\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n```json\n// config.json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_tracker.py --group test --days 15 --fetch-content\npython3 scripts/stock_tracker.py --stats\n```\n\n### 5. 配置定时任务\n\n告诉 agent 即可，例如：\n\n> \"帮我设置 stock-tracker 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动配置：\n\n```bash\nopenclaw cron add \\\n  --name stock-tracker \\\n  --cron \"0 1 * * *\" \\\n  --message \"运行股票公告扫描：cd {{SKILL_DIR}} && bash run.sh mygroup 15 eastmoney\"\n```\n---\n\n完整技术文档、公告分类体系、Token 消耗分析等详见 [GitHub](https://github.com/54Lynnn/stock-tracker)\n\n## 开源\n\n- **GitHub**: [github.com/54Lynnn/stock-tracker](https://github.com/54Lynnn/stock-tracker)\n\nFile v2.1.0:README.md\n\n# Stock Tracker - 东方财富自选股公告追踪\n\n自动追踪东方财富自选股公告，三级过滤 + LLM 分类摘要 + Web 仪表盘。支持 Agent 定时推送和手动查看。\n\n> 通过 ClawHub 安装：`clawhub install stock-tracker`\n\n---\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\ncd /path/to/stock-tracker\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n浏览器登录 [东方财富自选股](https://quote.eastmoney.com/zixuan/lite.html)，F12 → Console → `copy(document.cookie)`，粘贴到 `cookie.txt`。\n\n自动续签：`pip install playwright && playwright install chromium && python3 scripts/refresh_cookie.py`\n\n### 3. 配置 LLM（可选）\n\n```bash\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n`config.json` 中配置模型地址等参数（默认使用 DeepSeek V4 Flash）。未配置时自动禁用 LLM，仅使用正则过滤。\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_tracker.py --group test --days 15 --fetch-content\npython3 scripts/stock_tracker.py --stats\n```\n\n---\n\n## 两种模式\n\n### Agent Run 模式\n\n告诉 agent：`\"每天8点提醒我有价值的自选股公告\"`\n\n或手动运行：\n\n```bash\nbash run.sh mygroup 15 eastmoney\n```\n\n输出 digest 到 stdout（agent 读取转发），无公告时输出 `DIGEST_EMPTY:...`。\n\n### Dashboard 模式\n\n告诉 agent：`\"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"`\n\n或手动运行：\n\n```bash\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n自动执行：抓取 → 摘要 → 启动 Web 仪表盘（`http://localhost:5001`），Ctrl+C 停止。\n\n---\n\n## 常用命令\n\n```bash\npython3 scripts/stock_tracker.py --stats                 # 数据库统计\npython3 scripts/stock_tracker.py --list                  # 最近公告\npython3 scripts/stock_tracker.py --list --stock 600519   # 指定股票\npython3 scripts/stock_tracker.py --list-groups           # 可用分组\npython3 scripts/stock_tracker.py --clean                 # 清洗正文\n```\n\n---\n\n## 文件结构\n\n```\nstock-tracker/\n  SKILL.md              # Agent 入口文档\n  README.md             # 本文档\n  config.json           # LLM 配置\n  cookie.txt            # 东方财富 Cookie\n  .env                  # LLM API Key\n  run.sh                # Agent Run 模式\n  dashboard.sh          # Dashboard 模式\n  scripts/              # Python 脚本\n  logs/                 # 运行日志\n  .stock-tracker-state/ # SQLite 数据库\n  references/           # 技术参考文档\n```\n\n---\n\n## 配置\n\n### config.json\n\n```json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### .env\n\n```\nLLM_API_KEY=sk-your-api-key-here\n```\n\n### 数据源\n\n默认全部走东方财富 API（A股+港股）。指定 `--source cninfo` 时 A 股走巨潮资讯网（PDF 更稳定），港股仍走东方财富。\n\n---\n\n## 依赖\n\n- Python 3.9+ / requests / pdfplumber / flask / sqlite3\n- playwright（可选，Cookie 自动续签）\n\n---\n\n## 技术参考\n\n详细文档见 `references/` 目录：\n\n- [系统架构](references/architecture.md) — 数据流、模块详解、过滤策略\n- [公告分类体系](references/classification.md) — A股8大类64小类 + 港股7大类41小类\n- [Token消耗分析](references/token-cost.md) — LLM 调用成本优化\n- [正文清洗规则](references/text-cleaning.md) — 14类清洗规则详解\n\nFile v2.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn742cdrc476d1kbhpsvnrnznx81x4r7\",\n  \"slug\": \"stock-tracker\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1781337100924\n}\n\nFile v2.1.0:references/architecture.md\n\n# 系统架构\n\n## 数据流总览\n\n```\n东方财富/巨潮资讯\n      │\n      ▼\neastmoney_api.py / cninfo_api.py  ─── 获取公告列表\n      │\n      ▼\nstock_tracker.py ─── 主入口，协调各模块\n      │\n      ├─ Phase 1a: 正则跳过判断 (ann_detail.should_skip_content)\n      │     │  13 条 SKIP_CONTENT_PATTERNS，极速过滤\n      │     ▼\n      ├─ Phase 1b: LLM 标题价值判断 (llm_judge.py)\n      │     │  并发 20 workers，判断 valuable / non-valuable\n      │     ▼\n      ├─ Phase 2: 并发下载正文 (ann_detail.fetch_announcement_content)\n      │     │  优先 API，回退 PDF 提取，max_workers=5\n      │     ▼\n      ├─ Phase 3: 顺序清洗 (text_cleaner.py) + 分批保存到 DB\n      │     ▼\n      ├─ daily_summary.py ─── 为有价值公告生成 LLM 摘要\n      │     │  BATCH_SIZE=1, workers=20, 定期报告跳过 LLM\n      │     ▼\n      └─ dashboard.py ─── Flask Web 仪表盘，lazy loading\n```\n\n## 模块分解\n\n### stock_tracker.py（主入口）\n\n**CLI 参数：**\n\n| 参数 | 用途 |\n|------|------|\n| `--force` | 强制重新抓取所有公告（覆盖已见检查） |\n| `--days N` | 抓取最近 N 天公告 |\n| `--dry-run` | 试运行，不更新数据库 |\n| `--group` | 只追踪指定分组（模糊匹配） |\n| `--list-groups` | 列出所有可用分组 |\n| `--stats` | 查看数据库统计 |\n| `--list` | 列出历史公告 |\n| `--fetch-content` | 补抓缺少全文的公告正文 |\n| `--clean` | 清洗已获取的公告正文 |\n| `--prune` | 清理无正文的空记录 |\n| `--source` | eastmoney（默认）或 cninfo |\n\n**执行流程：**\n1. 解析参数 → 执行子命令（stats/list/clean/prune/fetch-content）或完整运行\n2. 完整运行：获取自选股列表 → 获取公告列表 → 过滤已见 → 获取全文 → 入库\n\n### eastmoney_api.py（东方财富数据获取）\n\n**自选股获取（3 级回退）：**\n1. **myfavor API** `https://myfavor.eastmoney.com/v4/webouter` — 支持分组过滤\n2. **Cookie 解析** — 从 `selfSelectStocks` 字段正则提取\n3. **config.json** — 手动配置硬编码列表\n\n**公告 API：**\n- `https://np-anotice-stock.eastmoney.com/api/security/ann`\n- `ann_type=A` 为 A 股，`ann_type=H` 为港股\n- 参数：`stock_list={market},{code}`\n\n**Market 字段值：**\n\n| 值 | 市场 | 标签 |\n|----|------|------|\n| 0 | 深圳 | SZ |\n| 1 | 上海 | SH |\n| 100 | 美股 | US |\n| 104 | 期货 | FUT |\n| 116 | 港股 | HK |\n| 119 | 外汇 | FX |\n| 124 | 港股通 | HKI |\n| 134 | 港股通(深) | HKF |\n| 251 | 其他 | OTHER |\n\n### cninfo_api.py（巨潮资讯网数据获取）\n\n**API 端点：**\n- 列表：`POST https://www.cninfo.com.cn/new/hisAnnouncement/query`\n- PDF 基址：`https://static.cninfo.com.cn/{adjunctUrl}`\n\n**请求参数：**\n- `searchkey`: 股票代码\n- `seDate`: 日期范围 `YYYY-MM-DD~YYYY-MM-DD`\n- `pageNum` / `pageSize`: 分页\n- `column`: szse\n\n### ann_detail.py（公告正文获取）\n\n**内容获取优先级：**\n1. **内容 API** `https://np-cnotice-stock.eastmoney.com/api/content/ann`（需东方财富网络环境）\n2. **PDF 下载 + 文本提取** `https://pdf.dfcfw.com/pdf/H2_{art_code}_1.pdf`\n3. 外部传入 `pdf_url_override`（巨潮 PDF 链接）：直接下载 PDF\n\n**跳过全文采集的标题模式（13 条）：**\n1. 公司章程\n2. 信用评级 / 跟踪评级\n3. 募集说明书\n4. 付息公告\n5. 上市公告 / 摘牌\n6. 发行结果公告 / 票面利率 / 簿记建档 / 更名公告 / 发行完毕\n7. 董事会报告\n8. 法律意见书\n9. 股东会决议公告 / 股东会表决结果 / 投票表决结果\n10. 薪酬\n11. 周年会通告\n12. 担保额度\n13. 召开情况\n\n**TOC 提取：**\n超长文档（通函、海外市场公告、股东会会议资料、发行公告）只提取目录或开头 2000 字。\n\n### llm_judge.py（LLM 标题价值判断）\n\n**核心功能：**\n- 判断公告标题是否有价值（valuable / non-valuable）\n- 输出 category（大类）和 type（小类）\n- 使用 JSON mode（`response_format: {\"type\": \"json_object\"}`）\n- Fail-open：所有重试失败后默认视为有价值\n\n**重试策略：** 最多 2 次重试，间隔递增\n\n**System Prompt 结构：**\n1. A 股 8 大类 + HK 7 大类分类体系\n2. 高价值 type 列表\n3. 低价值 type 列表\n4. 需要结合标题判断的 type（董事会公告、借贷担保、利润分配）\n\n### text_cleaner.py（公告正文清洗）\n\n详见 `text-cleaning.md`。\n\n### daily_summary.py（每日公告摘要）\n\n**批处理参数：**\n- `BATCH_SIZE=1`：每次 LLM 调用只处理一条公告（避免超长上下文）\n- `max_workers=20`：并发线程数\n- `SKIP_LLM_TYPES`：定期报告类型跳过 LLM，使用固定摘要 `【类型】标题`\n\n**输出模式：**\n- `--digest` 输出格式化摘要列表（STDOUT），供 agent 读取转发\n- 格式：`DIGEST_TOTAL:N` → 编号列表\n\n### db.py（SQLite 存储）\n\n**核心特性：**\n- WAL 模式：`PRAGMA journal_mode=WAL`\n- UPSERT 含 null 保护：`ON CONFLICT(ann_id) DO UPDATE SET ... CASE WHEN excluded.x != '' THEN excluded.x ELSE announcements.x END`\n- 自动迁移：`_migrate_schema()` 增量添加新字段（full_text, clean_text, attach_url, summary, status, ann_type_tag, ann_type_category, clean_text_length）\n\n### dashboard.py（Flask Web 仪表盘）\n\n**路由：**\n| 端点 | 说明 |\n|------|------|\n| `GET /` | 首页（单页应用） |\n| `GET /api/stocks` | 股票概览统计（7/15/30天/全部） |\n| `GET /api/announcements/<code>` | 个股公告列表（lazy loading） |\n\n**前端特性：**\n- 股票表格行可展开\n- 搜索框实时过滤\n- 浮动个股栏（滚动时固定显示当前展开股票）\n- 分类标签展示\n\n## 过滤策略（3 层）\n\n```\n公告列表\n   │\n   ▼\nLayer 1: 正则跳过 (should_skip_content)\n   │  13 条 SKIP_CONTENT_PATTERNS\n   │  公司章程、信用评级、募集说明书、付息公告、上市公告等\n   │  跳过 → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 2: LLM 标题判断 (llm_judge.judge)\n   │  valuable → 继续下载全文\n   │  non-valuable → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 3: 下载失败\n   │  API/PDF 均失败 → status=filtered\n   │\n   ▼\n最终 DB 入库\n   valuable 有价值 | filtered 已过滤\n```\n\n## LLM 有价值/无价值类型\n\n**高价值 type（几乎总是下载）：**\n- 财务报告类全部（业绩预告、业绩快报、季度/半年/年度报告）\n- 交易提示类全部（停牌提示、交易异动、澄清公告、风险提示、特别处理、终止上市等）\n- 重大事项类：资产重组、收购兼并、股权激励、关联交易、违纪违规\n- 股权股本类：回购股权、权益变动\n- 一般公告类：法律纠纷、产销经营快报、机构调研公告\n- 港股：翌日报表、须公布的交易\n\n**低价值 type（几乎总是跳过）：**\n- 中介公告（法律意见书、保荐机构核查意见、律师核查意见）\n- 股东大会通知\n- 薪酬管理制度、董事会议事规则、公司章程修正案\n- 债券付息公告、发行结果公告\n\nFile v2.1.0:references/classification.md\n\n# 公告分类体系\n\n## A股 8大类64小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 招股类 | 申报稿 | 募集资金用途、财务数据概览 | LLM 判断 |\n| 2 | 招股类 | 申报反馈 | 监管问询要点、回复内容 | LLM 判断 |\n| 3 | 招股类 | 招股说明书 | 发行规模、定价、募集资金投向 | LLM 判断 |\n| 4 | 招股类 | 发行定价 | 发行价格、市盈率、发行日期 | LLM 判断 |\n| 5 | 招股类 | 发行结果 | 实际发行股数、募集资金总额 | LLM 判断 |\n| 6 | 招股类 | 上市公告书 | 上市日期、交易安排 | LLM 判断 |\n| 7 | 财务报告类 | 业绩预告 | 预计营收/利润数字、同比增减幅度、业绩变动原因 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告类 | 业绩快报 | 实际营收/利润数字、同比增减、与预告差异 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告类 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 10 | 财务报告类 | 半年报告 | 半年度财务数据、经营讨论 | 跳过 LLM，固定摘要 |\n| 11 | 财务报告类 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 12 | 财务报告类 | 补充更正 | 更正内容、更正前后对比 | 跳过 LLM，固定摘要 |\n| 13 | 重大事项类 | 利润分配 | 每股分红金额、分红总额、股权登记日、除权除息日 | LLM 判断 |\n| 14 | 重大事项类 | 股份增减持 | 增减持主体、变动股数、变动后持股比例、原因及后续计划 | LLM 判断 |\n| 15 | 重大事项类 | 资金投向 | 投资项目、投资金额、预期收益、资金来源、实施周期 | LLM 判断 |\n| 16 | 重大事项类 | 资产重组 | 重组标的、交易金额、交易对手、重组方式、标的公司主营业务及行业、重组后对业务布局的影响 | LLM 判断 |\n| 17 | 重大事项类 | 收购兼并 | 交易标的、交易金额、交易对手、收购目的、标的公司主营业务及行业、标的估值及溢价率 | LLM 判断 |\n| 18 | 重大事项类 | 重大合同 | 合同金额、合同对手方、合同期限、合同内容、付款方式及条件、合同履行对营收/利润的影响、违约风险 | LLM 判断 |\n| 19 | 重大事项类 | 股权激励 | 授予/行权价格、激励对象人数及构成、限售期及解锁条件、业绩考核目标、总量占股本比例 | LLM 判断 |\n| 20 | 重大事项类 | 关联交易 | 交易对方（关联方关系）、交易金额、定价依据及公允性、交易目的及必要性、对上市公司独立性的影响 | LLM 判断 |\n| 21 | 重大事项类 | 借贷担保 | 担保金额、担保对象、被担保方财务状况、担保期限、反担保措施 | LLM 判断（大额→有价值，常规→无价值） |\n| 22 | 重大事项类 | 委托理财 | 理财金额、产品类型、预期收益率、期限、风险等级 | LLM 判断 |\n| 23 | 重大事项类 | 违纪违规 | 违规主体、违规事项、处罚措施、整改方案 | LLM 判断 |\n| 24 | 重大事项类 | 政策影响 | 政策内容、对公司业务的具体影响、公司应对措施 | LLM 判断 |\n| 25 | 重大事项类 | 人事变动 | 具体人名、原职务、新职务、变动原因 | LLM 判断 |\n| 26 | 交易提示类 | 停牌提示 | 停牌原因、预计停牌时间、复牌条件 | 自动有价值 |\n| 27 | 交易提示类 | 交易异动 | 异动类型（涨停/跌停/换手率）、异动原因、是否需核查 | 自动有价值 |\n| 28 | 交易提示类 | 澄清公告 | 澄清事项、市场传闻内容、事实情况、对股价影响 | 自动有价值 |\n| 29 | 交易提示类 | 风险提示 | 风险类型、风险内容、可能影响、应对措施 | 自动有价值 |\n| 30 | 交易提示类 | 特别处理 | ST/ST\\* 原因、风险警示内容、可能后果 | 自动有价值 |\n| 31 | 交易提示类 | 终止上市 | 终止原因、退市整理期、投资者保护措施 | 自动有价值 |\n| 32 | 交易提示类 | 恢复上市 | 恢复上市原因、复牌后交易安排、公司当前经营状况 | 自动有价值 |\n| 33 | 交易提示类 | 暂停上市 | 暂停上市原因、后续恢复条件、投资者风险提示 | 自动有价值 |\n| 34 | 配股类 | 配股预案 | 配股比例（几配几）、配股价格、募集资金总额、配股目的及资金用途、对每股收益的摊薄影响 | LLM 判断 |\n| 35 | 配股类 | 配股说明书 | 配股比例、配股价格、募集资金用途、配股条件、对现有股东的影响 | LLM 判断 |\n| 36 | 配股类 | 配股获准 | 获准日期、配股方案关键条款、后续时间安排 | LLM 判断 |\n| 37 | 配股类 | 配股发行 | 实际发行股数、实际募集资金、发行结果、上市日期 | LLM 判断 |\n| 38 | 配股类 | 配股上市 | 上市日期、配股价、对股价的影响 | LLM 判断 |\n| 39 | 增发类 | 增发预案 | 增发原因及资金需求、增发股数及价格、募集资金总额及投向、发行对象（公开/定向）、对每股收益的摊薄影响 | LLM 判断 |\n| 40 | 增发类 | 增发说明书 | 增发方案详情、募集资金用途、发行条件、风险因素 | LLM 判断 |\n| 41 | 增发类 | 增发获准 | 获准日期、方案关键条款、后续安排 | LLM 判断 |\n| 42 | 增发类 | 增发发行 | 实际发行股数、实际募集资金、发行价格、发行结果 | LLM 判断 |\n| 43 | 增发类 | 增发上市 | 上市日期、对股价的影响 | LLM 判断 |\n| 44 | 股权股本类 | 权益变动 | 变动主体、变动前持股数量及比例、变动股数、变动后持股比例、变动方式（二级市场/协议转让等） | LLM 判断 |\n| 45 | 股权股本类 | 股本变动 | 变动原因、变动前后股本结构、新增股份性质 | LLM 判断 |\n| 46 | 股权股本类 | 质押冻结 | 质押/冻结主体、质押股数、占持股比例、质权人、质押融资用途、平仓风险 | LLM 判断 |\n| 47 | 股权股本类 | 质押式回购 | 回购主体、回购金额、质押标的、期限、到期安排 | LLM 判断 |\n| 48 | 股权股本类 | 回购股权 | 累计回购金额、回购股数、占总股本比例、回购计划总额及完成进度 | LLM 判断 |\n| 49 | 股权股本类 | 约定购回 | 购回主体、购回金额、标的证券、期限、购回价格 | LLM 判断 |\n| 50 | 股权股本类 | 股权分置改革 | 改革方案概要、对价安排、流通股与非流通股比例变化 | LLM 判断 |\n| 51 | 一般公告类 | 董事会公告 | 议案内容、表决结果、重大决议 | LLM 判断（具体议案→有价值，纯程序→无价值） |\n| 52 | 一般公告类 | 股东大会 | 会议审议议案、投票结果、重要决议 | LLM 判断 |\n| 53 | 一般公告类 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率 | LLM 判断 |\n| 54 | 一般公告类 | 中介公告 | 法律意见书、保荐机构核查意见 | 自动无价值 |\n| 55 | 一般公告类 | 法律纠纷 | 原告被告、涉案金额、诉讼进展、判决结果、对公司财务的潜在影响 | LLM 判断 |\n| 56 | 一般公告类 | 机构调研公告 | 调研机构名单、调研时间、公司回复要点、投资者关注的核心问题 | LLM 判断 |\n| 57 | 一般公告类 | 其他补充更正 | 更正内容、更正前后对比 | LLM 判断 |\n| 58 | 一般公告类 | 公司资料变更 | 变更事项（名称/地址/注册资本等）、变更前后 | LLM 判断 |\n| 59 | 一般公告类 | 融资融券 | 融资融券余额变化、标的调整 | LLM 判断 |\n| 60 | 一般公告类 | 员工持股 | 持股计划规模、参与人数、股票来源、锁定期、业绩考核条件 | LLM 判断 |\n| 61 | 一般公告类 | 产销经营快报 | 主要产品产销量、同比变化、经营亮点、行业景气度 | LLM 判断 |\n| 62 | 一般公告类 | 个股其他公告 | 通用兜底类别 | LLM 判断 |\n| 63 | 一般公告类 | ESG报告 | 环境/社会/治理关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 64 | 一般公告类 | 函件 | 一般函件往来 | LLM 判断 |\n\n## 港股 7大类41小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 业绩快报 | 业绩预告 | 预计财务数据、同比增减、变动原因 | LLM 判断 |\n| 2 | 业绩快报 | 季度业绩 | 季度经营数据、同比分析 | LLM 判断 |\n| 3 | 业绩快报 | 中期业绩 | 中期财务数据、业务回顾 | LLM 判断 |\n| 4 | 业绩快报 | 末期业绩 | 全年财务数据、末期分红建议 | LLM 判断 |\n| 5 | 业绩快报 | 业绩发布会 | 发布会日期、管理层发言要点、分析师问答 | LLM 判断 |\n| 6 | 财务报告 | 环境及管治报告 | ESG 关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 7 | 财务报告 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告 | 中期报告 | 中期财务数据、管理层讨论 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 10 | 上市文件 | 预览资料 | 上市公司业务概览、财务摘要、行业定位 | LLM 判断 |\n| 11 | 上市文件 | 发售以供认购 | 发售价格、发售数量、集资额、认购安排、对股价影响 | LLM 判断 |\n| 12 | 上市文件 | 招股说明书 | 发行规模、定价、募集资金投向、风险因素 | LLM 判断 |\n| 13 | 上市文件 | 公开招股 | 招股价格区间、招股数量、集资额、上市日期、保荐人 | LLM 判断 |\n| 14 | 上市文件 | 供股 | 供股比例（几供几）、供股价格、募集资金总额、供股目的及资金用途、对现有股东的影响 | LLM 判断 |\n| 15 | 上市文件 | 资本化发行 | 发行方式、发行对象、对股本结构的影响、是否涉及大股东 | LLM 判断 |\n| 16 | 上市文件 | 介绍上市 | 介绍上市方式、不涉及公开发售的原因、上市日期、保荐人 | LLM 判断 |\n| 17 | 上市文件 | 发售现有证券 | 出售股东身份、发售股数、售价、较市价折让幅度、出售原因 | LLM 判断 |\n| 18 | 上市文件 | 聆讯资料 | 聆讯日期、上市申请关键信息 | LLM 判断 |\n| 19 | 上市文件 | 其它上市文件 | 其他上市相关文件 | LLM 判断 |\n| 20 | 股权股本 | 权益变动 | 变动主体、变动前持股比例、变动股数、变动后持股比例、变动方式 | LLM 判断 |\n| 21 | 股权股本 | 证券/股本 | 证券发行、股本结构变化、新增股份 | LLM 判断 |\n| 22 | 股权股本 | 交易披露 | 关联交易披露、重大交易披露 | LLM 判断 |\n| 23 | 股权股本 | 翌日报表 | 买入/卖出股数、成交价格、涉及股东名称及身份 | LLM 判断 |\n| 24 | 股权股本 | 月报表 | 月度股份变动汇总、各增减持主体及股数、变动后持股比例 | LLM 判断 |\n| 25 | 公告及通函 | 重大事项 | 重大交易、业务调整、资产处置 | LLM 判断 |\n| 26 | 公告及通函 | 新上市 | 新上市公司名称、主营业务及行业、发行规模及定价、集资用途、上市后表现预期 | LLM 判断 |\n| 27 | 公告及通函 | 会议/表决 | 股东会/董事会会议决议、表决结果 | LLM 判断 |\n| 28 | 公告及通函 | 关联交易 | 交易对手（关联方关系）、交易金额、定价依据、交易目的 | LLM 判断 |\n| 29 | 公告及通函 | 须公布的交易 | 交易性质（收购/出售/合营）、交易金额、交易对手、是否构成重大交易、对财务状况的影响 | LLM 判断 |\n| 30 | 公告及通函 | 公司变动 | 公司名称变更、注册地址变更、董事会成员变动 | LLM 判断 |\n| 31 | 公告及通函 | 财务资料 | 财务数据补充披露、澄清 | LLM 判断 |\n| 32 | 公告及通函 | 杂项 | 其他公告事项 | LLM 判断 |\n| 33 | 一般公告 | 交易安排 | 关键日期（除净日、过户截止日、派息日）、每股派息金额 | LLM 判断 |\n| 34 | 一般公告 | 创业板资料 | 创业板公司特定披露要求 | LLM 判断 |\n| 35 | 一般公告 | 监管者公告 | 监管机构名称、监管事项、处罚/警告措施、对公司经营的影响 | LLM 判断 |\n| 36 | 一般公告 | 委任代表表格 | 委任代表表格（通常无实质内容） | LLM 判断 |\n| 37 | 一般公告 | 宪章文件 | 公司章程、组织章程大纲及细则 | LLM 判断 |\n| 38 | 债券及结构性产品 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率、实际杠杆 | LLM 判断 |\n| 39 | 债券及结构性产品 | 权证上市 | 权证条款（标的/行权价/到期日）、上市日期、初始价格 | LLM 判断 |\n| 40 | 债券及结构性产品 | 债务证券公告 | 债券规模、票面利率、期限、信用评级、担保情况、募集资金用途 | LLM 判断 |\n| 41 | 债券及结构性产品 | 其它 | 其他结构性产品公告 | LLM 判断 |\n\n**备注：**\n- `market=0`（深圳）和 `market=1`（上海）均为 A 股\n- `market=116` 为港股\n- A 股分类存储在 `A_CATEGORY_MAP`，港股分类存储在 `HK_CATEGORY_MAP`\n- 港股公告 API 使用 `ann_type=H`，A 股使用 `ann_type=A`\n\nFile v2.1.0:references/text-cleaning.md\n\n# 公告正文清洗规则\n\n共 14 条规则，按应用顺序依次执行。每规则为正则模式，使用 `re.MULTILINE` 编译。\n\n## 规则 1: 股票代码表头行\n\n**匹配示例：**\n- `证券代码:600961 证券简称:株冶集团 公告编号:2026-021`\n- `证券代码:601669 股票简称:中国电建 公告编号:临2026-028`\n\n**正则：** `证券代码[：:]\\s*\\S+\\s+(?:证券|股票)简称[：:]\\s*\\S+\\s+(公告编号[：:]\\s*\\S+)?`\n\n**行为：** 全部移除，不保留任何信息。\n\n---\n\n## 规则 2: 纯公司名行\n\n**匹配示例：**\n- `株洲冶炼集团股份有限公司`\n- `中国电力建设股份有限公司`\n\n**正则：** `^\\s*\\S{4,20}(股份有限)?公司\\s*$`\n\n**行为：** 删除独立成行的公司全称（仅限于单独占一行的情况，不删除段落内的公司名）。\n\n---\n\n## 规则 3: 董事会/监事会免责声明\n\n**10 个变体：**\n\n| # | 变体模式 |\n|---|---------|\n| 3a | 本公司及董事会全体成员保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3b | 本公司董事会及全体董事保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3c | 本公司及全体董事……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3d | 本公司及……监事……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3e | 本公司及……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3f | 本公司……董事……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3g | 不存在……虚假……误导……重大遗漏……承担……责任 |\n| 3h | 对其内容的真实性、准确性和完整性承担法律责任 |\n| 3i | 全体董事……保证……内容……真实……准确……完整……责任 |\n| 3j | 保证……不存在……虚假……误导……遗漏……法律 |\n\n**行为：** 完整移除整句声明。注意：3a-3f 的保证范围涵盖 \"虚假记载、误导性陈述或者重大遗漏\"（含\"或者\"变体），同时支持 \"承担法律责任\" 和 \"承担个别及连带法律责任\" 等变体。\n\n---\n\n## 规则 4: \"特此公告\" 结语 + 日期落款\n\n**匹配：** `\\n\\s*特此公告[。\\s]*\\n?(?:\\s*\\S*?公司\\s*(?:董事会|监事会)?\\s*\\n?)?(?:\\s*<日期>\\s*)?`\n\n**行为：** 将 \"特此公告\" 及其后的公司名和日期整体移除，替换为换行符。\n\n**规则 4b（独立日期行）：** `\\n\\s*<日期>\\s*$`\n\n**行为：** 移除独立的日期落款行，支持中文数字日期（如 `二〇二六年五月二十九日`）和阿拉伯数字日期（如 `2026年5月29日`）。\n\n---\n\n## 规则 5: 股票信息行\n\n**匹配示例：**\n- `股票简称:申万宏源 股票代码:000166`\n\n**正则：** `股票简称[：:]\\s*\\S+\\s+股票代码[：:]\\s*\\S+`\n\n**行为：** 移除出现在募集说明书等文档开头的股票简称/代码行。\n\n---\n\n## 规则 6: \"重要内容提示\" 标记\n\n**匹配：** `重要内容提示[：:]\\s*\\n?`\n\n**行为：** 只移除 \"重要内容提示：\" 这个标题标记，保留下方的提示内容。\n\n---\n\n## 规则 7: PDF 页脚/分页噪声\n\n**三个子规则：**\n\n| # | 匹配内容 | 正则 |\n|---|---------|------|\n| 7a | `第1页 共3页` 类页脚 | `\\n\\s*第\\s*\\d+\\s*页\\s*共\\s*\\d+\\s*页\\s*\\n?` |\n| 7b | 纯数字页码行 | `^\\s*\\d+\\s*$` |\n| 7c | PDF 水印文字 | `[\\w\\-]+\\.pdf\\s*\\d{4}-\\d{2}-\\d{2}\\s*\\d{2}:\\d{2}:\\d{2}` |\n\n**行为：** 7a 替换为换行符，7b 和 7c 直接移除。\n\n---\n\n## 规则 8: 声明板块\n\n**匹配：**\n- `声 明\\n[^。]*?中国证监会[^。]*?证券交易所[^。]*?责任`\n- `声 明\\n[^。]*?本募集说明书[^。]*?真实[^。]*?准确[^。]*?完整[^。]*?责任`\n\n**行为：** 移除年报、募集说明书开头的法律声明板块。\n\n---\n\n## 规则 9: 投资者关系活动记录表头\n\n**三个子规则：**\n\n| # | 匹配内容 |\n|---|---------|\n| 9a | `证券代码：xxx 证券简称：xxx` 行 |\n| 9b | `xxx股份有限公司投资者关系活动记录表` |\n| 9c | `投资者关系活动记录表` |\n\n**行为：** 移除机构调研公告的标准表头。\n\n---\n\n## 规则 10: 地址/联系信息模板\n\n**匹配：**\n- `住所[：:].*?(?:\\d{3,6}室|号|楼|大厦|路\\d+号)`\n- `邮政编码[：:]\\s*\\d{6}`\n- `联系电话[：:]\\s*\\S+`\n- `传真[：:]\\s*\\S+`\n\n**行为：** 移除文档末尾的注册地址、邮编、电话、传真等联系信息。\n\n---\n\n## 规则 11: 募集说明书评级/担保字段\n\n**匹配：**\n- `信用评级结果[：:][^。]*?[。，]`\n- `信用评级机构[：:][^。]*?[。，]`\n- `增信措施情况[：:][^。]*?[。，]`\n- `担保或其他增信情况[：:][^。]*?[。，]`\n- `发行金额[：:][^。]*?[。，]`\n- `牵头主承销商[：:].*`\n- `联席主承销商[：:].*`\n- `簿记管理人[：:].*`\n- `受托管理人[：:].*`\n\n**行为：** 移除募集说明书中固定格式的评级、担保、承销商信息。\n\n---\n\n## 规则 12: 目录页\n\n**匹配：** `目\\s*录\\s*\\n[\\s\\S]*?(?=议案|一[、）]|\\d[、）])`\n\n**行为：** 从 \"目 录\" 标记开始到第一个议案/章节标题之间的内容全部移除。适用于年报、股东会会议资料等包含目录的文档。\n\n---\n\n## 规则 13: H股表格模板文字\n\n**匹配：**\n- `翌日披露報表\\s*\\([^)]*\\)\\s*`\n- `表格類別[：:]\\s*\\S+\\s+狀態[：:]\\s*\\S+\\s*`\n- `如上市發行人的已發行股份[^。]*?作出披露，必須填妥第一章節。`\n\n**行为：** 移除港股翌日披露报表的标准表格模板文字。\n\n---\n\n## 规则 14: 多余空白行\n\n**匹配：**\n- `\\n{3,}` → 替换为 `\\n\\n`（保留最多一个空行）\n- `^\\s*\\n` → 移除文档开头的空行\n\n**行为：** 压缩多余连续空行，清理文档首尾空白，最后执行 `strip()`。\n\n---\n\n## 执行统计\n\n```python\ndef get_stats(original: str, cleaned: str) -> dict:\n    \"\"\"返回清洗前后的字数对比\"\"\"\n```\n\n清洗效率通常可减少 15%-30% 的字符数（取决于文档类型），招股说明书和年度报告等模板化程度高的文档节省更明显。\n\nFile v2.1.0:references/token-cost.md\n\n# Token 消耗分析\n\n## 各操作 Token 消耗表\n\n| 操作 | Token 消耗 | 说明 |\n|------|-----------|------|\n| LLM 标题判断 | ~100 token/条 | 标题独立调用，单条非常轻量 |\n| LLM 摘要生成 | ~1500 输入 + 500 输出 | BATCH_SIZE=1，每条公告独立调用 |\n| 定期报告跳过 | 0 | 使用固定摘要 `【类型】标题`，不调 LLM |\n| Digest 输出 | 0 | 从 DB 读取已有摘要，不调 LLM |\n| 无新公告 | 0 | 直接跳过，无 API 调用 |\n\n## 优化策略\n\n### 1. 正则预过滤大幅减少 LLM 调用\n\n13 条 `SKIP_CONTENT_PATTERNS` 在 Phase 1a 顺序执行，极速过滤掉公司章程、信用评级、募集说明书等纯模板文档。只有通过正则检查的公告才进入 Phase 1b 的 LLM 判断。\n\n### 2. LLM 标题判断成本极低\n\n每条公告仅用标题做判断（~100 token），不涉及正文。20 workers 并发处理，延迟极低。\n\n### 3. 低价值公告不下载正文\n\nLLM 判断为 non-valuable 的公告直接跳过 Phase 2（正文下载），节省 PDF 下载带宽和后续 LLM 摘要 token。\n\n### 4. 摘要阶段跳过定期报告\n\n`SKIP_LLM_TYPES` 包括 6 种定期报告类型：业绩预告、业绩快报、季度报告、半年报告、年度报告、补充更正。这些公告正文极长（年度报告可达数万字），直接用 `【类型】标题` 作为摘要，完全不调用 LLM。\n\n### 5. BATCH_SIZE=1 避免超长上下文\n\nBATCH_SIZE 固定为 1，每次 LLM 调用处理一条公告。虽然单次调用效率较低，但避免了超长上下文带来的 token 浪费和摘要质量下降。\n\n### 6. Digest 不消耗 Token\n\n`--digest` 模式直接从 DB 读取已有摘要做格式化输出，无任何 LLM 调用。\n\n### 7. 按需增量处理\n\n`--hours` 参数只处理最近 N 小时入库的公告，避免全量回溯。\n\n### 8. 每日场景估算\n\n假设每天 200 条新公告，其中 50% 通过正则过滤：\n- Phase 1b LLM 标题判断：100 条 × ~100 token = ~10K token\n- 其中 ~30% 被判断为 valuable（30 条）\n- Phase 3 LLM 摘要生成：30 条 × ~2000 token = ~60K token\n- 其中 6 条定期报告跳过 LLM：24 条 × ~2000 token = ~48K token\n\n**日总消耗：~58K token**\n**月总消耗（22 交易日）：~1.28M token**\n\nFile v2.1.0:skill-card.md\n\n## Description: <br>\nTracks Eastmoney watchlist announcements with three-stage filtering, optional LLM classification and summaries, and a local web dashboard. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[54lynnn](https://clawhub.ai/user/54lynnn) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and agents use this skill to monitor selected Eastmoney stock groups, filter announcements, summarize high-value items, and review results through a digest or dashboard. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill handles Eastmoney session cookies and optional LLM API keys. <br>\nMitigation: Use a dedicated low-privilege Eastmoney session where possible, and protect cookie.txt and .env like passwords. <br>\nRisk: Watchlist and announcement data may be sent to the configured LLM endpoint. <br>\nMitigation: Confirm the LLM base_url matches the intended API-key provider before enabling LLM classification or summaries. <br>\nRisk: The setup script can add recurring jobs. <br>\nMitigation: Review setup.sh before running it and only install cron jobs when scheduled execution is intended. <br>\nRisk: The dashboard can expose local announcement data on a shared network if broadly bound. <br>\nMitigation: Bind the dashboard to localhost or otherwise restrict access when running on shared machines. <br>\n\n\n## Reference(s): <br>\n- [System Architecture](references/architecture.md) <br>\n- [Announcement Classification](references/classification.md) <br>\n- [Token Cost Analysis](references/token-cost.md) <br>\n- [Text Cleaning Rules](references/text-cleaning.md) <br>\n- [Eastmoney Watchlist](https://quote.eastmoney.com/zixuan/lite.html) <br>\n- [CNInfo Announcement Query](https://www.cninfo.com.cn/new/hisAnnouncement/query) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance] <br>\n**Output Format:** [Plain text digest, Markdown guidance, shell commands, configuration snippets, and a local HTML dashboard] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Digest output uses DIGEST_TOTAL or DIGEST_EMPTY markers; dashboard runs locally on a configurable PORT.] <br>\n\n## Skill Version(s): <br>\n2.1.0 (source: server release metadata; artifact frontmatter reports 2.0.0) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v2.1.0:config.json\n\n{\n  \"notify\": {\n    \"type\": \"terminal\",\n    \"webhook_url\": \"\"\n  },\n  \"fetch_interval_days\": 7,\n  \"stocks\": [],\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n\nFile v2.1.0:requirements.txt\n\nrequests>=2.31.0\nflask>=3.0.0\npdfplumber>=0.10.0\n\nArchive v2.0.10: 26 files, 70659 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), README.md (3754b), references/architecture.md (7216b), references/classification.md (13315b), references/text-cleaning.md (6183b), references/token-cost.md (2260b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (13368b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14645b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_watcher.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2748b), SKILL.md (4524b), _meta.json (133b)\n\nFile v2.0.10:SKILL.md\n\n---\nname: \"stock-watcher-pro\"\nversion: \"2.0.0\"\ndescription: \"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。\"\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"📊\",\n        \"requires\": { \"python\": \"3.9+\" },\n        \"install\":\n          [\n            {\n              \"id\": \"deps\",\n              \"kind\": \"shell\",\n              \"command\": \"cd {{SKILL_DIR}} && pip install requests pdfplumber flask\",\n              \"label\": \"Install Python dependencies\",\n            },\n          ],\n      },\n  }\n---\n\n# 📊 Stock Watcher - 东方财富自选股公告追踪\n\n**双模式技能** — Agent 定时自动追踪 + 用户 Web 仪表盘查看。\n\n告诉 agent 你想做什么，例如：\n\n> \"帮我看看持仓板块这两天有什么重要公告\"\n> \"每天8点提醒我有价值的自选股公告\"\n> \"帮我打开公告仪表盘看看\"\n\n## 模式一：Agent Run 模式\n\nAgent 定时运行 `run.sh`，自动抓取公告、生成摘要，输出有价值公告的 digest 转发给用户。\n\n告诉 agent 即可：\n\n> \"帮我设置 stock-watcher 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动运行：\n\n```bash\n# 用法: bash run.sh [group] [days] [source]\nbash run.sh mygroup 15 eastmoney\n```\n\n### 输出示例\n\n**有公告时：**\n```\nDIGEST_TOTAL:3\n1.\n【000001平安银行】-【平安银行2026年第一季度报告】\n【季度报告】...\n\n2.\n【600519贵州茅台】-【贵州茅台关于回购股份的进展公告】\n累计回购金额XX亿元...\n```\n\n**无公告时：**\n```\nDIGEST_EMPTY:最近1天test板块无高价值公告\n```\n\n---\n\n## 模式二：Dashboard 模式\n\n用户手动运行，抓取公告 + 生成摘要 + 启动 Web 仪表盘，浏览器查看所有公告详情。\n\n告诉 agent 即可：\n\n> \"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"\n\n或者手动运行：\n\n```bash\n# 用法: bash dashboard.sh [group] [days] [source]\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n脚本自动执行三步：\n1. `stock_watcher.py --fetch-content` — 抓取公告 + 全文 + LLM 分类\n2. `daily_summary.py` — 生成摘要\n3. `dashboard.py` — 启动 Flask 仪表盘（默认端口 5001）\n\n启动后浏览器访问 `http://localhost:5001`，按 Ctrl+C 停止。\n\n**仪表盘功能：**\n- 股票列表表格：7天/15天/30天/全部的有价值公告比例\n- 点击展开：懒加载公告详情（标题、日期、摘要、正文、原文链接）\n- 类型标签：`大类 / 小类`（如 `股权股本类 / 回购`）\n- 搜索过滤，响应式设计\n\n---\n\n## 首次设置\n\n告诉 agent 即可：\n\n> \"帮我初始化 stock-watcher，安装依赖、配置 Cookie 和 LLM\"\n\n或者按以下步骤手动设置：\n\n### 1. 安装依赖\n\n```bash\ncd ~/.openclaw/workspace/skills/stock-watcher\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n东方财富网页版登录后的 Cookie，用于获取自选股列表。\n\n1. 浏览器打开 [https://quote.eastmoney.com/zixuan/lite.html](https://quote.eastmoney.com/zixuan/lite.html) 并登录\n2. F12 → Console → 输入 `copy(document.cookie)` 回车\n3. 粘贴到 `cookie.txt`\n\n**自动续签（可选）：**\n```bash\npip install playwright && playwright install chromium\npython3 scripts/refresh_cookie.py\n```\n\n### 3. 配置 LLM（可选）\n\nLLM 用于标题价值判断、公告分类和摘要生成。未配置时仅使用正则过滤。\n\n```bash\n# .env 文件\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n```json\n// config.json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_watcher.py --group test --days 15 --fetch-content\npython3 scripts/stock_watcher.py --stats\n```\n\n### 5. 配置定时任务\n\n告诉 agent 即可，例如：\n\n> \"帮我设置 stock-watcher 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动配置：\n\n```bash\nopenclaw cron add \\\n  --name stock-watcher \\\n  --cron \"0 1 * * *\" \\\n  --message \"运行股票公告扫描：cd {{SKILL_DIR}} && bash run.sh mygroup 15 eastmoney\"\n```\n---\n\n完整技术文档、公告分类体系、Token 消耗分析等详见 [GitHub](https://github.com/54Lynnn/stock-watcher-pro)\n\n## 开源\n\n- **GitHub**: [github.com/54Lynnn/stock-watcher-pro](https://github.com/54Lynnn/stock-watcher-pro)\n\nFile v2.0.10:README.md\n\n# Stock Watcher Pro - 东方财富自选股公告追踪\n\n自动追踪东方财富自选股公告，三级过滤 + LLM 分类摘要 + Web 仪表盘。支持 Agent 定时推送和手动查看。\n\n> 通过 ClawHub 安装：`clawhub install stock-watcher-pro`\n\n---\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\ncd /path/to/stock-watcher-pro\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n浏览器登录 [东方财富自选股](https://quote.eastmoney.com/zixuan/lite.html)，F12 → Console → `copy(document.cookie)`，粘贴到 `cookie.txt`。\n\n自动续签：`pip install playwright && playwright install chromium && python3 scripts/refresh_cookie.py`\n\n### 3. 配置 LLM（可选）\n\n```bash\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n`config.json` 中配置模型地址等参数（默认使用 DeepSeek V4 Flash）。未配置时自动禁用 LLM，仅使用正则过滤。\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_watcher.py --group test --days 15 --fetch-content\npython3 scripts/stock_watcher.py --stats\n```\n\n---\n\n## 两种模式\n\n### Agent Run 模式\n\n告诉 agent：`\"每天8点提醒我有价值的自选股公告\"`\n\n或手动运行：\n\n```bash\nbash run.sh mygroup 15 eastmoney\n```\n\n输出 digest 到 stdout（agent 读取转发），无公告时输出 `DIGEST_EMPTY:...`。\n\n### Dashboard 模式\n\n告诉 agent：`\"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"`\n\n或手动运行：\n\n```bash\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n自动执行：抓取 → 摘要 → 启动 Web 仪表盘（`http://localhost:5001`），Ctrl+C 停止。\n\n---\n\n## 常用命令\n\n```bash\npython3 scripts/stock_watcher.py --stats                 # 数据库统计\npython3 scripts/stock_watcher.py --list                  # 最近公告\npython3 scripts/stock_watcher.py --list --stock 600519   # 指定股票\npython3 scripts/stock_watcher.py --list-groups           # 可用分组\npython3 scripts/stock_watcher.py --clean                 # 清洗正文\n```\n\n---\n\n## 文件结构\n\n```\nstock-watcher-pro/\n  SKILL.md              # Agent 入口文档\n  README.md             # 本文档\n  config.json           # LLM 配置\n  cookie.txt            # 东方财富 Cookie\n  .env                  # LLM API Key\n  run.sh                # Agent Run 模式\n  dashboard.sh          # Dashboard 模式\n  scripts/              # Python 脚本\n  logs/                 # 运行日志\n  .stock-watcher-state/ # SQLite 数据库\n  references/           # 技术参考文档\n```\n\n---\n\n## 配置\n\n### config.json\n\n```json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### .env\n\n```\nLLM_API_KEY=sk-your-api-key-here\n```\n\n### 数据源\n\n默认全部走东方财富 API（A股+港股）。指定 `--source cninfo` 时 A 股走巨潮资讯网（PDF 更稳定），港股仍走东方财富。\n\n---\n\n## 依赖\n\n- Python 3.9+ / requests / pdfplumber / flask / sqlite3\n- playwright（可选，Cookie 自动续签）\n\n---\n\n## 技术参考\n\n详细文档见 `references/` 目录：\n\n- [系统架构](file:///home/administrator/.openclaw/workspace/skills/stock-watcher-pro/references/architecture.md) — 数据流、模块详解、过滤策略\n- [公告分类体系](file:///home/administrator/.openclaw/workspace/skills/stock-watcher-pro/references/classification.md) — A股8大类64小类 + 港股7大类41小类\n- [Token消耗分析](file:///home/administrator/.openclaw/workspace/skills/stock-watcher-pro/references/token-cost.md) — LLM 调用成本优化\n- [正文清洗规则](file:///home/administrator/.openclaw/workspace/skills/stock-watcher-pro/references/text-cleaning.md) — 14类清洗规则详解\n\nFile v2.0.10:_meta.json\n\n{\n  \"ownerId\": \"kn742cdrc476d1kbhpsvnrnznx81x4r7\",\n  \"slug\": \"stock-tracker\",\n  \"version\": \"2.0.10\",\n  \"publishedAt\": 1780838924548\n}\n\nFile v2.0.10:references/architecture.md\n\n# 系统架构\n\n## 数据流总览\n\n```\n东方财富/巨潮资讯\n      │\n      ▼\neastmoney_api.py / cninfo_api.py  ─── 获取公告列表\n      │\n      ▼\nstock_watcher.py ─── 主入口，协调各模块\n      │\n      ├─ Phase 1a: 正则跳过判断 (ann_detail.should_skip_content)\n      │     │  13 条 SKIP_CONTENT_PATTERNS，极速过滤\n      │     ▼\n      ├─ Phase 1b: LLM 标题价值判断 (llm_judge.py)\n      │     │  并发 20 workers，判断 valuable / non-valuable\n      │     ▼\n      ├─ Phase 2: 并发下载正文 (ann_detail.fetch_announcement_content)\n      │     │  优先 API，回退 PDF 提取，max_workers=5\n      │     ▼\n      ├─ Phase 3: 顺序清洗 (text_cleaner.py) + 分批保存到 DB\n      │     ▼\n      ├─ daily_summary.py ─── 为有价值公告生成 LLM 摘要\n      │     │  BATCH_SIZE=1, workers=20, 定期报告跳过 LLM\n      │     ▼\n      └─ dashboard.py ─── Flask Web 仪表盘，lazy loading\n```\n\n## 模块分解\n\n### stock_watcher.py（主入口）\n\n**CLI 参数：**\n\n| 参数 | 用途 |\n|------|------|\n| `--force` | 强制重新抓取所有公告（覆盖已见检查） |\n| `--days N` | 抓取最近 N 天公告 |\n| `--dry-run` | 试运行，不更新数据库 |\n| `--group` | 只追踪指定分组（模糊匹配） |\n| `--list-groups` | 列出所有可用分组 |\n| `--stats` | 查看数据库统计 |\n| `--list` | 列出历史公告 |\n| `--fetch-content` | 补抓缺少全文的公告正文 |\n| `--clean` | 清洗已获取的公告正文 |\n| `--prune` | 清理无正文的空记录 |\n| `--source` | eastmoney（默认）或 cninfo |\n\n**执行流程：**\n1. 解析参数 → 执行子命令（stats/list/clean/prune/fetch-content）或完整运行\n2. 完整运行：获取自选股列表 → 获取公告列表 → 过滤已见 → 获取全文 → 入库\n\n### eastmoney_api.py（东方财富数据获取）\n\n**自选股获取（3 级回退）：**\n1. **myfavor API** `https://myfavor.eastmoney.com/v4/webouter` — 支持分组过滤\n2. **Cookie 解析** — 从 `selfSelectStocks` 字段正则提取\n3. **config.json** — 手动配置硬编码列表\n\n**公告 API：**\n- `https://np-anotice-stock.eastmoney.com/api/security/ann`\n- `ann_type=A` 为 A 股，`ann_type=H` 为港股\n- 参数：`stock_list={market},{code}`\n\n**Market 字段值：**\n\n| 值 | 市场 | 标签 |\n|----|------|------|\n| 0 | 深圳 | SZ |\n| 1 | 上海 | SH |\n| 100 | 美股 | US |\n| 104 | 期货 | FUT |\n| 116 | 港股 | HK |\n| 119 | 外汇 | FX |\n| 124 | 港股通 | HKI |\n| 134 | 港股通(深) | HKF |\n| 251 | 其他 | OTHER |\n\n### cninfo_api.py（巨潮资讯网数据获取）\n\n**API 端点：**\n- 列表：`POST https://www.cninfo.com.cn/new/hisAnnouncement/query`\n- PDF 基址：`https://static.cninfo.com.cn/{adjunctUrl}`\n\n**请求参数：**\n- `searchkey`: 股票代码\n- `seDate`: 日期范围 `YYYY-MM-DD~YYYY-MM-DD`\n- `pageNum` / `pageSize`: 分页\n- `column`: szse\n\n### ann_detail.py（公告正文获取）\n\n**内容获取优先级：**\n1. **内容 API** `https://np-cnotice-stock.eastmoney.com/api/content/ann`（需东方财富网络环境）\n2. **PDF 下载 + 文本提取** `https://pdf.dfcfw.com/pdf/H2_{art_code}_1.pdf`\n3. 外部传入 `pdf_url_override`（巨潮 PDF 链接）：直接下载 PDF\n\n**跳过全文采集的标题模式（13 条）：**\n1. 公司章程\n2. 信用评级 / 跟踪评级\n3. 募集说明书\n4. 付息公告\n5. 上市公告 / 摘牌\n6. 发行结果公告 / 票面利率 / 簿记建档 / 更名公告 / 发行完毕\n7. 董事会报告\n8. 法律意见书\n9. 股东会决议公告 / 股东会表决结果 / 投票表决结果\n10. 薪酬\n11. 周年会通告\n12. 担保额度\n13. 召开情况\n\n**TOC 提取：**\n超长文档（通函、海外市场公告、股东会会议资料、发行公告）只提取目录或开头 2000 字。\n\n### llm_judge.py（LLM 标题价值判断）\n\n**核心功能：**\n- 判断公告标题是否有价值（valuable / non-valuable）\n- 输出 category（大类）和 type（小类）\n- 使用 JSON mode（`response_format: {\"type\": \"json_object\"}`）\n- Fail-open：所有重试失败后默认视为有价值\n\n**重试策略：** 最多 2 次重试，间隔递增\n\n**System Prompt 结构：**\n1. A 股 8 大类 + HK 7 大类分类体系\n2. 高价值 type 列表\n3. 低价值 type 列表\n4. 需要结合标题判断的 type（董事会公告、借贷担保、利润分配）\n\n### text_cleaner.py（公告正文清洗）\n\n详见 `text-cleaning.md`。\n\n### daily_summary.py（每日公告摘要）\n\n**批处理参数：**\n- `BATCH_SIZE=1`：每次 LLM 调用只处理一条公告（避免超长上下文）\n- `max_workers=20`：并发线程数\n- `SKIP_LLM_TYPES`：定期报告类型跳过 LLM，使用固定摘要 `【类型】标题`\n\n**输出模式：**\n- `--digest` 输出格式化摘要列表（STDOUT），供 agent 读取转发\n- 格式：`DIGEST_TOTAL:N` → 编号列表\n\n### db.py（SQLite 存储）\n\n**核心特性：**\n- WAL 模式：`PRAGMA journal_mode=WAL`\n- UPSERT 含 null 保护：`ON CONFLICT(ann_id) DO UPDATE SET ... CASE WHEN excluded.x != '' THEN excluded.x ELSE announcements.x END`\n- 自动迁移：`_migrate_schema()` 增量添加新字段（full_text, clean_text, attach_url, summary, status, ann_type_tag, ann_type_category, clean_text_length）\n\n### dashboard.py（Flask Web 仪表盘）\n\n**路由：**\n| 端点 | 说明 |\n|------|------|\n| `GET /` | 首页（单页应用） |\n| `GET /api/stocks` | 股票概览统计（7/15/30天/全部） |\n| `GET /api/announcements/<code>` | 个股公告列表（lazy loading） |\n\n**前端特性：**\n- 股票表格行可展开\n- 搜索框实时过滤\n- 浮动个股栏（滚动时固定显示当前展开股票）\n- 分类标签展示\n\n## 过滤策略（3 层）\n\n```\n公告列表\n   │\n   ▼\nLayer 1: 正则跳过 (should_skip_content)\n   │  13 条 SKIP_CONTENT_PATTERNS\n   │  公司章程、信用评级、募集说明书、付息公告、上市公告等\n   │  跳过 → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 2: LLM 标题判断 (llm_judge.judge)\n   │  valuable → 继续下载全文\n   │  non-valuable → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 3: 下载失败\n   │  API/PDF 均失败 → status=filtered\n   │\n   ▼\n最终 DB 入库\n   valuable 有价值 | filtered 已过滤\n```\n\n## LLM 有价值/无价值类型\n\n**高价值 type（几乎总是下载）：**\n- 财务报告类全部（业绩预告、业绩快报、季度/半年/年度报告）\n- 交易提示类全部（停牌提示、交易异动、澄清公告、风险提示、特别处理、终止上市等）\n- 重大事项类：资产重组、收购兼并、股权激励、关联交易、违纪违规\n- 股权股本类：回购股权、权益变动\n- 一般公告类：法律纠纷、产销经营快报、机构调研公告\n- 港股：翌日报表、须公布的交易\n\n**低价值 type（几乎总是跳过）：**\n- 中介公告（法律意见书、保荐机构核查意见、律师核查意见）\n- 股东大会通知\n- 薪酬管理制度、董事会议事规则、公司章程修正案\n- 债券付息公告、发行结果公告\n\nFile v2.0.10:references/classification.md\n\n# 公告分类体系\n\n## A股 8大类64小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 招股类 | 申报稿 | 募集资金用途、财务数据概览 | LLM 判断 |\n| 2 | 招股类 | 申报反馈 | 监管问询要点、回复内容 | LLM 判断 |\n| 3 | 招股类 | 招股说明书 | 发行规模、定价、募集资金投向 | LLM 判断 |\n| 4 | 招股类 | 发行定价 | 发行价格、市盈率、发行日期 | LLM 判断 |\n| 5 | 招股类 | 发行结果 | 实际发行股数、募集资金总额 | LLM 判断 |\n| 6 | 招股类 | 上市公告书 | 上市日期、交易安排 | LLM 判断 |\n| 7 | 财务报告类 | 业绩预告 | 预计营收/利润数字、同比增减幅度、业绩变动原因 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告类 | 业绩快报 | 实际营收/利润数字、同比增减、与预告差异 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告类 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 10 | 财务报告类 | 半年报告 | 半年度财务数据、经营讨论 | 跳过 LLM，固定摘要 |\n| 11 | 财务报告类 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 12 | 财务报告类 | 补充更正 | 更正内容、更正前后对比 | 跳过 LLM，固定摘要 |\n| 13 | 重大事项类 | 利润分配 | 每股分红金额、分红总额、股权登记日、除权除息日 | LLM 判断 |\n| 14 | 重大事项类 | 股份增减持 | 增减持主体、变动股数、变动后持股比例、原因及后续计划 | LLM 判断 |\n| 15 | 重大事项类 | 资金投向 | 投资项目、投资金额、预期收益、资金来源、实施周期 | LLM 判断 |\n| 16 | 重大事项类 | 资产重组 | 重组标的、交易金额、交易对手、重组方式、标的公司主营业务及行业、重组后对业务布局的影响 | LLM 判断 |\n| 17 | 重大事项类 | 收购兼并 | 交易标的、交易金额、交易对手、收购目的、标的公司主营业务及行业、标的估值及溢价率 | LLM 判断 |\n| 18 | 重大事项类 | 重大合同 | 合同金额、合同对手方、合同期限、合同内容、付款方式及条件、合同履行对营收/利润的影响、违约风险 | LLM 判断 |\n| 19 | 重大事项类 | 股权激励 | 授予/行权价格、激励对象人数及构成、限售期及解锁条件、业绩考核目标、总量占股本比例 | LLM 判断 |\n| 20 | 重大事项类 | 关联交易 | 交易对方（关联方关系）、交易金额、定价依据及公允性、交易目的及必要性、对上市公司独立性的影响 | LLM 判断 |\n| 21 | 重大事项类 | 借贷担保 | 担保金额、担保对象、被担保方财务状况、担保期限、反担保措施 | LLM 判断（大额→有价值，常规→无价值） |\n| 22 | 重大事项类 | 委托理财 | 理财金额、产品类型、预期收益率、期限、风险等级 | LLM 判断 |\n| 23 | 重大事项类 | 违纪违规 | 违规主体、违规事项、处罚措施、整改方案 | LLM 判断 |\n| 24 | 重大事项类 | 政策影响 | 政策内容、对公司业务的具体影响、公司应对措施 | LLM 判断 |\n| 25 | 重大事项类 | 人事变动 | 具体人名、原职务、新职务、变动原因 | LLM 判断 |\n| 26 | 交易提示类 | 停牌提示 | 停牌原因、预计停牌时间、复牌条件 | 自动有价值 |\n| 27 | 交易提示类 | 交易异动 | 异动类型（涨停/跌停/换手率）、异动原因、是否需核查 | 自动有价值 |\n| 28 | 交易提示类 | 澄清公告 | 澄清事项、市场传闻内容、事实情况、对股价影响 | 自动有价值 |\n| 29 | 交易提示类 | 风险提示 | 风险类型、风险内容、可能影响、应对措施 | 自动有价值 |\n| 30 | 交易提示类 | 特别处理 | ST/ST\\* 原因、风险警示内容、可能后果 | 自动有价值 |\n| 31 | 交易提示类 | 终止上市 | 终止原因、退市整理期、投资者保护措施 | 自动有价值 |\n| 32 | 交易提示类 | 恢复上市 | 恢复上市原因、复牌后交易安排、公司当前经营状况 | 自动有价值 |\n| 33 | 交易提示类 | 暂停上市 | 暂停上市原因、后续恢复条件、投资者风险提示 | 自动有价值 |\n| 34 | 配股类 | 配股预案 | 配股比例（几配几）、配股价格、募集资金总额、配股目的及资金用途、对每股收益的摊薄影响 | LLM 判断 |\n| 35 | 配股类 | 配股说明书 | 配股比例、配股价格、募集资金用途、配股条件、对现有股东的影响 | LLM 判断 |\n| 36 | 配股类 | 配股获准 | 获准日期、配股方案关键条款、后续时间安排 | LLM 判断 |\n| 37 | 配股类 | 配股发行 | 实际发行股数、实际募集资金、发行结果、上市日期 | LLM 判断 |\n| 38 | 配股类 | 配股上市 | 上市日期、配股价、对股价的影响 | LLM 判断 |\n| 39 | 增发类 | 增发预案 | 增发原因及资金需求、增发股数及价格、募集资金总额及投向、发行对象（公开/定向）、对每股收益的摊薄影响 | LLM 判断 |\n| 40 | 增发类 | 增发说明书 | 增发方案详情、募集资金用途、发行条件、风险因素 | LLM 判断 |\n| 41 | 增发类 | 增发获准 | 获准日期、方案关键条款、后续安排 | LLM 判断 |\n| 42 | 增发类 | 增发发行 | 实际发行股数、实际募集资金、发行价格、发行结果 | LLM 判断 |\n| 43 | 增发类 | 增发上市 | 上市日期、对股价的影响 | LLM 判断 |\n| 44 | 股权股本类 | 权益变动 | 变动主体、变动前持股数量及比例、变动股数、变动后持股比例、变动方式（二级市场/协议转让等） | LLM 判断 |\n| 45 | 股权股本类 | 股本变动 | 变动原因、变动前后股本结构、新增股份性质 | LLM 判断 |\n| 46 | 股权股本类 | 质押冻结 | 质押/冻结主体、质押股数、占持股比例、质权人、质押融资用途、平仓风险 | LLM 判断 |\n| 47 | 股权股本类 | 质押式回购 | 回购主体、回购金额、质押标的、期限、到期安排 | LLM 判断 |\n| 48 | 股权股本类 | 回购股权 | 累计回购金额、回购股数、占总股本比例、回购计划总额及完成进度 | LLM 判断 |\n| 49 | 股权股本类 | 约定购回 | 购回主体、购回金额、标的证券、期限、购回价格 | LLM 判断 |\n| 50 | 股权股本类 | 股权分置改革 | 改革方案概要、对价安排、流通股与非流通股比例变化 | LLM 判断 |\n| 51 | 一般公告类 | 董事会公告 | 议案内容、表决结果、重大决议 | LLM 判断（具体议案→有价值，纯程序→无价值） |\n| 52 | 一般公告类 | 股东大会 | 会议审议议案、投票结果、重要决议 | LLM 判断 |\n| 53 | 一般公告类 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率 | LLM 判断 |\n| 54 | 一般公告类 | 中介公告 | 法律意见书、保荐机构核查意见 | 自动无价值 |\n| 55 | 一般公告类 | 法律纠纷 | 原告被告、涉案金额、诉讼进展、判决结果、对公司财务的潜在影响 | LLM 判断 |\n| 56 | 一般公告类 | 机构调研公告 | 调研机构名单、调研时间、公司回复要点、投资者关注的核心问题 | LLM 判断 |\n| 57 | 一般公告类 | 其他补充更正 | 更正内容、更正前后对比 | LLM 判断 |\n| 58 | 一般公告类 | 公司资料变更 | 变更事项（名称/地址/注册资本等）、变更前后 | LLM 判断 |\n| 59 | 一般公告类 | 融资融券 | 融资融券余额变化、标的调整 | LLM 判断 |\n| 60 | 一般公告类 | 员工持股 | 持股计划规模、参与人数、股票来源、锁定期、业绩考核条件 | LLM 判断 |\n| 61 | 一般公告类 | 产销经营快报 | 主要产品产销量、同比变化、经营亮点、行业景气度 | LLM 判断 |\n| 62 | 一般公告类 | 个股其他公告 | 通用兜底类别 | LLM 判断 |\n| 63 | 一般公告类 | ESG报告 | 环境/社会/治理关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 64 | 一般公告类 | 函件 | 一般函件往来 | LLM 判断 |\n\n## 港股 7大类41小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 业绩快报 | 业绩预告 | 预计财务数据、同比增减、变动原因 | LLM 判断 |\n| 2 | 业绩快报 | 季度业绩 | 季度经营数据、同比分析 | LLM 判断 |\n| 3 | 业绩快报 | 中期业绩 | 中期财务数据、业务回顾 | LLM 判断 |\n| 4 | 业绩快报 | 末期业绩 | 全年财务数据、末期分红建议 | LLM 判断 |\n| 5 | 业绩快报 | 业绩发布会 | 发布会日期、管理层发言要点、分析师问答 | LLM 判断 |\n| 6 | 财务报告 | 环境及管治报告 | ESG 关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 7 | 财务报告 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告 | 中期报告 | 中期财务数据、管理层讨论 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 10 | 上市文件 | 预览资料 | 上市公司业务概览、财务摘要、行业定位 | LLM 判断 |\n| 11 | 上市文件 | 发售以供认购 | 发售价格、发售数量、集资额、认购安排、对股价影响 | LLM 判断 |\n| 12 | 上市文件 | 招股说明书 | 发行规模、定价、募集资金投向、风险因素 | LLM 判断 |\n| 13 | 上市文件 | 公开招股 | 招股价格区间、招股数量、集资额、上市日期、保荐人 | LLM 判断 |\n| 14 | 上市文件 | 供股 | 供股比例（几供几）、供股价格、募集资金总额、供股目的及资金用途、对现有股东的影响 | LLM 判断 |\n| 15 | 上市文件 | 资本化发行 | 发行方式、发行对象、对股本结构的影响、是否涉及大股东 | LLM 判断 |\n| 16 | 上市文件 | 介绍上市 | 介绍上市方式、不涉及公开发售的原因、上市日期、保荐人 | LLM 判断 |\n| 17 | 上市文件 | 发售现有证券 | 出售股东身份、发售股数、售价、较市价折让幅度、出售原因 | LLM 判断 |\n| 18 | 上市文件 | 聆讯资料 | 聆讯日期、上市申请关键信息 | LLM 判断 |\n| 19 | 上市文件 | 其它上市文件 | 其他上市相关文件 | LLM 判断 |\n| 20 | 股权股本 | 权益变动 | 变动主体、变动前持股比例、变动股数、变动后持股比例、变动方式 | LLM 判断 |\n| 21 | 股权股本 | 证券/股本 | 证券发行、股本结构变化、新增股份 | LLM 判断 |\n| 22 | 股权股本 | 交易披露 | 关联交易披露、重大交易披露 | LLM 判断 |\n| 23 | 股权股本 | 翌日报表 | 买入/卖出股数、成交价格、涉及股东名称及身份 | LLM 判断 |\n| 24 | 股权股本 | 月报表 | 月度股份变动汇总、各增减持主体及股数、变动后持股比例 | LLM 判断 |\n| 25 | 公告及通函 | 重大事项 | 重大交易、业务调整、资产处置 | LLM 判断 |\n| 26 | 公告及通函 | 新上市 | 新上市公司名称、主营业务及行业、发行规模及定价、集资用途、上市后表现预期 | LLM 判断 |\n| 27 | 公告及通函 | 会议/表决 | 股东会/董事会会议决议、表决结果 | LLM 判断 |\n| 28 | 公告及通函 | 关联交易 | 交易对手（关联方关系）、交易金额、定价依据、交易目的 | LLM 判断 |\n| 29 | 公告及通函 | 须公布的交易 | 交易性质（收购/出售/合营）、交易金额、交易对手、是否构成重大交易、对财务状况的影响 | LLM 判断 |\n| 30 | 公告及通函 | 公司变动 | 公司名称变更、注册地址变更、董事会成员变动 | LLM 判断 |\n| 31 | 公告及通函 | 财务资料 | 财务数据补充披露、澄清 | LLM 判断 |\n| 32 | 公告及通函 | 杂项 | 其他公告事项 | LLM 判断 |\n| 33 | 一般公告 | 交易安排 | 关键日期（除净日、过户截止日、派息日）、每股派息金额 | LLM 判断 |\n| 34 | 一般公告 | 创业板资料 | 创业板公司特定披露要求 | LLM 判断 |\n| 35 | 一般公告 | 监管者公告 | 监管机构名称、监管事项、处罚/警告措施、对公司经营的影响 | LLM 判断 |\n| 36 | 一般公告 | 委任代表表格 | 委任代表表格（通常无实质内容） | LLM 判断 |\n| 37 | 一般公告 | 宪章文件 | 公司章程、组织章程大纲及细则 | LLM 判断 |\n| 38 | 债券及结构性产品 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率、实际杠杆 | LLM 判断 |\n| 39 | 债券及结构性产品 | 权证上市 | 权证条款（标的/行权价/到期日）、上市日期、初始价格 | LLM 判断 |\n| 40 | 债券及结构性产品 | 债务证券公告 | 债券规模、票面利率、期限、信用评级、担保情况、募集资金用途 | LLM 判断 |\n| 41 | 债券及结构性产品 | 其它 | 其他结构性产品公告 | LLM 判断 |\n\n**备注：**\n- `market=0`（深圳）和 `market=1`（上海）均为 A 股\n- `market=116` 为港股\n- A 股分类存储在 `A_CATEGORY_MAP`，港股分类存储在 `HK_CATEGORY_MAP`\n- 港股公告 API 使用 `ann_type=H`，A 股使用 `ann_type=A`\n\nFile v2.0.10:references/text-cleaning.md\n\n# 公告正文清洗规则\n\n共 14 条规则，按应用顺序依次执行。每规则为正则模式，使用 `re.MULTILINE` 编译。\n\n## 规则 1: 股票代码表头行\n\n**匹配示例：**\n- `证券代码:600961 证券简称:株冶集团 公告编号:2026-021`\n- `证券代码:601669 股票简称:中国电建 公告编号:临2026-028`\n\n**正则：** `证券代码[：:]\\s*\\S+\\s+(?:证券|股票)简称[：:]\\s*\\S+\\s+(公告编号[：:]\\s*\\S+)?`\n\n**行为：** 全部移除，不保留任何信息。\n\n---\n\n## 规则 2: 纯公司名行\n\n**匹配示例：**\n- `株洲冶炼集团股份有限公司`\n- `中国电力建设股份有限公司`\n\n**正则：** `^\\s*\\S{4,20}(股份有限)?公司\\s*$`\n\n**行为：** 删除独立成行的公司全称（仅限于单独占一行的情况，不删除段落内的公司名）。\n\n---\n\n## 规则 3: 董事会/监事会免责声明\n\n**10 个变体：**\n\n| # | 变体模式 |\n|---|---------|\n| 3a | 本公司及董事会全体成员保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3b | 本公司董事会及全体董事保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3c | 本公司及全体董事……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3d | 本公司及……监事……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3e | 本公司及……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3f | 本公司……董事……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3g | 不存在……虚假……误导……重大遗漏……承担……责任 |\n| 3h | 对其内容的真实性、准确性和完整性承担法律责任 |\n| 3i | 全体董事……保证……内容……真实……准确……完整……责任 |\n| 3j | 保证……不存在……虚假……误导……遗漏……法律 |\n\n**行为：** 完整移除整句声明。注意：3a-3f 的保证范围涵盖 \"虚假记载、误导性陈述或者重大遗漏\"（含\"或者\"变体），同时支持 \"承担法律责任\" 和 \"承担个别及连带法律责任\" 等变体。\n\n---\n\n## 规则 4: \"特此公告\" 结语 + 日期落款\n\n**匹配：** `\\n\\s*特此公告[。\\s]*\\n?(?:\\s*\\S*?公司\\s*(?:董事会|监事会)?\\s*\\n?)?(?:\\s*<日期>\\s*)?`\n\n**行为：** 将 \"特此公告\" 及其后的公司名和日期整体移除，替换为换行符。\n\n**规则 4b（独立日期行）：** `\\n\\s*<日期>\\s*$`\n\n**行为：** 移除独立的日期落款行，支持中文数字日期（如 `二〇二六年五月二十九日`）和阿拉伯数字日期（如 `2026年5月29日`）。\n\n---\n\n## 规则 5: 股票信息行\n\n**匹配示例：**\n- `股票简称:申万宏源 股票代码:000166`\n\n**正则：** `股票简称[：:]\\s*\\S+\\s+股票代码[：:]\\s*\\S+`\n\n**行为：** 移除出现在募集说明书等文档开头的股票简称/代码行。\n\n---\n\n## 规则 6: \"重要内容提示\" 标记\n\n**匹配：** `重要内容提示[：:]\\s*\\n?`\n\n**行为：** 只移除 \"重要内容提示：\" 这个标题标记，保留下方的提示内容。\n\n---\n\n## 规则 7: PDF 页脚/分页噪声\n\n**三个子规则：**\n\n| # | 匹配内容 | 正则 |\n|---|---------|------|\n| 7a | `第1页 共3页` 类页脚 | `\\n\\s*第\\s*\\d+\\s*页\\s*共\\s*\\d+\\s*页\\s*\\n?` |\n| 7b | 纯数字页码行 | `^\\s*\\d+\\s*$` |\n| 7c | PDF 水印文字 | `[\\w\\-]+\\.pdf\\s*\\d{4}-\\d{2}-\\d{2}\\s*\\d{2}:\\d{2}:\\d{2}` |\n\n**行为：** 7a 替换为换行符，7b 和 7c 直接移除。\n\n---\n\n## 规则 8: 声明板块\n\n**匹配：**\n- `声 明\\n[^。]*?中国证监会[^。]*?证券交易所[^。]*?责任`\n- `声 明\\n[^。]*?本募集说明书[^。]*?真实[^。]*?准确[^。]*?完整[^。]*?责任`\n\n**行为：** 移除年报、募集说明书开头的法律声明板块。\n\n---\n\n## 规则 9: 投资者关系活动记录表头\n\n**三个子规则：**\n\n| # | 匹配内容 |\n|---|---------|\n| 9a | `证券代码：xxx 证券简称：xxx` 行 |\n| 9b | `xxx股份有限公司投资者关系活动记录表` |\n| 9c | `投资者关系活动记录表` |\n\n**行为：** 移除机构调研公告的标准表头。\n\n---\n\n## 规则 10: 地址/联系信息模板\n\n**匹配：**\n- `住所[：:].*?(?:\\d{3,6}室|号|楼|大厦|路\\d+号)`\n- `邮政编码[：:]\\s*\\d{6}`\n- `联系电话[：:]\\s*\\S+`\n- `传真[：:]\\s*\\S+`\n\n**行为：** 移除文档末尾的注册地址、邮编、电话、传真等联系信息。\n\n---\n\n## 规则 11: 募集说明书评级/担保字段\n\n**匹配：**\n- `信用评级结果[：:][^。]*?[。，]`\n- `信用评级机构[：:][^。]*?[。，]`\n- `增信措施情况[：:][^。]*?[。，]`\n- `担保或其他增信情况[：:][^。]*?[。，]`\n- `发行金额[：:][^。]*?[。，]`\n- `牵头主承销商[：:].*`\n- `联席主承销商[：:].*`\n- `簿记管理人[：:].*`\n- `受托管理人[：:].*`\n\n**行为：** 移除募集说明书中固定格式的评级、担保、承销商信息。\n\n---\n\n## 规则 12: 目录页\n\n**匹配：** `目\\s*录\\s*\\n[\\s\\S]*?(?=议案|一[、）]|\\d[、）])`\n\n**行为：** 从 \"目 录\" 标记开始到第一个议案/章节标题之间的内容全部移除。适用于年报、股东会会议资料等包含目录的文档。\n\n---\n\n## 规则 13: H股表格模板文字\n\n**匹配：**\n- `翌日披露報表\\s*\\([^)]*\\)\\s*`\n- `表格類別[：:]\\s*\\S+\\s+狀態[：:]\\s*\\S+\\s*`\n- `如上市發行人的已發行股份[^。]*?作出披露，必須填妥第一章節。`\n\n**行为：** 移除港股翌日披露报表的标准表格模板文字。\n\n---\n\n## 规则 14: 多余空白行\n\n**匹配：**\n- `\\n{3,}` → 替换为 `\\n\\n`（保留最多一个空行）\n- `^\\s*\\n` → 移除文档开头的空行\n\n**行为：** 压缩多余连续空行，清理文档首尾空白，最后执行 `strip()`。\n\n---\n\n## 执行统计\n\n```python\ndef get_stats(original: str, cleaned: str) -> dict:\n    \"\"\"返回清洗前后的字数对比\"\"\"\n```\n\n清洗效率通常可减少 15%-30% 的字符数（取决于文档类型），招股说明书和年度报告等模板化程度高的文档节省更明显。\n\nFile v2.0.10:references/token-cost.md\n\n# Token 消耗分析\n\n## 各操作 Token 消耗表\n\n| 操作 | Token 消耗 | 说明 |\n|------|-----------|------|\n| LLM 标题判断 | ~100 token/条 | 标题独立调用，单条非常轻量 |\n| LLM 摘要生成 | ~1500 输入 + 500 输出 | BATCH_SIZE=1，每条公告独立调用 |\n| 定期报告跳过 | 0 | 使用固定摘要 `【类型】标题`，不调 LLM |\n| Digest 输出 | 0 | 从 DB 读取已有摘要，不调 LLM |\n| 无新公告 | 0 | 直接跳过，无 API 调用 |\n\n## 优化策略\n\n### 1. 正则预过滤大幅减少 LLM 调用\n\n13 条 `SKIP_CONTENT_PATTERNS` 在 Phase 1a 顺序执行，极速过滤掉公司章程、信用评级、募集说明书等纯模板文档。只有通过正则检查的公告才进入 Phase 1b 的 LLM 判断。\n\n### 2. LLM 标题判断成本极低\n\n每条公告仅用标题做判断（~100 token），不涉及正文。20 workers 并发处理，延迟极低。\n\n### 3. 低价值公告不下载正文\n\nLLM 判断为 non-valuable 的公告直接跳过 Phase 2（正文下载），节省 PDF 下载带宽和后续 LLM 摘要 token。\n\n### 4. 摘要阶段跳过定期报告\n\n`SKIP_LLM_TYPES` 包括 6 种定期报告类型：业绩预告、业绩快报、季度报告、半年报告、年度报告、补充更正。这些公告正文极长（年度报告可达数万字），直接用 `【类型】标题` 作为摘要，完全不调用 LLM。\n\n### 5. BATCH_SIZE=1 避免超长上下文\n\nBATCH_SIZE 固定为 1，每次 LLM 调用处理一条公告。虽然单次调用效率较低，但避免了超长上下文带来的 token 浪费和摘要质量下降。\n\n### 6. Digest 不消耗 Token\n\n`--digest` 模式直接从 DB 读取已有摘要做格式化输出，无任何 LLM 调用。\n\n### 7. 按需增量处理\n\n`--hours` 参数只处理最近 N 小时入库的公告，避免全量回溯。\n\n### 8. 每日场景估算\n\n假设每天 200 条新公告，其中 50% 通过正则过滤：\n- Phase 1b LLM 标题判断：100 条 × ~100 token = ~10K token\n- 其中 ~30% 被判断为 valuable（30 条）\n- Phase 3 LLM 摘要生成：30 条 × ~2000 token = ~60K token\n- 其中 6 条定期报告跳过 LLM：24 条 × ~2000 token = ~48K token\n\n**日总消耗：~58K token**\n**月总消耗（22 交易日）：~1.28M token**\n\nFile v2.0.10:skill-card.md\n\n## Description: <br>\nStock Watcher Pro tracks Eastmoney watchlist announcements, filters for high-value items, summarizes them with optional LLM classification, and can provide either an agent digest or a local web dashboard. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[54lynnn](https://clawhub.ai/user/54lynnn) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and agents use this skill to monitor selected Chinese stock watchlists for recent announcements, identify higher-value disclosures, and receive concise digests or inspect details in a dashboard. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill requires live Eastmoney account cookies and may store them in cookie.txt. <br>\nMitigation: Use a dedicated low-risk Eastmoney session where possible and protect cookie.txt like a password. <br>\nRisk: Optional LLM processing can send watchlist-related announcement titles or text to the configured model provider. <br>\nMitigation: Only enable the LLM when that data sharing is acceptable, and keep .env credentials out of shared workspaces. <br>\nRisk: Dashboard mode can expose an unauthenticated local web interface. <br>\nMitigation: Bind or firewall the dashboard when LAN access is not intended. <br>\nRisk: Setup scripts can install recurring cron jobs. <br>\nMitigation: Avoid running scripts/setup.sh unless persistent scheduled execution is intended. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/54lynnn/stock-watcher-pro) <br>\n- [System architecture](references/architecture.md) <br>\n- [Announcement classification taxonomy](references/classification.md) <br>\n- [Token cost analysis](references/token-cost.md) <br>\n- [Text cleaning rules](references/text-cleaning.md) <br>\n- [Eastmoney watchlist login](https://quote.eastmoney.com/zixuan/lite.html) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Plain text or Markdown agent digest, setup/run commands, configuration guidance, and an optional local web dashboard.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Digest output uses DIGEST_TOTAL or DIGEST_EMPTY markers; dashboard mode serves a local Flask interface.] <br>\n\n## Skill Version(s): <br>\n2.0.10 (source: ClawHub release metadata; artifact frontmatter lists 2.0.0) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v2.0.10:config.json\n\n{\n  \"notify\": {\n    \"type\": \"terminal\",\n    \"webhook_url\": \"\"\n  },\n  \"fetch_interval_days\": 7,\n  \"stocks\": [],\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n\nFile v2.0.10:requirements.txt\n\nrequests>=2.31.0\nflask>=3.0.0\npdfplumber>=0.10.0\n\nArchive v2.0.9: 26 files, 70620 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), README.md (3466b), references/architecture.md (7216b), references/classification.md (13315b), references/text-cleaning.md (6183b), references/token-cost.md (2260b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (13368b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14645b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_watcher.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2831b), SKILL.md (4524b), _meta.json (132b)\n\nFile v2.0.9:SKILL.md\n\n---\nname: \"stock-watcher-pro\"\nversion: \"2.0.0\"\ndescription: \"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。\"\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"📊\",\n        \"requires\": { \"python\": \"3.9+\" },\n        \"install\":\n          [\n            {\n              \"id\": \"deps\",\n              \"kind\": \"shell\",\n              \"command\": \"cd {{SKILL_DIR}} && pip install requests pdfplumber flask\",\n              \"label\": \"Install Python dependencies\",\n            },\n          ],\n      },\n  }\n---\n\n# 📊 Stock Watcher - 东方财富自选股公告追踪\n\n**双模式技能** — Agent 定时自动追踪 + 用户 Web 仪表盘查看。\n\n告诉 agent 你想做什么，例如：\n\n> \"帮我看看持仓板块这两天有什么重要公告\"\n> \"每天8点提醒我有价值的自选股公告\"\n> \"帮我打开公告仪表盘看看\"\n\n## 模式一：Agent Run 模式\n\nAgent 定时运行 `run.sh`，自动抓取公告、生成摘要，输出有价值公告的 digest 转发给用户。\n\n告诉 agent 即可：\n\n> \"帮我设置 stock-watcher 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动运行：\n\n```bash\n# 用法: bash run.sh [group] [days] [source]\nbash run.sh mygroup 15 eastmoney\n```\n\n### 输出示例\n\n**有公告时：**\n```\nDIGEST_TOTAL:3\n1.\n【000001平安银行】-【平安银行2026年第一季度报告】\n【季度报告】...\n\n2.\n【600519贵州茅台】-【贵州茅台关于回购股份的进展公告】\n累计回购金额XX亿元...\n```\n\n**无公告时：**\n```\nDIGEST_EMPTY:最近1天test板块无高价值公告\n```\n\n---\n\n## 模式二：Dashboard 模式\n\n用户手动运行，抓取公告 + 生成摘要 + 启动 Web 仪表盘，浏览器查看所有公告详情。\n\n告诉 agent 即可：\n\n> \"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"\n\n或者手动运行：\n\n```bash\n# 用法: bash dashboard.sh [group] [days] [source]\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n脚本自动执行三步：\n1. `stock_watcher.py --fetch-content` — 抓取公告 + 全文 + LLM 分类\n2. `daily_summary.py` — 生成摘要\n3. `dashboard.py` — 启动 Flask 仪表盘（默认端口 5001）\n\n启动后浏览器访问 `http://localhost:5001`，按 Ctrl+C 停止。\n\n**仪表盘功能：**\n- 股票列表表格：7天/15天/30天/全部的有价值公告比例\n- 点击展开：懒加载公告详情（标题、日期、摘要、正文、原文链接）\n- 类型标签：`大类 / 小类`（如 `股权股本类 / 回购`）\n- 搜索过滤，响应式设计\n\n---\n\n## 首次设置\n\n告诉 agent 即可：\n\n> \"帮我初始化 stock-watcher，安装依赖、配置 Cookie 和 LLM\"\n\n或者按以下步骤手动设置：\n\n### 1. 安装依赖\n\n```bash\ncd ~/.openclaw/workspace/skills/stock-watcher\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n东方财富网页版登录后的 Cookie，用于获取自选股列表。\n\n1. 浏览器打开 [https://quote.eastmoney.com/zixuan/lite.html](https://quote.eastmoney.com/zixuan/lite.html) 并登录\n2. F12 → Console → 输入 `copy(document.cookie)` 回车\n3. 粘贴到 `cookie.txt`\n\n**自动续签（可选）：**\n```bash\npip install playwright && playwright install chromium\npython3 scripts/refresh_cookie.py\n```\n\n### 3. 配置 LLM（可选）\n\nLLM 用于标题价值判断、公告分类和摘要生成。未配置时仅使用正则过滤。\n\n```bash\n# .env 文件\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n```json\n// config.json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_watcher.py --group test --days 15 --fetch-content\npython3 scripts/stock_watcher.py --stats\n```\n\n### 5. 配置定时任务\n\n告诉 agent 即可，例如：\n\n> \"帮我设置 stock-watcher 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动配置：\n\n```bash\nopenclaw cron add \\\n  --name stock-watcher \\\n  --cron \"0 1 * * *\" \\\n  --message \"运行股票公告扫描：cd {{SKILL_DIR}} && bash run.sh mygroup 15 eastmoney\"\n```\n---\n\n完整技术文档、公告分类体系、Token 消耗分析等详见 [GitHub](https://github.com/54Lynnn/stock-watcher-pro)\n\n## 开源\n\n- **GitHub**: [github.com/54Lynnn/stock-watcher-pro](https://github.com/54Lynnn/stock-watcher-pro)\n\nFile v2.0.9:README.md\n\n# Stock Watcher Pro - 东方财富自选股公告追踪\n\n自动追踪东方财富自选股公告，三级过滤 + LLM 分类摘要 + Web 仪表盘。支持 Agent 定时推送和手动查看。\n\n> 通过 ClawHub 安装：`clawhub install stock-watcher-pro`\n\n---\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\ncd /path/to/stock-watcher-pro\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n浏览器登录 [东方财富自选股](https://quote.eastmoney.com/zixuan/lite.html)，F12 → Console → `copy(document.cookie)`，粘贴到 `cookie.txt`。\n\n自动续签：`pip install playwright && playwright install chromium && python3 scripts/refresh_cookie.py`\n\n### 3. 配置 LLM（可选）\n\n```bash\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n`config.json` 中配置模型地址等参数（默认使用 DeepSeek V4 Flash）。未配置时自动禁用 LLM，仅使用正则过滤。\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_watcher.py --group test --days 15 --fetch-content\npython3 scripts/stock_watcher.py --stats\n```\n\n---\n\n## 两种模式\n\n### Agent Run 模式\n\n告诉 agent：`\"每天8点提醒我有价值的自选股公告\"`\n\n或手动运行：\n\n```bash\nbash run.sh mygroup 15 eastmoney\n```\n\n输出 digest 到 stdout（agent 读取转发），无公告时输出 `DIGEST_EMPTY:...`。\n\n### Dashboard 模式\n\n告诉 agent：`\"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"`\n\n或手动运行：\n\n```bash\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n自动执行：抓取 → 摘要 → 启动 Web 仪表盘（`http://localhost:5001`），Ctrl+C 停止。\n\n---\n\n## 常用命令\n\n```bash\npython3 scripts/stock_watcher.py --stats                 # 数据库统计\npython3 scripts/stock_watcher.py --list                  # 最近公告\npython3 scripts/stock_watcher.py --list --stock 600519   # 指定股票\npython3 scripts/stock_watcher.py --list-groups           # 可用分组\npython3 scripts/stock_watcher.py --clean                 # 清洗正文\n```\n\n---\n\n## 文件结构\n\n```\nstock-watcher-pro/\n  SKILL.md              # Agent 入口文档\n  README.md             # 本文档\n  config.json           # LLM 配置\n  cookie.txt            # 东方财富 Cookie\n  .env                  # LLM API Key\n  run.sh                # Agent Run 模式\n  dashboard.sh          # Dashboard 模式\n  scripts/              # Python 脚本\n  logs/                 # 运行日志\n  .stock-watcher-state/ # SQLite 数据库\n  references/           # 技术参考文档\n```\n\n---\n\n## 配置\n\n### config.json\n\n```json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### .env\n\n```\nLLM_API_KEY=sk-your-api-key-here\n```\n\n### 数据源\n\n默认全部走东方财富 API（A股+港股）。指定 `--source cninfo` 时 A 股走巨潮资讯网（PDF 更稳定），港股仍走东方财富。\n\n---\n\n## 依赖\n\n- Python 3.9+ / requests / pdfplumber / flask / sqlite3\n- playwright（可选，Cookie 自动续签）\n\n---\n\n## 技术参考\n\n详细文档见 `references/` 目录：\n\n- [系统架构](references/architecture.md) — 数据流、模块详解、过滤策略\n- [公告分类体系](references/classification.md) — A股8大类64小类 + 港股7大类41小类\n- [Token消耗分析](references/token-cost.md) — LLM 调用成本优化\n- [正文清洗规则](references/text-cleaning.md) — 14类清洗规则详解\n\nFile v2.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn742cdrc476d1kbhpsvnrnznx81x4r7\",\n  \"slug\": \"stock-tracker\",\n  \"version\": \"2.0.9\",\n  \"publishedAt\": 1780838714435\n}\n\nFile v2.0.9:references/architecture.md\n\n# 系统架构\n\n## 数据流总览\n\n```\n东方财富/巨潮资讯\n      │\n      ▼\neastmoney_api.py / cninfo_api.py  ─── 获取公告列表\n      │\n      ▼\nstock_watcher.py ─── 主入口，协调各模块\n      │\n      ├─ Phase 1a: 正则跳过判断 (ann_detail.should_skip_content)\n      │     │  13 条 SKIP_CONTENT_PATTERNS，极速过滤\n      │     ▼\n      ├─ Phase 1b: LLM 标题价值判断 (llm_judge.py)\n      │     │  并发 20 workers，判断 valuable / non-valuable\n      │     ▼\n      ├─ Phase 2: 并发下载正文 (ann_detail.fetch_announcement_content)\n      │     │  优先 API，回退 PDF 提取，max_workers=5\n      │     ▼\n      ├─ Phase 3: 顺序清洗 (text_cleaner.py) + 分批保存到 DB\n      │     ▼\n      ├─ daily_summary.py ─── 为有价值公告生成 LLM 摘要\n      │     │  BATCH_SIZE=1, workers=20, 定期报告跳过 LLM\n      │     ▼\n      └─ dashboard.py ─── Flask Web 仪表盘，lazy loading\n```\n\n## 模块分解\n\n### stock_watcher.py（主入口）\n\n**CLI 参数：**\n\n| 参数 | 用途 |\n|------|------|\n| `--force` | 强制重新抓取所有公告（覆盖已见检查） |\n| `--days N` | 抓取最近 N 天公告 |\n| `--dry-run` | 试运行，不更新数据库 |\n| `--group` | 只追踪指定分组（模糊匹配） |\n| `--list-groups` | 列出所有可用分组 |\n| `--stats` | 查看数据库统计 |\n| `--list` | 列出历史公告 |\n| `--fetch-content` | 补抓缺少全文的公告正文 |\n| `--clean` | 清洗已获取的公告正文 |\n| `--prune` | 清理无正文的空记录 |\n| `--source` | eastmoney（默认）或 cninfo |\n\n**执行流程：**\n1. 解析参数 → 执行子命令（stats/list/clean/prune/fetch-content）或完整运行\n2. 完整运行：获取自选股列表 → 获取公告列表 → 过滤已见 → 获取全文 → 入库\n\n### eastmoney_api.py（东方财富数据获取）\n\n**自选股获取（3 级回退）：**\n1. **myfavor API** `https://myfavor.eastmoney.com/v4/webouter` — 支持分组过滤\n2. **Cookie 解析** — 从 `selfSelectStocks` 字段正则提取\n3. **config.json** — 手动配置硬编码列表\n\n**公告 API：**\n- `https://np-anotice-stock.eastmoney.com/api/security/ann`\n- `ann_type=A` 为 A 股，`ann_type=H` 为港股\n- 参数：`stock_list={market},{code}`\n\n**Market 字段值：**\n\n| 值 | 市场 | 标签 |\n|----|------|------|\n| 0 | 深圳 | SZ |\n| 1 | 上海 | SH |\n| 100 | 美股 | US |\n| 104 | 期货 | FUT |\n| 116 | 港股 | HK |\n| 119 | 外汇 | FX |\n| 124 | 港股通 | HKI |\n| 134 | 港股通(深) | HKF |\n| 251 | 其他 | OTHER |\n\n### cninfo_api.py（巨潮资讯网数据获取）\n\n**API 端点：**\n- 列表：`POST https://www.cninfo.com.cn/new/hisAnnouncement/query`\n- PDF 基址：`https://static.cninfo.com.cn/{adjunctUrl}`\n\n**请求参数：**\n- `searchkey`: 股票代码\n- `seDate`: 日期范围 `YYYY-MM-DD~YYYY-MM-DD`\n- `pageNum` / `pageSize`: 分页\n- `column`: szse\n\n### ann_detail.py（公告正文获取）\n\n**内容获取优先级：**\n1. **内容 API** `https://np-cnotice-stock.eastmoney.com/api/content/ann`（需东方财富网络环境）\n2. **PDF 下载 + 文本提取** `https://pdf.dfcfw.com/pdf/H2_{art_code}_1.pdf`\n3. 外部传入 `pdf_url_override`（巨潮 PDF 链接）：直接下载 PDF\n\n**跳过全文采集的标题模式（13 条）：**\n1. 公司章程\n2. 信用评级 / 跟踪评级\n3. 募集说明书\n4. 付息公告\n5. 上市公告 / 摘牌\n6. 发行结果公告 / 票面利率 / 簿记建档 / 更名公告 / 发行完毕\n7. 董事会报告\n8. 法律意见书\n9. 股东会决议公告 / 股东会表决结果 / 投票表决结果\n10. 薪酬\n11. 周年会通告\n12. 担保额度\n13. 召开情况\n\n**TOC 提取：**\n超长文档（通函、海外市场公告、股东会会议资料、发行公告）只提取目录或开头 2000 字。\n\n### llm_judge.py（LLM 标题价值判断）\n\n**核心功能：**\n- 判断公告标题是否有价值（valuable / non-valuable）\n- 输出 category（大类）和 type（小类）\n- 使用 JSON mode（`response_format: {\"type\": \"json_object\"}`）\n- Fail-open：所有重试失败后默认视为有价值\n\n**重试策略：** 最多 2 次重试，间隔递增\n\n**System Prompt 结构：**\n1. A 股 8 大类 + HK 7 大类分类体系\n2. 高价值 type 列表\n3. 低价值 type 列表\n4. 需要结合标题判断的 type（董事会公告、借贷担保、利润分配）\n\n### text_cleaner.py（公告正文清洗）\n\n详见 `text-cleaning.md`。\n\n### daily_summary.py（每日公告摘要）\n\n**批处理参数：**\n- `BATCH_SIZE=1`：每次 LLM 调用只处理一条公告（避免超长上下文）\n- `max_workers=20`：并发线程数\n- `SKIP_LLM_TYPES`：定期报告类型跳过 LLM，使用固定摘要 `【类型】标题`\n\n**输出模式：**\n- `--digest` 输出格式化摘要列表（STDOUT），供 agent 读取转发\n- 格式：`DIGEST_TOTAL:N` → 编号列表\n\n### db.py（SQLite 存储）\n\n**核心特性：**\n- WAL 模式：`PRAGMA journal_mode=WAL`\n- UPSERT 含 null 保护：`ON CONFLICT(ann_id) DO UPDATE SET ... CASE WHEN excluded.x != '' THEN excluded.x ELSE announcements.x END`\n- 自动迁移：`_migrate_schema()` 增量添加新字段（full_text, clean_text, attach_url, summary, status, ann_type_tag, ann_type_category, clean_text_length）\n\n### dashboard.py（Flask Web 仪表盘）\n\n**路由：**\n| 端点 | 说明 |\n|------|------|\n| `GET /` | 首页（单页应用） |\n| `GET /api/stocks` | 股票概览统计（7/15/30天/全部） |\n| `GET /api/announcements/<code>` | 个股公告列表（lazy loading） |\n\n**前端特性：**\n- 股票表格行可展开\n- 搜索框实时过滤\n- 浮动个股栏（滚动时固定显示当前展开股票）\n- 分类标签展示\n\n## 过滤策略（3 层）\n\n```\n公告列表\n   │\n   ▼\nLayer 1: 正则跳过 (should_skip_content)\n   │  13 条 SKIP_CONTENT_PATTERNS\n   │  公司章程、信用评级、募集说明书、付息公告、上市公告等\n   │  跳过 → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 2: LLM 标题判断 (llm_judge.judge)\n   │  valuable → 继续下载全文\n   │  non-valuable → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 3: 下载失败\n   │  API/PDF 均失败 → status=filtered\n   │\n   ▼\n最终 DB 入库\n   valuable 有价值 | filtered 已过滤\n```\n\n## LLM 有价值/无价值类型\n\n**高价值 type（几乎总是下载）：**\n- 财务报告类全部（业绩预告、业绩快报、季度/半年/年度报告）\n- 交易提示类全部（停牌提示、交易异动、澄清公告、风险提示、特别处理、终止上市等）\n- 重大事项类：资产重组、收购兼并、股权激励、关联交易、违纪违规\n- 股权股本类：回购股权、权益变动\n- 一般公告类：法律纠纷、产销经营快报、机构调研公告\n- 港股：翌日报表、须公布的交易\n\n**低价值 type（几乎总是跳过）：**\n- 中介公告（法律意见书、保荐机构核查意见、律师核查意见）\n- 股东大会通知\n- 薪酬管理制度、董事会议事规则、公司章程修正案\n- 债券付息公告、发行结果公告\n\nFile v2.0.9:references/classification.md\n\n# 公告分类体系\n\n## A股 8大类64小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 招股类 | 申报稿 | 募集资金用途、财务数据概览 | LLM 判断 |\n| 2 | 招股类 | 申报反馈 | 监管问询要点、回复内容 | LLM 判断 |\n| 3 | 招股类 | 招股说明书 | 发行规模、定价、募集资金投向 | LLM 判断 |\n| 4 | 招股类 | 发行定价 | 发行价格、市盈率、发行日期 | LLM 判断 |\n| 5 | 招股类 | 发行结果 | 实际发行股数、募集资金总额 | LLM 判断 |\n| 6 | 招股类 | 上市公告书 | 上市日期、交易安排 | LLM 判断 |\n| 7 | 财务报告类 | 业绩预告 | 预计营收/利润数字、同比增减幅度、业绩变动原因 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告类 | 业绩快报 | 实际营收/利润数字、同比增减、与预告差异 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告类 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 10 | 财务报告类 | 半年报告 | 半年度财务数据、经营讨论 | 跳过 LLM，固定摘要 |\n| 11 | 财务报告类 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 12 | 财务报告类 | 补充更正 | 更正内容、更正前后对比 | 跳过 LLM，固定摘要 |\n| 13 | 重大事项类 | 利润分配 | 每股分红金额、分红总额、股权登记日、除权除息日 | LLM 判断 |\n| 14 | 重大事项类 | 股份增减持 | 增减持主体、变动股数、变动后持股比例、原因及后续计划 | LLM 判断 |\n| 15 | 重大事项类 | 资金投向 | 投资项目、投资金额、预期收益、资金来源、实施周期 | LLM 判断 |\n| 16 | 重大事项类 | 资产重组 | 重组标的、交易金额、交易对手、重组方式、标的公司主营业务及行业、重组后对业务布局的影响 | LLM 判断 |\n| 17 | 重大事项类 | 收购兼并 | 交易标的、交易金额、交易对手、收购目的、标的公司主营业务及行业、标的估值及溢价率 | LLM 判断 |\n| 18 | 重大事项类 | 重大合同 | 合同金额、合同对手方、合同期限、合同内容、付款方式及条件、合同履行对营收/利润的影响、违约风险 | LLM 判断 |\n| 19 | 重大事项类 | 股权激励 | 授予/行权价格、激励对象人数及构成、限售期及解锁条件、业绩考核目标、总量占股本比例 | LLM 判断 |\n| 20 | 重大事项类 | 关联交易 | 交易对方（关联方关系）、交易金额、定价依据及公允性、交易目的及必要性、对上市公司独立性的影响 | LLM 判断 |\n| 21 | 重大事项类 | 借贷担保 | 担保金额、担保对象、被担保方财务状况、担保期限、反担保措施 | LLM 判断（大额→有价值，常规→无价值） |\n| 22 | 重大事项类 | 委托理财 | 理财金额、产品类型、预期收益率、期限、风险等级 | LLM 判断 |\n| 23 | 重大事项类 | 违纪违规 | 违规主体、违规事项、处罚措施、整改方案 | LLM 判断 |\n| 24 | 重大事项类 | 政策影响 | 政策内容、对公司业务的具体影响、公司应对措施 | LLM 判断 |\n| 25 | 重大事项类 | 人事变动 | 具体人名、原职务、新职务、变动原因 | LLM 判断 |\n| 26 | 交易提示类 | 停牌提示 | 停牌原因、预计停牌时间、复牌条件 | 自动有价值 |\n| 27 | 交易提示类 | 交易异动 | 异动类型（涨停/跌停/换手率）、异动原因、是否需核查 | 自动有价值 |\n| 28 | 交易提示类 | 澄清公告 | 澄清事项、市场传闻内容、事实情况、对股价影响 | 自动有价值 |\n| 29 | 交易提示类 | 风险提示 | 风险类型、风险内容、可能影响、应对措施 | 自动有价值 |\n| 30 | 交易提示类 | 特别处理 | ST/ST\\* 原因、风险警示内容、可能后果 | 自动有价值 |\n| 31 | 交易提示类 | 终止上市 | 终止原因、退市整理期、投资者保护措施 | 自动有价值 |\n| 32 | 交易提示类 | 恢复上市 | 恢复上市原因、复牌后交易安排、公司当前经营状况 | 自动有价值 |\n| 33 | 交易提示类 | 暂停上市 | 暂停上市原因、后续恢复条件、投资者风险提示 | 自动有价值 |\n| 34 | 配股类 | 配股预案 | 配股比例（几配几）、配股价格、募集资金总额、配股目的及资金用途、对每股收益的摊薄影响 | LLM 判断 |\n| 35 | 配股类 | 配股说明书 | 配股比例、配股价格、募集资金用途、配股条件、对现有股东的影响 | LLM 判断 |\n| 36 | 配股类 | 配股获准 | 获准日期、配股方案关键条款、后续时间安排 | LLM 判断 |\n| 37 | 配股类 | 配股发行 | 实际发行股数、实际募集资金、发行结果、上市日期 | LLM 判断 |\n| 38 | 配股类 | 配股上市 | 上市日期、配股价、对股价的影响 | LLM 判断 |\n| 39 | 增发类 | 增发预案 | 增发原因及资金需求、增发股数及价格、募集资金总额及投向、发行对象（公开/定向）、对每股收益的摊薄影响 | LLM 判断 |\n| 40 | 增发类 | 增发说明书 | 增发方案详情、募集资金用途、发行条件、风险因素 | LLM 判断 |\n| 41 | 增发类 | 增发获准 | 获准日期、方案关键条款、后续安排 | LLM 判断 |\n| 42 | 增发类 | 增发发行 | 实际发行股数、实际募集资金、发行价格、发行结果 | LLM 判断 |\n| 43 | 增发类 | 增发上市 | 上市日期、对股价的影响 | LLM 判断 |\n| 44 | 股权股本类 | 权益变动 | 变动主体、变动前持股数量及比例、变动股数、变动后持股比例、变动方式（二级市场/协议转让等） | LLM 判断 |\n| 45 | 股权股本类 | 股本变动 | 变动原因、变动前后股本结构、新增股份性质 | LLM 判断 |\n| 46 | 股权股本类 | 质押冻结 | 质押/冻结主体、质押股数、占持股比例、质权人、质押融资用途、平仓风险 | LLM 判断 |\n| 47 | 股权股本类 | 质押式回购 | 回购主体、回购金额、质押标的、期限、到期安排 | LLM 判断 |\n| 48 | 股权股本类 | 回购股权 | 累计回购金额、回购股数、占总股本比例、回购计划总额及完成进度 | LLM 判断 |\n| 49 | 股权股本类 | 约定购回 | 购回主体、购回金额、标的证券、期限、购回价格 | LLM 判断 |\n| 50 | 股权股本类 | 股权分置改革 | 改革方案概要、对价安排、流通股与非流通股比例变化 | LLM 判断 |\n| 51 | 一般公告类 | 董事会公告 | 议案内容、表决结果、重大决议 | LLM 判断（具体议案→有价值，纯程序→无价值） |\n| 52 | 一般公告类 | 股东大会 | 会议审议议案、投票结果、重要决议 | LLM 判断 |\n| 53 | 一般公告类 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率 | LLM 判断 |\n| 54 | 一般公告类 | 中介公告 | 法律意见书、保荐机构核查意见 | 自动无价值 |\n| 55 | 一般公告类 | 法律纠纷 | 原告被告、涉案金额、诉讼进展、判决结果、对公司财务的潜在影响 | LLM 判断 |\n| 56 | 一般公告类 | 机构调研公告 | 调研机构名单、调研时间、公司回复要点、投资者关注的核心问题 | LLM 判断 |\n| 57 | 一般公告类 | 其他补充更正 | 更正内容、更正前后对比 | LLM 判断 |\n| 58 | 一般公告类 | 公司资料变更 | 变更事项（名称/地址/注册资本等）、变更前后 | LLM 判断 |\n| 59 | 一般公告类 | 融资融券 | 融资融券余额变化、标的调整 | LLM 判断 |\n| 60 | 一般公告类 | 员工持股 | 持股计划规模、参与人数、股票来源、锁定期、业绩考核条件 | LLM 判断 |\n| 61 | 一般公告类 | 产销经营快报 | 主要产品产销量、同比变化、经营亮点、行业景气度 | LLM 判断 |\n| 62 | 一般公告类 | 个股其他公告 | 通用兜底类别 | LLM 判断 |\n| 63 | 一般公告类 | ESG报告 | 环境/社会/治理关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 64 | 一般公告类 | 函件 | 一般函件往来 | LLM 判断 |\n\n## 港股 7大类41小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 业绩快报 | 业绩预告 | 预计财务数据、同比增减、变动原因 | LLM 判断 |\n| 2 | 业绩快报 | 季度业绩 | 季度经营数据、同比分析 | LLM 判断 |\n| 3 | 业绩快报 | 中期业绩 | 中期财务数据、业务回顾 | LLM 判断 |\n| 4 | 业绩快报 | 末期业绩 | 全年财务数据、末期分红建议 | LLM 判断 |\n| 5 | 业绩快报 | 业绩发布会 | 发布会日期、管理层发言要点、分析师问答 | LLM 判断 |\n| 6 | 财务报告 | 环境及管治报告 | ESG 关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 7 | 财务报告 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告 | 中期报告 | 中期财务数据、管理层讨论 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 10 | 上市文件 | 预览资料 | 上市公司业务概览、财务摘要、行业定位 | LLM 判断 |\n| 11 | 上市文件 | 发售以供认购 | 发售价格、发售数量、集资额、认购安排、对股价影响 | LLM 判断 |\n| 12 | 上市文件 | 招股说明书 | 发行规模、定价、募集资金投向、风险因素 | LLM 判断 |\n| 13 | 上市文件 | 公开招股 | 招股价格区间、招股数量、集资额、上市日期、保荐人 | LLM 判断 |\n| 14 | 上市文件 | 供股 | 供股比例（几供几）、供股价格、募集资金总额、供股目的及资金用途、对现有股东的影响 | LLM 判断 |\n| 15 | 上市文件 | 资本化发行 | 发行方式、发行对象、对股本结构的影响、是否涉及大股东 | LLM 判断 |\n| 16 | 上市文件 | 介绍上市 | 介绍上市方式、不涉及公开发售的原因、上市日期、保荐人 | LLM 判断 |\n| 17 | 上市文件 | 发售现有证券 | 出售股东身份、发售股数、售价、较市价折让幅度、出售原因 | LLM 判断 |\n| 18 | 上市文件 | 聆讯资料 | 聆讯日期、上市申请关键信息 | LLM 判断 |\n| 19 | 上市文件 | 其它上市文件 | 其他上市相关文件 | LLM 判断 |\n| 20 | 股权股本 | 权益变动 | 变动主体、变动前持股比例、变动股数、变动后持股比例、变动方式 | LLM 判断 |\n| 21 | 股权股本 | 证券/股本 | 证券发行、股本结构变化、新增股份 | LLM 判断 |\n| 22 | 股权股本 | 交易披露 | 关联交易披露、重大交易披露 | LLM 判断 |\n| 23 | 股权股本 | 翌日报表 | 买入/卖出股数、成交价格、涉及股东名称及身份 | LLM 判断 |\n| 24 | 股权股本 | 月报表 | 月度股份变动汇总、各增减持主体及股数、变动后持股比例 | LLM 判断 |\n| 25 | 公告及通函 | 重大事项 | 重大交易、业务调整、资产处置 | LLM 判断 |\n| 26 | 公告及通函 | 新上市 | 新上市公司名称、主营业务及行业、发行规模及定价、集资用途、上市后表现预期 | LLM 判断 |\n| 27 | 公告及通函 | 会议/表决 | 股东会/董事会会议决议、表决结果 | LLM 判断 |\n| 28 | 公告及通函 | 关联交易 | 交易对手（关联方关系）、交易金额、定价依据、交易目的 | LLM 判断 |\n| 29 | 公告及通函 | 须公布的交易 | 交易性质（收购/出售/合营）、交易金额、交易对手、是否构成重大交易、对财务状况的影响 | LLM 判断 |\n| 30 | 公告及通函 | 公司变动 | 公司名称变更、注册地址变更、董事会成员变动 | LLM 判断 |\n| 31 | 公告及通函 | 财务资料 | 财务数据补充披露、澄清 | LLM 判断 |\n| 32 | 公告及通函 | 杂项 | 其他公告事项 | LLM 判断 |\n| 33 | 一般公告 | 交易安排 | 关键日期（除净日、过户截止日、派息日）、每股派息金额 | LLM 判断 |\n| 34 | 一般公告 | 创业板资料 | 创业板公司特定披露要求 | LLM 判断 |\n| 35 | 一般公告 | 监管者公告 | 监管机构名称、监管事项、处罚/警告措施、对公司经营的影响 | LLM 判断 |\n| 36 | 一般公告 | 委任代表表格 | 委任代表表格（通常无实质内容） | LLM 判断 |\n| 37 | 一般公告 | 宪章文件 | 公司章程、组织章程大纲及细则 | LLM 判断 |\n| 38 | 债券及结构性产品 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率、实际杠杆 | LLM 判断 |\n| 39 | 债券及结构性产品 | 权证上市 | 权证条款（标的/行权价/到期日）、上市日期、初始价格 | LLM 判断 |\n| 40 | 债券及结构性产品 | 债务证券公告 | 债券规模、票面利率、期限、信用评级、担保情况、募集资金用途 | LLM 判断 |\n| 41 | 债券及结构性产品 | 其它 | 其他结构性产品公告 | LLM 判断 |\n\n**备注：**\n- `market=0`（深圳）和 `market=1`（上海）均为 A 股\n- `market=116` 为港股\n- A 股分类存储在 `A_CATEGORY_MAP`，港股分类存储在 `HK_CATEGORY_MAP`\n- 港股公告 API 使用 `ann_type=H`，A 股使用 `ann_type=A`\n\nFile v2.0.9:references/text-cleaning.md\n\n# 公告正文清洗规则\n\n共 14 条规则，按应用顺序依次执行。每规则为正则模式，使用 `re.MULTILINE` 编译。\n\n## 规则 1: 股票代码表头行\n\n**匹配示例：**\n- `证券代码:600961 证券简称:株冶集团 公告编号:2026-021`\n- `证券代码:601669 股票简称:中国电建 公告编号:临2026-028`\n\n**正则：** `证券代码[：:]\\s*\\S+\\s+(?:证券|股票)简称[：:]\\s*\\S+\\s+(公告编号[：:]\\s*\\S+)?`\n\n**行为：** 全部移除，不保留任何信息。\n\n---\n\n## 规则 2: 纯公司名行\n\n**匹配示例：**\n- `株洲冶炼集团股份有限公司`\n- `中国电力建设股份有限公司`\n\n**正则：** `^\\s*\\S{4,20}(股份有限)?公司\\s*$`\n\n**行为：** 删除独立成行的公司全称（仅限于单独占一行的情况，不删除段落内的公司名）。\n\n---\n\n## 规则 3: 董事会/监事会免责声明\n\n**10 个变体：**\n\n| # | 变体模式 |\n|---|---------|\n| 3a | 本公司及董事会全体成员保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3b | 本公司董事会及全体董事保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3c | 本公司及全体董事……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3d | 本公司及……监事……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3e | 本公司及……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3f | 本公司……董事……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3g | 不存在……虚假……误导……重大遗漏……承担……责任 |\n| 3h | 对其内容的真实性、准确性和完整性承担法律责任 |\n| 3i | 全体董事……保证……内容……真实……准确……完整……责任 |\n| 3j | 保证……不存在……虚假……误导……遗漏……法律 |\n\n**行为：** 完整移除整句声明。注意：3a-3f 的保证范围涵盖 \"虚假记载、误导性陈述或者重大遗漏\"（含\"或者\"变体），同时支持 \"承担法律责任\" 和 \"承担个别及连带法律责任\" 等变体。\n\n---\n\n## 规则 4: \"特此公告\" 结语 + 日期落款\n\n**匹配：** `\\n\\s*特此公告[。\\s]*\\n?(?:\\s*\\S*?公司\\s*(?:董事会|监事会)?\\s*\\n?)?(?:\\s*<日期>\\s*)?`\n\n**行为：** 将 \"特此公告\" 及其后的公司名和日期整体移除，替换为换行符。\n\n**规则 4b（独立日期行）：** `\\n\\s*<日期>\\s*$`\n\n**行为：** 移除独立的日期落款行，支持中文数字日期（如 `二〇二六年五月二十九日`）和阿拉伯数字日期（如 `2026年5月29日`）。\n\n---\n\n## 规则 5: 股票信息行\n\n**匹配示例：**\n- `股票简称:申万宏源 股票代码:000166`\n\n**正则：** `股票简称[：:]\\s*\\S+\\s+股票代码[：:]\\s*\\S+`\n\n**行为：** 移除出现在募集说明书等文档开头的股票简称/代码行。\n\n---\n\n## 规则 6: \"重要内容提示\" 标记\n\n**匹配：** `重要内容提示[：:]\\s*\\n?`\n\n**行为：** 只移除 \"重要内容提示：\" 这个标题标记，保留下方的提示内容。\n\n---\n\n## 规则 7: PDF 页脚/分页噪声\n\n**三个子规则：**\n\n| # | 匹配内容 | 正则 |\n|---|---------|------|\n| 7a | `第1页 共3页` 类页脚 | `\\n\\s*第\\s*\\d+\\s*页\\s*共\\s*\\d+\\s*页\\s*\\n?` |\n| 7b | 纯数字页码行 | `^\\s*\\d+\\s*$` |\n| 7c | PDF 水印文字 | `[\\w\\-]+\\.pdf\\s*\\d{4}-\\d{2}-\\d{2}\\s*\\d{2}:\\d{2}:\\d{2}` |\n\n**行为：** 7a 替换为换行符，7b 和 7c 直接移除。\n\n---\n\n## 规则 8: 声明板块\n\n**匹配：**\n- `声 明\\n[^。]*?中国证监会[^。]*?证券交易所[^。]*?责任`\n- `声 明\\n[^。]*?本募集说明书[^。]*?真实[^。]*?准确[^。]*?完整[^。]*?责任`\n\n**行为：** 移除年报、募集说明书开头的法律声明板块。\n\n---\n\n## 规则 9: 投资者关系活动记录表头\n\n**三个子规则：**\n\n| # | 匹配内容 |\n|---|---------|\n| 9a | `证券代码：xxx 证券简称：xxx` 行 |\n| 9b | `xxx股份有限公司投资者关系活动记录表` |\n| 9c | `投资者关系活动记录表` |\n\n**行为：** 移除机构调研公告的标准表头。\n\n---\n\n## 规则 10: 地址/联系信息模板\n\n**匹配：**\n- `住所[：:].*?(?:\\d{3,6}室|号|楼|大厦|路\\d+号)`\n- `邮政编码[：:]\\s*\\d{6}`\n- `联系电话[：:]\\s*\\S+`\n- `传真[：:]\\s*\\S+`\n\n**行为：** 移除文档末尾的注册地址、邮编、电话、传真等联系信息。\n\n---\n\n## 规则 11: 募集说明书评级/担保字段\n\n**匹配：**\n- `信用评级结果[：:][^。]*?[。，]`\n- `信用评级机构[：:][^。]*?[。，]`\n- `增信措施情况[：:][^。]*?[。，]`\n- `担保或其他增信情况[：:][^。]*?[。，]`\n- `发行金额[：:][^。]*?[。，]`\n- `牵头主承销商[：:].*`\n- `联席主承销商[：:].*`\n- `簿记管理人[：:].*`\n- `受托管理人[：:].*`\n\n**行为：** 移除募集说明书中固定格式的评级、担保、承销商信息。\n\n---\n\n## 规则 12: 目录页\n\n**匹配：** `目\\s*录\\s*\\n[\\s\\S]*?(?=议案|一[、）]|\\d[、）])`\n\n**行为：** 从 \"目 录\" 标记开始到第一个议案/章节标题之间的内容全部移除。适用于年报、股东会会议资料等包含目录的文档。\n\n---\n\n## 规则 13: H股表格模板文字\n\n**匹配：**\n- `翌日披露報表\\s*\\([^)]*\\)\\s*`\n- `表格類別[：:]\\s*\\S+\\s+狀態[：:]\\s*\\S+\\s*`\n- `如上市發行人的已發行股份[^。]*?作出披露，必須填妥第一章節。`\n\n**行为：** 移除港股翌日披露报表的标准表格模板文字。\n\n---\n\n## 规则 14: 多余空白行\n\n**匹配：**\n- `\\n{3,}` → 替换为 `\\n\\n`（保留最多一个空行）\n- `^\\s*\\n` → 移除文档开头的空行\n\n**行为：** 压缩多余连续空行，清理文档首尾空白，最后执行 `strip()`。\n\n---\n\n## 执行统计\n\n```python\ndef get_stats(original: str, cleaned: str) -> dict:\n    \"\"\"返回清洗前后的字数对比\"\"\"\n```\n\n清洗效率通常可减少 15%-30% 的字符数（取决于文档类型），招股说明书和年度报告等模板化程度高的文档节省更明显。\n\nFile v2.0.9:references/token-cost.md\n\n# Token 消耗分析\n\n## 各操作 Token 消耗表\n\n| 操作 | Token 消耗 | 说明 |\n|------|-----------|------|\n| LLM 标题判断 | ~100 token/条 | 标题独立调用，单条非常轻量 |\n| LLM 摘要生成 | ~1500 输入 + 500 输出 | BATCH_SIZE=1，每条公告独立调用 |\n| 定期报告跳过 | 0 | 使用固定摘要 `【类型】标题`，不调 LLM |\n| Digest 输出 | 0 | 从 DB 读取已有摘要，不调 LLM |\n| 无新公告 | 0 | 直接跳过，无 API 调用 |\n\n## 优化策略\n\n### 1. 正则预过滤大幅减少 LLM 调用\n\n13 条 `SKIP_CONTENT_PATTERNS` 在 Phase 1a 顺序执行，极速过滤掉公司章程、信用评级、募集说明书等纯模板文档。只有通过正则检查的公告才进入 Phase 1b 的 LLM 判断。\n\n### 2. LLM 标题判断成本极低\n\n每条公告仅用标题做判断（~100 token），不涉及正文。20 workers 并发处理，延迟极低。\n\n### 3. 低价值公告不下载正文\n\nLLM 判断为 non-valuable 的公告直接跳过 Phase 2（正文下载），节省 PDF 下载带宽和后续 LLM 摘要 token。\n\n### 4. 摘要阶段跳过定期报告\n\n`SKIP_LLM_TYPES` 包括 6 种定期报告类型：业绩预告、业绩快报、季度报告、半年报告、年度报告、补充更正。这些公告正文极长（年度报告可达数万字），直接用 `【类型】标题` 作为摘要，完全不调用 LLM。\n\n### 5. BATCH_SIZE=1 避免超长上下文\n\nBATCH_SIZE 固定为 1，每次 LLM 调用处理一条公告。虽然单次调用效率较低，但避免了超长上下文带来的 token 浪费和摘要质量下降。\n\n### 6. Digest 不消耗 Token\n\n`--digest` 模式直接从 DB 读取已有摘要做格式化输出，无任何 LLM 调用。\n\n### 7. 按需增量处理\n\n`--hours` 参数只处理最近 N 小时入库的公告，避免全量回溯。\n\n### 8. 每日场景估算\n\n假设每天 200 条新公告，其中 50% 通过正则过滤：\n- Phase 1b LLM 标题判断：100 条 × ~100 token = ~10K token\n- 其中 ~30% 被判断为 valuable（30 条）\n- Phase 3 LLM 摘要生成：30 条 × ~2000 token = ~60K token\n- 其中 6 条定期报告跳过 LLM：24 条 × ~2000 token = ~48K token\n\n**日总消耗：~58K token**\n**月总消耗（22 交易日）：~1.28M token**\n\nFile v2.0.9:skill-card.md\n\n## Description: <br>\nStock Watcher Pro tracks Eastmoney watchlist announcements, filters and classifies them, summarizes valuable updates with an optional LLM, and can present results through an agent digest or local web dashboard. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[54lynnn](https://clawhub.ai/user/54lynnn) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and developers use this skill to monitor stock watchlist announcements, receive concise agent-readable digests, and inspect announcement history in a local dashboard. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill stores a live Eastmoney login cookie in a plain local file. <br>\nMitigation: Keep cookie.txt out of version control, restrict file permissions, and rotate the cookie if it is exposed. <br>\nRisk: When LLM support is enabled, watchlist-related announcement data may be sent to the configured LLM provider. <br>\nMitigation: Review the configured LLM base URL and model before use, and disable LLM processing for sensitive watchlists. <br>\nRisk: The dashboard can expose announcement and watchlist data if made reachable on a shared network. <br>\nMitigation: Bind the dashboard to localhost or place it behind access controls before network exposure. <br>\nRisk: The bundled setup flow can create scheduled jobs. <br>\nMitigation: Review setup actions before running them and only enable scheduled execution when recurring scans are intended. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill listing](https://clawhub.ai/54lynnn/stock-watcher-pro) <br>\n- [System architecture](references/architecture.md) <br>\n- [Announcement classification taxonomy](references/classification.md) <br>\n- [Token cost analysis](references/token-cost.md) <br>\n- [Text cleaning rules](references/text-cleaning.md) <br>\n- [Eastmoney watchlist](https://quote.eastmoney.com/zixuan/lite.html) <br>\n- [CNInfo announcement query API](https://www.cninfo.com.cn/new/hisAnnouncement/query) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Plain text digest output and Markdown guidance with shell command examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Digest output uses DIGEST_TOTAL, DIGEST_EMPTY, or ERROR prefixes; dashboard mode starts a local Flask web interface.] <br>\n\n## Skill Version(s): <br>\n2.0.9 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v2.0.9:config.json\n\n{\n  \"notify\": {\n    \"type\": \"terminal\",\n    \"webhook_url\": \"\"\n  },\n  \"fetch_interval_days\": 7,\n  \"stocks\": [],\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n\nFile v2.0.9:requirements.txt\n\nrequests>=2.31.0\nflask>=3.0.0\npdfplumber>=0.10.0\n\nArchive v2.0.8: 26 files, 70550 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), README.md (3466b), references/architecture.md (7216b), references/classification.md (13315b), references/text-cleaning.md (6183b), references/token-cost.md (2260b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (13368b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14645b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_watcher.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2726b), SKILL.md (4524b), _meta.json (132b)\n\nFile v2.0.8:SKILL.md\n\n---\nname: \"stock-watcher-pro\"\nversion: \"2.0.0\"\ndescription: \"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。\"\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"📊\",\n        \"requires\": { \"python\": \"3.9+\" },\n        \"install\":\n          [\n            {\n              \"id\": \"deps\",\n              \"kind\": \"shell\",\n              \"command\": \"cd {{SKILL_DIR}} && pip install requests pdfplumber flask\",\n              \"label\": \"Install Python dependencies\",\n            },\n          ],\n      },\n  }\n---\n\n# 📊 Stock Watcher - 东方财富自选股公告追踪\n\n**双模式技能** — Agent 定时自动追踪 + 用户 Web 仪表盘查看。\n\n告诉 agent 你想做什么，例如：\n\n> \"帮我看看持仓板块这两天有什么重要公告\"\n> \"每天8点提醒我有价值的自选股公告\"\n> \"帮我打开公告仪表盘看看\"\n\n## 模式一：Agent Run 模式\n\nAgent 定时运行 `run.sh`，自动抓取公告、生成摘要，输出有价值公告的 digest 转发给用户。\n\n告诉 agent 即可：\n\n> \"帮我设置 stock-watcher 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动运行：\n\n```bash\n# 用法: bash run.sh [group] [days] [source]\nbash run.sh mygroup 15 eastmoney\n```\n\n### 输出示例\n\n**有公告时：**\n```\nDIGEST_TOTAL:3\n1.\n【000001平安银行】-【平安银行2026年第一季度报告】\n【季度报告】...\n\n2.\n【600519贵州茅台】-【贵州茅台关于回购股份的进展公告】\n累计回购金额XX亿元...\n```\n\n**无公告时：**\n```\nDIGEST_EMPTY:最近1天test板块无高价值公告\n```\n\n---\n\n## 模式二：Dashboard 模式\n\n用户手动运行，抓取公告 + 生成摘要 + 启动 Web 仪表盘，浏览器查看所有公告详情。\n\n告诉 agent 即可：\n\n> \"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"\n\n或者手动运行：\n\n```bash\n# 用法: bash dashboard.sh [group] [days] [source]\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n脚本自动执行三步：\n1. `stock_watcher.py --fetch-content` — 抓取公告 + 全文 + LLM 分类\n2. `daily_summary.py` — 生成摘要\n3. `dashboard.py` — 启动 Flask 仪表盘（默认端口 5001）\n\n启动后浏览器访问 `http://localhost:5001`，按 Ctrl+C 停止。\n\n**仪表盘功能：**\n- 股票列表表格：7天/15天/30天/全部的有价值公告比例\n- 点击展开：懒加载公告详情（标题、日期、摘要、正文、原文链接）\n- 类型标签：`大类 / 小类`（如 `股权股本类 / 回购`）\n- 搜索过滤，响应式设计\n\n---\n\n## 首次设置\n\n告诉 agent 即可：\n\n> \"帮我初始化 stock-watcher，安装依赖、配置 Cookie 和 LLM\"\n\n或者按以下步骤手动设置：\n\n### 1. 安装依赖\n\n```bash\ncd ~/.openclaw/workspace/skills/stock-watcher\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n东方财富网页版登录后的 Cookie，用于获取自选股列表。\n\n1. 浏览器打开 [https://quote.eastmoney.com/zixuan/lite.html](https://quote.eastmoney.com/zixuan/lite.html) 并登录\n2. F12 → Console → 输入 `copy(document.cookie)` 回车\n3. 粘贴到 `cookie.txt`\n\n**自动续签（可选）：**\n```bash\npip install playwright && playwright install chromium\npython3 scripts/refresh_cookie.py\n```\n\n### 3. 配置 LLM（可选）\n\nLLM 用于标题价值判断、公告分类和摘要生成。未配置时仅使用正则过滤。\n\n```bash\n# .env 文件\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n```json\n// config.json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_watcher.py --group test --days 15 --fetch-content\npython3 scripts/stock_watcher.py --stats\n```\n\n### 5. 配置定时任务\n\n告诉 agent 即可，例如：\n\n> \"帮我设置 stock-watcher 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动配置：\n\n```bash\nopenclaw cron add \\\n  --name stock-watcher \\\n  --cron \"0 1 * * *\" \\\n  --message \"运行股票公告扫描：cd {{SKILL_DIR}} && bash run.sh mygroup 15 eastmoney\"\n```\n---\n\n完整技术文档、公告分类体系、Token 消耗分析等详见 [GitHub](https://github.com/54Lynnn/stock-watcher-pro)\n\n## 开源\n\n- **GitHub**: [github.com/54Lynnn/stock-watcher-pro](https://github.com/54Lynnn/stock-watcher-pro)\n\nFile v2.0.8:README.md\n\n# Stock Watcher Pro - 东方财富自选股公告追踪\n\n自动追踪东方财富自选股公告，三级过滤 + LLM 分类摘要 + Web 仪表盘。支持 Agent 定时推送和手动查看。\n\n> 通过 ClawHub 安装：`clawhub install stock-watcher-pro`\n\n---\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\ncd /path/to/stock-watcher-pro\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n浏览器登录 [东方财富自选股](https://quote.eastmoney.com/zixuan/lite.html)，F12 → Console → `copy(document.cookie)`，粘贴到 `cookie.txt`。\n\n自动续签：`pip install playwright && playwright install chromium && python3 scripts/refresh_cookie.py`\n\n### 3. 配置 LLM（可选）\n\n```bash\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n`config.json` 中配置模型地址等参数（默认使用 DeepSeek V4 Flash）。未配置时自动禁用 LLM，仅使用正则过滤。\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_watcher.py --group test --days 15 --fetch-content\npython3 scripts/stock_watcher.py --stats\n```\n\n---\n\n## 两种模式\n\n### Agent Run 模式\n\n告诉 agent：`\"每天8点提醒我有价值的自选股公告\"`\n\n或手动运行：\n\n```bash\nbash run.sh mygroup 15 eastmoney\n```\n\n输出 digest 到 stdout（agent 读取转发），无公告时输出 `DIGEST_EMPTY:...`。\n\n### Dashboard 模式\n\n告诉 agent：`\"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"`\n\n或手动运行：\n\n```bash\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n自动执行：抓取 → 摘要 → 启动 Web 仪表盘（`http://localhost:5001`），Ctrl+C 停止。\n\n---\n\n## 常用命令\n\n```bash\npython3 scripts/stock_watcher.py --stats                 # 数据库统计\npython3 scripts/stock_watcher.py --list                  # 最近公告\npython3 scripts/stock_watcher.py --list --stock 600519   # 指定股票\npython3 scripts/stock_watcher.py --list-groups           # 可用分组\npython3 scripts/stock_watcher.py --clean                 # 清洗正文\n```\n\n---\n\n## 文件结构\n\n```\nstock-watcher-pro/\n  SKILL.md              # Agent 入口文档\n  README.md             # 本文档\n  config.json           # LLM 配置\n  cookie.txt            # 东方财富 Cookie\n  .env                  # LLM API Key\n  run.sh                # Agent Run 模式\n  dashboard.sh          # Dashboard 模式\n  scripts/              # Python 脚本\n  logs/                 # 运行日志\n  .stock-watcher-state/ # SQLite 数据库\n  references/           # 技术参考文档\n```\n\n---\n\n## 配置\n\n### config.json\n\n```json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### .env\n\n```\nLLM_API_KEY=sk-your-api-key-here\n```\n\n### 数据源\n\n默认全部走东方财富 API（A股+港股）。指定 `--source cninfo` 时 A 股走巨潮资讯网（PDF 更稳定），港股仍走东方财富。\n\n---\n\n## 依赖\n\n- Python 3.9+ / requests / pdfplumber / flask / sqlite3\n- playwright（可选，Cookie 自动续签）\n\n---\n\n## 技术参考\n\n详细文档见 `references/` 目录：\n\n- [系统架构](references/architecture.md) — 数据流、模块详解、过滤策略\n- [公告分类体系](references/classification.md) — A股8大类64小类 + 港股7大类41小类\n- [Token消耗分析](references/token-cost.md) — LLM 调用成本优化\n- [正文清洗规则](references/text-cleaning.md) — 14类清洗规则详解\n\nFile v2.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn742cdrc476d1kbhpsvnrnznx81x4r7\",\n  \"slug\": \"stock-tracker\",\n  \"version\": \"2.0.8\",\n  \"publishedAt\": 1780838389020\n}\n\nFile v2.0.8:references/architecture.md\n\n# 系统架构\n\n## 数据流总览\n\n```\n东方财富/巨潮资讯\n      │\n      ▼\neastmoney_api.py / cninfo_api.py  ─── 获取公告列表\n      │\n      ▼\nstock_watcher.py ─── 主入口，协调各模块\n      │\n      ├─ Phase 1a: 正则跳过判断 (ann_detail.should_skip_content)\n      │     │  13 条 SKIP_CONTENT_PATTERNS，极速过滤\n      │     ▼\n      ├─ Phase 1b: LLM 标题价值判断 (llm_judge.py)\n      │     │  并发 20 workers，判断 valuable / non-valuable\n      │     ▼\n      ├─ Phase 2: 并发下载正文 (ann_detail.fetch_announcement_content)\n      │     │  优先 API，回退 PDF 提取，max_workers=5\n      │     ▼\n      ├─ Phase 3: 顺序清洗 (text_cleaner.py) + 分批保存到 DB\n      │     ▼\n      ├─ daily_summary.py ─── 为有价值公告生成 LLM 摘要\n      │     │  BATCH_SIZE=1, workers=20, 定期报告跳过 LLM\n      │     ▼\n      └─ dashboard.py ─── Flask Web 仪表盘，lazy loading\n```\n\n## 模块分解\n\n### stock_watcher.py（主入口）\n\n**CLI 参数：**\n\n| 参数 | 用途 |\n|------|------|\n| `--force` | 强制重新抓取所有公告（覆盖已见检查） |\n| `--days N` | 抓取最近 N 天公告 |\n| `--dry-run` | 试运行，不更新数据库 |\n| `--group` | 只追踪指定分组（模糊匹配） |\n| `--list-groups` | 列出所有可用分组 |\n| `--stats` | 查看数据库统计 |\n| `--list` | 列出历史公告 |\n| `--fetch-content` | 补抓缺少全文的公告正文 |\n| `--clean` | 清洗已获取的公告正文 |\n| `--prune` | 清理无正文的空记录 |\n| `--source` | eastmoney（默认）或 cninfo |\n\n**执行流程：**\n1. 解析参数 → 执行子命令（stats/list/clean/prune/fetch-content）或完整运行\n2. 完整运行：获取自选股列表 → 获取公告列表 → 过滤已见 → 获取全文 → 入库\n\n### eastmoney_api.py（东方财富数据获取）\n\n**自选股获取（3 级回退）：**\n1. **myfavor API** `https://myfavor.eastmoney.com/v4/webouter` — 支持分组过滤\n2. **Cookie 解析** — 从 `selfSelectStocks` 字段正则提取\n3. **config.json** — 手动配置硬编码列表\n\n**公告 API：**\n- `https://np-anotice-stock.eastmoney.com/api/security/ann`\n- `ann_type=A` 为 A 股，`ann_type=H` 为港股\n- 参数：`stock_list={market},{code}`\n\n**Market 字段值：**\n\n| 值 | 市场 | 标签 |\n|----|------|------|\n| 0 | 深圳 | SZ |\n| 1 | 上海 | SH |\n| 100 | 美股 | US |\n| 104 | 期货 | FUT |\n| 116 | 港股 | HK |\n| 119 | 外汇 | FX |\n| 124 | 港股通 | HKI |\n| 134 | 港股通(深) | HKF |\n| 251 | 其他 | OTHER |\n\n### cninfo_api.py（巨潮资讯网数据获取）\n\n**API 端点：**\n- 列表：`POST https://www.cninfo.com.cn/new/hisAnnouncement/query`\n- PDF 基址：`https://static.cninfo.com.cn/{adjunctUrl}`\n\n**请求参数：**\n- `searchkey`: 股票代码\n- `seDate`: 日期范围 `YYYY-MM-DD~YYYY-MM-DD`\n- `pageNum` / `pageSize`: 分页\n- `column`: szse\n\n### ann_detail.py（公告正文获取）\n\n**内容获取优先级：**\n1. **内容 API** `https://np-cnotice-stock.eastmoney.com/api/content/ann`（需东方财富网络环境）\n2. **PDF 下载 + 文本提取** `https://pdf.dfcfw.com/pdf/H2_{art_code}_1.pdf`\n3. 外部传入 `pdf_url_override`（巨潮 PDF 链接）：直接下载 PDF\n\n**跳过全文采集的标题模式（13 条）：**\n1. 公司章程\n2. 信用评级 / 跟踪评级\n3. 募集说明书\n4. 付息公告\n5. 上市公告 / 摘牌\n6. 发行结果公告 / 票面利率 / 簿记建档 / 更名公告 / 发行完毕\n7. 董事会报告\n8. 法律意见书\n9. 股东会决议公告 / 股东会表决结果 / 投票表决结果\n10. 薪酬\n11. 周年会通告\n12. 担保额度\n13. 召开情况\n\n**TOC 提取：**\n超长文档（通函、海外市场公告、股东会会议资料、发行公告）只提取目录或开头 2000 字。\n\n### llm_judge.py（LLM 标题价值判断）\n\n**核心功能：**\n- 判断公告标题是否有价值（valuable / non-valuable）\n- 输出 category（大类）和 type（小类）\n- 使用 JSON mode（`response_format: {\"type\": \"json_object\"}`）\n- Fail-open：所有重试失败后默认视为有价值\n\n**重试策略：** 最多 2 次重试，间隔递增\n\n**System Prompt 结构：**\n1. A 股 8 大类 + HK 7 大类分类体系\n2. 高价值 type 列表\n3. 低价值 type 列表\n4. 需要结合标题判断的 type（董事会公告、借贷担保、利润分配）\n\n### text_cleaner.py（公告正文清洗）\n\n详见 `text-cleaning.md`。\n\n### daily_summary.py（每日公告摘要）\n\n**批处理参数：**\n- `BATCH_SIZE=1`：每次 LLM 调用只处理一条公告（避免超长上下文）\n- `max_workers=20`：并发线程数\n- `SKIP_LLM_TYPES`：定期报告类型跳过 LLM，使用固定摘要 `【类型】标题`\n\n**输出模式：**\n- `--digest` 输出格式化摘要列表（STDOUT），供 agent 读取转发\n- 格式：`DIGEST_TOTAL:N` → 编号列表\n\n### db.py（SQLite 存储）\n\n**核心特性：**\n- WAL 模式：`PRAGMA journal_mode=WAL`\n- UPSERT 含 null 保护：`ON CONFLICT(ann_id) DO UPDATE SET ... CASE WHEN excluded.x != '' THEN excluded.x ELSE announcements.x END`\n- 自动迁移：`_migrate_schema()` 增量添加新字段（full_text, clean_text, attach_url, summary, status, ann_type_tag, ann_type_category, clean_text_length）\n\n### dashboard.py（Flask Web 仪表盘）\n\n**路由：**\n| 端点 | 说明 |\n|------|------|\n| `GET /` | 首页（单页应用） |\n| `GET /api/stocks` | 股票概览统计（7/15/30天/全部） |\n| `GET /api/announcements/<code>` | 个股公告列表（lazy loading） |\n\n**前端特性：**\n- 股票表格行可展开\n- 搜索框实时过滤\n- 浮动个股栏（滚动时固定显示当前展开股票）\n- 分类标签展示\n\n## 过滤策略（3 层）\n\n```\n公告列表\n   │\n   ▼\nLayer 1: 正则跳过 (should_skip_content)\n   │  13 条 SKIP_CONTENT_PATTERNS\n   │  公司章程、信用评级、募集说明书、付息公告、上市公告等\n   │  跳过 → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 2: LLM 标题判断 (llm_judge.judge)\n   │  valuable → 继续下载全文\n   │  non-valuable → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 3: 下载失败\n   │  API/PDF 均失败 → status=filtered\n   │\n   ▼\n最终 DB 入库\n   valuable 有价值 | filtered 已过滤\n```\n\n## LLM 有价值/无价值类型\n\n**高价值 type（几乎总是下载）：**\n- 财务报告类全部（业绩预告、业绩快报、季度/半年/年度报告）\n- 交易提示类全部（停牌提示、交易异动、澄清公告、风险提示、特别处理、终止上市等）\n- 重大事项类：资产重组、收购兼并、股权激励、关联交易、违纪违规\n- 股权股本类：回购股权、权益变动\n- 一般公告类：法律纠纷、产销经营快报、机构调研公告\n- 港股：翌日报表、须公布的交易\n\n**低价值 type（几乎总是跳过）：**\n- 中介公告（法律意见书、保荐机构核查意见、律师核查意见）\n- 股东大会通知\n- 薪酬管理制度、董事会议事规则、公司章程修正案\n- 债券付息公告、发行结果公告\n\nFile v2.0.8:references/classification.md\n\n# 公告分类体系\n\n## A股 8大类64小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 招股类 | 申报稿 | 募集资金用途、财务数据概览 | LLM 判断 |\n| 2 | 招股类 | 申报反馈 | 监管问询要点、回复内容 | LLM 判断 |\n| 3 | 招股类 | 招股说明书 | 发行规模、定价、募集资金投向 | LLM 判断 |\n| 4 | 招股类 | 发行定价 | 发行价格、市盈率、发行日期 | LLM 判断 |\n| 5 | 招股类 | 发行结果 | 实际发行股数、募集资金总额 | LLM 判断 |\n| 6 | 招股类 | 上市公告书 | 上市日期、交易安排 | LLM 判断 |\n| 7 | 财务报告类 | 业绩预告 | 预计营收/利润数字、同比增减幅度、业绩变动原因 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告类 | 业绩快报 | 实际营收/利润数字、同比增减、与预告差异 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告类 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 10 | 财务报告类 | 半年报告 | 半年度财务数据、经营讨论 | 跳过 LLM，固定摘要 |\n| 11 | 财务报告类 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 12 | 财务报告类 | 补充更正 | 更正内容、更正前后对比 | 跳过 LLM，固定摘要 |\n| 13 | 重大事项类 | 利润分配 | 每股分红金额、分红总额、股权登记日、除权除息日 | LLM 判断 |\n| 14 | 重大事项类 | 股份增减持 | 增减持主体、变动股数、变动后持股比例、原因及后续计划 | LLM 判断 |\n| 15 | 重大事项类 | 资金投向 | 投资项目、投资金额、预期收益、资金来源、实施周期 | LLM 判断 |\n| 16 | 重大事项类 | 资产重组 | 重组标的、交易金额、交易对手、重组方式、标的公司主营业务及行业、重组后对业务布局的影响 | LLM 判断 |\n| 17 | 重大事项类 | 收购兼并 | 交易标的、交易金额、交易对手、收购目的、标的公司主营业务及行业、标的估值及溢价率 | LLM 判断 |\n| 18 | 重大事项类 | 重大合同 | 合同金额、合同对手方、合同期限、合同内容、付款方式及条件、合同履行对营收/利润的影响、违约风险 | LLM 判断 |\n| 19 | 重大事项类 | 股权激励 | 授予/行权价格、激励对象人数及构成、限售期及解锁条件、业绩考核目标、总量占股本比例 | LLM 判断 |\n| 20 | 重大事项类 | 关联交易 | 交易对方（关联方关系）、交易金额、定价依据及公允性、交易目的及必要性、对上市公司独立性的影响 | LLM 判断 |\n| 21 | 重大事项类 | 借贷担保 | 担保金额、担保对象、被担保方财务状况、担保期限、反担保措施 | LLM 判断（大额→有价值，常规→无价值） |\n| 22 | 重大事项类 | 委托理财 | 理财金额、产品类型、预期收益率、期限、风险等级 | LLM 判断 |\n| 23 | 重大事项类 | 违纪违规 | 违规主体、违规事项、处罚措施、整改方案 | LLM 判断 |\n| 24 | 重大事项类 | 政策影响 | 政策内容、对公司业务的具体影响、公司应对措施 | LLM 判断 |\n| 25 | 重大事项类 | 人事变动 | 具体人名、原职务、新职务、变动原因 | LLM 判断 |\n| 26 | 交易提示类 | 停牌提示 | 停牌原因、预计停牌时间、复牌条件 | 自动有价值 |\n| 27 | 交易提示类 | 交易异动 | 异动类型（涨停/跌停/换手率）、异动原因、是否需核查 | 自动有价值 |\n| 28 | 交易提示类 | 澄清公告 | 澄清事项、市场传闻内容、事实情况、对股价影响 | 自动有价值 |\n| 29 | 交易提示类 | 风险提示 | 风险类型、风险内容、可能影响、应对措施 | 自动有价值 |\n| 30 | 交易提示类 | 特别处理 | ST/ST\\* 原因、风险警示内容、可能后果 | 自动有价值 |\n| 31 | 交易提示类 | 终止上市 | 终止原因、退市整理期、投资者保护措施 | 自动有价值 |\n| 32 | 交易提示类 | 恢复上市 | 恢复上市原因、复牌后交易安排、公司当前经营状况 | 自动有价值 |\n| 33 | 交易提示类 | 暂停上市 | 暂停上市原因、后续恢复条件、投资者风险提示 | 自动有价值 |\n| 34 | 配股类 | 配股预案 | 配股比例（几配几）、配股价格、募集资金总额、配股目的及资金用途、对每股收益的摊薄影响 | LLM 判断 |\n| 35 | 配股类 | 配股说明书 | 配股比例、配股价格、募集资金用途、配股条件、对现有股东的影响 | LLM 判断 |\n| 36 | 配股类 | 配股获准 | 获准日期、配股方案关键条款、后续时间安排 | LLM 判断 |\n| 37 | 配股类 | 配股发行 | 实际发行股数、实际募集资金、发行结果、上市日期 | LLM 判断 |\n| 38 | 配股类 | 配股上市 | 上市日期、配股价、对股价的影响 | LLM 判断 |\n| 39 | 增发类 | 增发预案 | 增发原因及资金需求、增发股数及价格、募集资金总额及投向、发行对象（公开/定向）、对每股收益的摊薄影响 | LLM 判断 |\n| 40 | 增发类 | 增发说明书 | 增发方案详情、募集资金用途、发行条件、风险因素 | LLM 判断 |\n| 41 | 增发类 | 增发获准 | 获准日期、方案关键条款、后续安排 | LLM 判断 |\n| 42 | 增发类 | 增发发行 | 实际发行股数、实际募集资金、发行价格、发行结果 | LLM 判断 |\n| 43 | 增发类 | 增发上市 | 上市日期、对股价的影响 | LLM 判断 |\n| 44 | 股权股本类 | 权益变动 | 变动主体、变动前持股数量及比例、变动股数、变动后持股比例、变动方式（二级市场/协议转让等） | LLM 判断 |\n| 45 | 股权股本类 | 股本变动 | 变动原因、变动前后股本结构、新增股份性质 | LLM 判断 |\n| 46 | 股权股本类 | 质押冻结 | 质押/冻结主体、质押股数、占持股比例、质权人、质押融资用途、平仓风险 | LLM 判断 |\n| 47 | 股权股本类 | 质押式回购 | 回购主体、回购金额、质押标的、期限、到期安排 | LLM 判断 |\n| 48 | 股权股本类 | 回购股权 | 累计回购金额、回购股数、占总股本比例、回购计划总额及完成进度 | LLM 判断 |\n| 49 | 股权股本类 | 约定购回 | 购回主体、购回金额、标的证券、期限、购回价格 | LLM 判断 |\n| 50 | 股权股本类 | 股权分置改革 | 改革方案概要、对价安排、流通股与非流通股比例变化 | LLM 判断 |\n| 51 | 一般公告类 | 董事会公告 | 议案内容、表决结果、重大决议 | LLM 判断（具体议案→有价值，纯程序→无价值） |\n| 52 | 一般公告类 | 股东大会 | 会议审议议案、投票结果、重要决议 | LLM 判断 |\n| 53 | 一般公告类 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率 | LLM 判断 |\n| 54 | 一般公告类 | 中介公告 | 法律意见书、保荐机构核查意见 | 自动无价值 |\n| 55 | 一般公告类 | 法律纠纷 | 原告被告、涉案金额、诉讼进展、判决结果、对公司财务的潜在影响 | LLM 判断 |\n| 56 | 一般公告类 | 机构调研公告 | 调研机构名单、调研时间、公司回复要点、投资者关注的核心问题 | LLM 判断 |\n| 57 | 一般公告类 | 其他补充更正 | 更正内容、更正前后对比 | LLM 判断 |\n| 58 | 一般公告类 | 公司资料变更 | 变更事项（名称/地址/注册资本等）、变更前后 | LLM 判断 |\n| 59 | 一般公告类 | 融资融券 | 融资融券余额变化、标的调整 | LLM 判断 |\n| 60 | 一般公告类 | 员工持股 | 持股计划规模、参与人数、股票来源、锁定期、业绩考核条件 | LLM 判断 |\n| 61 | 一般公告类 | 产销经营快报 | 主要产品产销量、同比变化、经营亮点、行业景气度 | LLM 判断 |\n| 62 | 一般公告类 | 个股其他公告 | 通用兜底类别 | LLM 判断 |\n| 63 | 一般公告类 | ESG报告 | 环境/社会/治理关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 64 | 一般公告类 | 函件 | 一般函件往来 | LLM 判断 |\n\n## 港股 7大类41小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 业绩快报 | 业绩预告 | 预计财务数据、同比增减、变动原因 | LLM 判断 |\n| 2 | 业绩快报 | 季度业绩 | 季度经营数据、同比分析 | LLM 判断 |\n| 3 | 业绩快报 | 中期业绩 | 中期财务数据、业务回顾 | LLM 判断 |\n| 4 | 业绩快报 | 末期业绩 | 全年财务数据、末期分红建议 | LLM 判断 |\n| 5 | 业绩快报 | 业绩发布会 | 发布会日期、管理层发言要点、分析师问答 | LLM 判断 |\n| 6 | 财务报告 | 环境及管治报告 | ESG 关键指标、评级变化、重要披露事项 | LLM 判断 |\n| 7 | 财务报告 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告 | 中期报告 | 中期财务数据、管理层讨论 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 10 | 上市文件 | 预览资料 | 上市公司业务概览、财务摘要、行业定位 | LLM 判断 |\n| 11 | 上市文件 | 发售以供认购 | 发售价格、发售数量、集资额、认购安排、对股价影响 | LLM 判断 |\n| 12 | 上市文件 | 招股说明书 | 发行规模、定价、募集资金投向、风险因素 | LLM 判断 |\n| 13 | 上市文件 | 公开招股 | 招股价格区间、招股数量、集资额、上市日期、保荐人 | LLM 判断 |\n| 14 | 上市文件 | 供股 | 供股比例（几供几）、供股价格、募集资金总额、供股目的及资金用途、对现有股东的影响 | LLM 判断 |\n| 15 | 上市文件 | 资本化发行 | 发行方式、发行对象、对股本结构的影响、是否涉及大股东 | LLM 判断 |\n| 16 | 上市文件 | 介绍上市 | 介绍上市方式、不涉及公开发售的原因、上市日期、保荐人 | LLM 判断 |\n| 17 | 上市文件 | 发售现有证券 | 出售股东身份、发售股数、售价、较市价折让幅度、出售原因 | LLM 判断 |\n| 18 | 上市文件 | 聆讯资料 | 聆讯日期、上市申请关键信息 | LLM 判断 |\n| 19 | 上市文件 | 其它上市文件 | 其他上市相关文件 | LLM 判断 |\n| 20 | 股权股本 | 权益变动 | 变动主体、变动前持股比例、变动股数、变动后持股比例、变动方式 | LLM 判断 |\n| 21 | 股权股本 | 证券/股本 | 证券发行、股本结构变化、新增股份 | LLM 判断 |\n| 22 | 股权股本 | 交易披露 | 关联交易披露、重大交易披露 | LLM 判断 |\n| 23 | 股权股本 | 翌日报表 | 买入/卖出股数、成交价格、涉及股东名称及身份 | LLM 判断 |\n| 24 | 股权股本 | 月报表 | 月度股份变动汇总、各增减持主体及股数、变动后持股比例 | LLM 判断 |\n| 25 | 公告及通函 | 重大事项 | 重大交易、业务调整、资产处置 | LLM 判断 |\n| 26 | 公告及通函 | 新上市 | 新上市公司名称、主营业务及行业、发行规模及定价、集资用途、上市后表现预期 | LLM 判断 |\n| 27 | 公告及通函 | 会议/表决 | 股东会/董事会会议决议、表决结果 | LLM 判断 |\n| 28 | 公告及通函 | 关联交易 | 交易对手（关联方关系）、交易金额、定价依据、交易目的 | LLM 判断 |\n| 29 | 公告及通函 | 须公布的交易 | 交易性质（收购/出售/合营）、交易金额、交易对手、是否构成重大交易、对财务状况的影响 | LLM 判断 |\n| 30 | 公告及通函 | 公司变动 | 公司名称变更、注册地址变更、董事会成员变动 | LLM 判断 |\n| 31 | 公告及通函 | 财务资料 | 财务数据补充披露、澄清 | LLM 判断 |\n| 32 | 公告及通函 | 杂项 | 其他公告事项 | LLM 判断 |\n| 33 | 一般公告 | 交易安排 | 关键日期（除净日、过户截止日、派息日）、每股派息金额 | LLM 判断 |\n| 34 | 一般公告 | 创业板资料 | 创业板公司特定披露要求 | LLM 判断 |\n| 35 | 一般公告 | 监管者公告 | 监管机构名称、监管事项、处罚/警告措施、对公司经营的影响 | LLM 判断 |\n| 36 | 一般公告 | 委任代表表格 | 委任代表表格（通常无实质内容） | LLM 判断 |\n| 37 | 一般公告 | 宪章文件 | 公司章程、组织章程大纲及细则 | LLM 判断 |\n| 38 | 债券及结构性产品 | 权证公告 | 权证标的证券、行权价格、到期日、杠杆比率、实际杠杆 | LLM 判断 |\n| 39 | 债券及结构性产品 | 权证上市 | 权证条款（标的/行权价/到期日）、上市日期、初始价格 | LLM 判断 |\n| 40 | 债券及结构性产品 | 债务证券公告 | 债券规模、票面利率、期限、信用评级、担保情况、募集资金用途 | LLM 判断 |\n| 41 | 债券及结构性产品 | 其它 | 其他结构性产品公告 | LLM 判断 |\n\n**备注：**\n- `market=0`（深圳）和 `market=1`（上海）均为 A 股\n- `market=116` 为港股\n- A 股分类存储在 `A_CATEGORY_MAP`，港股分类存储在 `HK_CATEGORY_MAP`\n- 港股公告 API 使用 `ann_type=H`，A 股使用 `ann_type=A`\n\nFile v2.0.8:references/text-cleaning.md\n\n# 公告正文清洗规则\n\n共 14 条规则，按应用顺序依次执行。每规则为正则模式，使用 `re.MULTILINE` 编译。\n\n## 规则 1: 股票代码表头行\n\n**匹配示例：**\n- `证券代码:600961 证券简称:株冶集团 公告编号:2026-021`\n- `证券代码:601669 股票简称:中国电建 公告编号:临2026-028`\n\n**正则：** `证券代码[：:]\\s*\\S+\\s+(?:证券|股票)简称[：:]\\s*\\S+\\s+(公告编号[：:]\\s*\\S+)?`\n\n**行为：** 全部移除，不保留任何信息。\n\n---\n\n## 规则 2: 纯公司名行\n\n**匹配示例：**\n- `株洲冶炼集团股份有限公司`\n- `中国电力建设股份有限公司`\n\n**正则：** `^\\s*\\S{4,20}(股份有限)?公司\\s*$`\n\n**行为：** 删除独立成行的公司全称（仅限于单独占一行的情况，不删除段落内的公司名）。\n\n---\n\n## 规则 3: 董事会/监事会免责声明\n\n**10 个变体：**\n\n| # | 变体模式 |\n|---|---------|\n| 3a | 本公司及董事会全体成员保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3b | 本公司董事会及全体董事保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3c | 本公司及全体董事……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3d | 本公司及……监事……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3e | 本公司及……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3f | 本公司……董事……高级管理人员……保证……虚假记载……误导性陈述……重大遗漏……法律责任 |\n| 3g | 不存在……虚假……误导……重大遗漏……承担……责任 |\n| 3h | 对其内容的真实性、准确性和完整性承担法律责任 |\n| 3i | 全体董事……保证……内容……真实……准确……完整……责任 |\n| 3j | 保证……不存在……虚假……误导……遗漏……法律 |\n\n**行为：** 完整移除整句声明。注意：3a-3f 的保证范围涵盖 \"虚假记载、误导性陈述或者重大遗漏\"（含\"或者\"变体），同时支持 \"承担法律责任\" 和 \"承担个别及连带法律责任\" 等变体。\n\n---\n\n## 规则 4: \"特此公告\" 结语 + 日期落款\n\n**匹配：** `\\n\\s*特此公告[。\\s]*\\n?(?:\\s*\\S*?公司\\s*(?:董事会|监事会)?\\s*\\n?)?(?:\\s*<日期>\\s*)?`\n\n**行为：** 将 \"特此公告\" 及其后的公司名和日期整体移除，替换为换行符。\n\n**规则 4b（独立日期行）：** `\\n\\s*<日期>\\s*$`\n\n**行为：** 移除独立的日期落款行，支持中文数字日期（如 `二〇二六年五月二十九日`）和阿拉伯数字日期（如 `2026年5月29日`）。\n\n---\n\n## 规则 5: 股票信息行\n\n**匹配示例：**\n- `股票简称:申万宏源 股票代码:000166`\n\n**正则：** `股票简称[：:]\\s*\\S+\\s+股票代码[：:]\\s*\\S+`\n\n**行为：** 移除出现在募集说明书等文档开头的股票简称/代码行。\n\n---\n\n## 规则 6: \"重要内容提示\" 标记\n\n**匹配：** `重要内容提示[：:]\\s*\\n?`\n\n**行为：** 只移除 \"重要内容提示：\" 这个标题标记，保留下方的提示内容。\n\n---\n\n## 规则 7: PDF 页脚/分页噪声\n\n**三个子规则：**\n\n| # | 匹配内容 | 正则 |\n|---|---------|------|\n| 7a | `第1页 共3页` 类页脚 | `\\n\\s*第\\s*\\d+\\s*页\\s*共\\s*\\d+\\s*页\\s*\\n?` |\n| 7b | 纯数字页码行 | `^\\s*\\d+\\s*$` |\n| 7c | PDF 水印文字 | `[\\w\\-]+\\.pdf\\s*\\d{4}-\\d{2}-\\d{2}\\s*\\d{2}:\\d{2}:\\d{2}` |\n\n**行为：** 7a 替换为换行符，7b 和 7c 直接移除。\n\n---\n\n## 规则 8: 声明板块\n\n**匹配：**\n- `声 明\\n[^。]*?中国证监会[^。]*?证券交易所[^。]*?责任`\n- `声 明\\n[^。]*?本募集说明书[^。]*?真实[^。]*?准确[^。]*?完整[^。]*?责任`\n\n**行为：** 移除年报、募集说明书开头的法律声明板块。\n\n---\n\n## 规则 9: 投资者关系活动记录表头\n\n**三个子规则：**\n\n| # | 匹配内容 |\n|---|---------|\n| 9a | `证券代码：xxx 证券简称：xxx` 行 |\n| 9b | `xxx股份有限公司投资者关系活动记录表` |\n| 9c | `投资者关系活动记录表` |\n\n**行为：** 移除机构调研公告的标准表头。\n\n---\n\n## 规则 10: 地址/联系信息模板\n\n**匹配：**\n- `住所[：:].*?(?:\\d{3,6}室|号|楼|大厦|路\\d+号)`\n- `邮政编码[：:]\\s*\\d{6}`\n- `联系电话[：:]\\s*\\S+`\n- `传真[：:]\\s*\\S+`\n\n**行为：** 移除文档末尾的注册地址、邮编、电话、传真等联系信息。\n\n---\n\n## 规则 11: 募集说明书评级/担保字段\n\n**匹配：**\n- `信用评级结果[：:][^。]*?[。，]`\n- `信用评级机构[：:][^。]*?[。，]`\n- `增信措施情况[：:][^。]*?[。，]`\n- `担保或其他增信情况[：:][^。]*?[。，]`\n- `发行金额[：:][^。]*?[。，]`\n- `牵头主承销商[：:].*`\n- `联席主承销商[：:].*`\n- `簿记管理人[：:].*`\n- `受托管理人[：:].*`\n\n**行为：** 移除募集说明书中固定格式的评级、担保、承销商信息。\n\n---\n\n## 规则 12: 目录页\n\n**匹配：** `目\\s*录\\s*\\n[\\s\\S]*?(?=议案|一[、）]|\\d[、）])`\n\n**行为：** 从 \"目 录\" 标记开始到第一个议案/章节标题之间的内容全部移除。适用于年报、股东会会议资料等包含目录的文档。\n\n---\n\n## 规则 13: H股表格模板文字\n\n**匹配：**\n- `翌日披露報表\\s*\\([^)]*\\)\\s*`\n- `表格類別[：:]\\s*\\S+\\s+狀態[：:]\\s*\\S+\\s*`\n- `如上市發行人的已發行股份[^。]*?作出披露，必須填妥第一章節。`\n\n**行为：** 移除港股翌日披露报表的标准表格模板文字。\n\n---\n\n## 规则 14: 多余空白行\n\n**匹配：**\n- `\\n{3,}` → 替换为 `\\n\\n`（保留最多一个空行）\n- `^\\s*\\n` → 移除文档开头的空行\n\n**行为：** 压缩多余连续空行，清理文档首尾空白，最后执行 `strip()`。\n\n---\n\n## 执行统计\n\n```python\ndef get_stats(original: str, cleaned: str) -> dict:\n    \"\"\"返回清洗前后的字数对比\"\"\"\n```\n\n清洗效率通常可减少 15%-30% 的字符数（取决于文档类型），招股说明书和年度报告等模板化程度高的文档节省更明显。\n\nFile v2.0.8:references/token-cost.md\n\n# Token 消耗分析\n\n## 各操作 Token 消耗表\n\n| 操作 | Token 消耗 | 说明 |\n|------|-----------|------|\n| LLM 标题判断 | ~100 token/条 | 标题独立调用，单条非常轻量 |\n| LLM 摘要生成 | ~1500 输入 + 500 输出 | BATCH_SIZE=1，每条公告独立调用 |\n| 定期报告跳过 | 0 | 使用固定摘要 `【类型】标题`，不调 LLM |\n| Digest 输出 | 0 | 从 DB 读取已有摘要，不调 LLM |\n| 无新公告 | 0 | 直接跳过，无 API 调用 |\n\n## 优化策略\n\n### 1. 正则预过滤大幅减少 LLM 调用\n\n13 条 `SKIP_CONTENT_PATTERNS` 在 Phase 1a 顺序执行，极速过滤掉公司章程、信用评级、募集说明书等纯模板文档。只有通过正则检查的公告才进入 Phase 1b 的 LLM 判断。\n\n### 2. LLM 标题判断成本极低\n\n每条公告仅用标题做判断（~100 token），不涉及正文。20 workers 并发处理，延迟极低。\n\n### 3. 低价值公告不下载正文\n\nLLM 判断为 non-valuable 的公告直接跳过 Phase 2（正文下载），节省 PDF 下载带宽和后续 LLM 摘要 token。\n\n### 4. 摘要阶段跳过定期报告\n\n`SKIP_LLM_TYPES` 包括 6 种定期报告类型：业绩预告、业绩快报、季度报告、半年报告、年度报告、补充更正。这些公告正文极长（年度报告可达数万字），直接用 `【类型】标题` 作为摘要，完全不调用 LLM。\n\n### 5. BATCH_SIZE=1 避免超长上下文\n\nBATCH_SIZE 固定为 1，每次 LLM 调用处理一条公告。虽然单次调用效率较低，但避免了超长上下文带来的 token 浪费和摘要质量下降。\n\n### 6. Digest 不消耗 Token\n\n`--digest` 模式直接从 DB 读取已有摘要做格式化输出，无任何 LLM 调用。\n\n### 7. 按需增量处理\n\n`--hours` 参数只处理最近 N 小时入库的公告，避免全量回溯。\n\n### 8. 每日场景估算\n\n假设每天 200 条新公告，其中 50% 通过正则过滤：\n- Phase 1b LLM 标题判断：100 条 × ~100 token = ~10K token\n- 其中 ~30% 被判断为 valuable（30 条）\n- Phase 3 LLM 摘要生成：30 条 × ~2000 token = ~60K token\n- 其中 6 条定期报告跳过 LLM：24 条 × ~2000 token = ~48K token\n\n**日总消耗：~58K token**\n**月总消耗（22 交易日）：~1.28M token**\n\nFile v2.0.8:skill-card.md\n\n## Description: <br>\nTracks Eastmoney watchlist announcements with multi-stage filtering, optional LLM classification and summaries, scheduled agent digests, and a local web dashboard. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[54lynnn](https://clawhub.ai/user/54lynnn) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and developers use this skill to monitor Chinese A-share and Hong Kong stock watchlists, fetch announcement content, classify and summarize important disclosures, and review results as agent digests or through a local dashboard. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill requires an Eastmoney browser session cookie and may use an LLM API key. <br>\nMitigation: Treat cookie.txt and .env as secrets, keep them out of source control and synced folders, and install only if sharing those credentials with the skill is acceptable. <br>\nRisk: Recurring execution can run stock announcement collection automatically. <br>\nMitigation: Review or disable setup.sh and any crontab changes before enabling scheduled runs. <br>\nRisk: The local dashboard can expose announcement data if reachable beyond the local machine. <br>\nMitigation: Bind the dashboard to localhost or otherwise restrict network access. <br>\nRisk: LLM classification and summaries can send announcement text and metadata to the configured endpoint. <br>\nMitigation: Confirm that the configured LLM endpoint is acceptable for the data being processed, or disable LLM use and rely on regex filtering. <br>\n\n\n## Reference(s): <br>\n- [System architecture](references/architecture.md) <br>\n- [Announcement classification system](references/classification.md) <br>\n- [Token cost analysis](references/token-cost.md) <br>\n- [Text cleaning rules](references/text-cleaning.md) <br>\n- [ClawHub skill page](https://clawhub.ai/54lynnn/stock-watcher-pro) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Guidance] <br>\n**Output Format:** [Markdown and terminal text with digest records, setup commands, and local dashboard guidance] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May produce scheduled digest text, SQLite-backed announcement records, and a local Flask dashboard.] <br>\n\n## Skill Version(s): <br>\n2.0.8 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v2.0.8:config.json\n\n{\n  \"notify\": {\n    \"type\": \"terminal\",\n    \"webhook_url\": \"\"\n  },\n  \"fetch_interval_days\": 7,\n  \"stocks\": [],\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n\nFile v2.0.8:requirements.txt\n\nrequests>=2.31.0\nflask>=3.0.0\npdfplumber>=0.10.0\n\nArchive v2.0.7: 27 files, 75852 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), HANDOVER.md (11192b), README.md (3466b), references/architecture.md (7216b), references/classification.md (13315b), references/text-cleaning.md (6183b), references/token-cost.md (2260b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (13368b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14645b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_watcher.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2864b), SKILL.md (4524b), _meta.json (132b)\n\nFile v2.0.7:SKILL.md\n\n---\nname: \"stock-watcher-pro\"\nversion: \"2.0.0\"\ndescription: \"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。\"\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"📊\",\n        \"requires\": { \"python\": \"3.9+\" },\n        \"install\":\n          [\n            {\n              \"id\": \"deps\",\n              \"kind\": \"shell\",\n              \"command\": \"cd {{SKILL_DIR}} && pip install requests pdfplumber flask\",\n              \"label\": \"Install Python dependencies\",\n            },\n          ],\n      },\n  }\n---\n\n# 📊 Stock Watcher - 东方财富自选股公告追踪\n\n**双模式技能** — Agent 定时自动追踪 + 用户 Web 仪表盘查看。\n\n告诉 agent 你想做什么，例如：\n\n> \"帮我看看持仓板块这两天有什么重要公告\"\n> \"每天8点提醒我有价值的自选股公告\"\n> \"帮我打开公告仪表盘看看\"\n\n## 模式一：Agent Run 模式\n\nAgent 定时运行 `run.sh`，自动抓取公告、生成摘要，输出有价值公告的 digest 转发给用户。\n\n告诉 agent 即可：\n\n> \"帮我设置 stock-watcher 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动运行：\n\n```bash\n# 用法: bash run.sh [group] [days] [source]\nbash run.sh mygroup 15 eastmoney\n```\n\n### 输出示例\n\n**有公告时：**\n```\nDIGEST_TOTAL:3\n1.\n【000001平安银行】-【平安银行2026年第一季度报告】\n【季度报告】...\n\n2.\n【600519贵州茅台】-【贵州茅台关于回购股份的进展公告】\n累计回购金额XX亿元...\n```\n\n**无公告时：**\n```\nDIGEST_EMPTY:最近1天test板块无高价值公告\n```\n\n---\n\n## 模式二：Dashboard 模式\n\n用户手动运行，抓取公告 + 生成摘要 + 启动 Web 仪表盘，浏览器查看所有公告详情。\n\n告诉 agent 即可：\n\n> \"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"\n\n或者手动运行：\n\n```bash\n# 用法: bash dashboard.sh [group] [days] [source]\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n脚本自动执行三步：\n1. `stock_watcher.py --fetch-content` — 抓取公告 + 全文 + LLM 分类\n2. `daily_summary.py` — 生成摘要\n3. `dashboard.py` — 启动 Flask 仪表盘（默认端口 5001）\n\n启动后浏览器访问 `http://localhost:5001`，按 Ctrl+C 停止。\n\n**仪表盘功能：**\n- 股票列表表格：7天/15天/30天/全部的有价值公告比例\n- 点击展开：懒加载公告详情（标题、日期、摘要、正文、原文链接）\n- 类型标签：`大类 / 小类`（如 `股权股本类 / 回购`）\n- 搜索过滤，响应式设计\n\n---\n\n## 首次设置\n\n告诉 agent 即可：\n\n> \"帮我初始化 stock-watcher，安装依赖、配置 Cookie 和 LLM\"\n\n或者按以下步骤手动设置：\n\n### 1. 安装依赖\n\n```bash\ncd ~/.openclaw/workspace/skills/stock-watcher\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n东方财富网页版登录后的 Cookie，用于获取自选股列表。\n\n1. 浏览器打开 [https://quote.eastmoney.com/zixuan/lite.html](https://quote.eastmoney.com/zixuan/lite.html) 并登录\n2. F12 → Console → 输入 `copy(document.cookie)` 回车\n3. 粘贴到 `cookie.txt`\n\n**自动续签（可选）：**\n```bash\npip install playwright && playwright install chromium\npython3 scripts/refresh_cookie.py\n```\n\n### 3. 配置 LLM（可选）\n\nLLM 用于标题价值判断、公告分类和摘要生成。未配置时仅使用正则过滤。\n\n```bash\n# .env 文件\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n```json\n// config.json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_watcher.py --group test --days 15 --fetch-content\npython3 scripts/stock_watcher.py --stats\n```\n\n### 5. 配置定时任务\n\n告诉 agent 即可，例如：\n\n> \"帮我设置 stock-watcher 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动配置：\n\n```bash\nopenclaw cron add \\\n  --name stock-watcher \\\n  --cron \"0 1 * * *\" \\\n  --message \"运行股票公告扫描：cd {{SKILL_DIR}} && bash run.sh mygroup 15 eastmoney\"\n```\n---\n\n完整技术文档、公告分类体系、Token 消耗分析等详见 [GitHub](https://github.com/54Lynnn/stock-watcher-pro)\n\n## 开源\n\n- **GitHub**: [github.com/54Lynnn/stock-watcher-pro](https://github.com/54Lynnn/stock-watcher-pro)\n\nFile v2.0.7:README.md\n\n# Stock Watcher Pro - 东方财富自选股公告追踪\n\n自动追踪东方财富自选股公告，三级过滤 + LLM 分类摘要 + Web 仪表盘。支持 Agent 定时推送和手动查看。\n\n> 通过 ClawHub 安装：`clawhub install stock-watcher-pro`\n\n---\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\ncd /path/to/stock-watcher-pro\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n浏览器登录 [东方财富自选股](https://quote.eastmoney.com/zixuan/lite.html)，F12 → Console → `copy(document.cookie)`，粘贴到 `cookie.txt`。\n\n自动续签：`pip install playwright && playwright install chromium && python3 scripts/refresh_cookie.py`\n\n### 3. 配置 LLM（可选）\n\n```bash\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n`config.json` 中配置模型地址等参数（默认使用 DeepSeek V4 Flash）。未配置时自动禁用 LLM，仅使用正则过滤。\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_watcher.py --group test --days 15 --fetch-content\npython3 scripts/stock_watcher.py --stats\n```\n\n---\n\n## 两种模式\n\n### Agent Run 模式\n\n告诉 agent：`\"每天8点提醒我有价值的自选股公告\"`\n\n或手动运行：\n\n```bash\nbash run.sh mygroup 15 eastmoney\n```\n\n输出 digest 到 stdout（agent 读取转发），无公告时输出 `DIGEST_EMPTY:...`。\n\n### Dashboard 模式\n\n告诉 agent：`\"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"`\n\n或手动运行：\n\n```bash\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n自动执行：抓取 → 摘要 → 启动 Web 仪表盘（`http://localhost:5001`），Ctrl+C 停止。\n\n---\n\n## 常用命令\n\n```bash\npython3 scripts/stock_watcher.py --stats                 # 数据库统计\npython3 scripts/stock_watcher.py --list                  # 最近公告\npython3 scripts/stock_watcher.py --list --stock 600519   # 指定股票\npython3 scripts/stock_watcher.py --list-groups           # 可用分组\npython3 scripts/stock_watcher.py --clean                 # 清洗正文\n```\n\n---\n\n## 文件结构\n\n```\nstock-watcher-pro/\n  SKILL.md              # Agent 入口文档\n  README.md             # 本文档\n  config.json           # LLM 配置\n  cookie.txt            # 东方财富 Cookie\n  .env                  # LLM API Key\n  run.sh                # Agent Run 模式\n  dashboard.sh          # Dashboard 模式\n  scripts/              # Python 脚本\n  logs/                 # 运行日志\n  .stock-watcher-state/ # SQLite 数据库\n  references/           # 技术参考文档\n```\n\n---\n\n## 配置\n\n### config.json\n\n```json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### .env\n\n```\nLLM_API_KEY=sk-your-api-key-here\n```\n\n### 数据源\n\n默认全部走东方财富 API（A股+港股）。指定 `--source cninfo` 时 A 股走巨潮资讯网（PDF 更稳定），港股仍走东方财富。\n\n---\n\n## 依赖\n\n- Python 3.9+ / requests / pdfplumber / flask / sqlite3\n- playwright（可选，Cookie 自动续签）\n\n---\n\n## 技术参考\n\n详细文档见 `references/` 目录：\n\n- [系统架构](references/architecture.md) — 数据流、模块详解、过滤策略\n- [公告分类体系](references/classification.md) — A股8大类64小类 + 港股7大类41小类\n- [Token消耗分析](references/token-cost.md) — LLM 调用成本优化\n- [正文清洗规则](references/text-cleaning.md) — 14类清洗规则详解\n\nFile v2.0.7:_meta.json\n\n{\n  \"ownerId\": \"kn742cdrc476d1kbhpsvnrnznx81x4r7\",\n  \"slug\": \"stock-tracker\",\n  \"version\": \"2.0.7\",\n  \"publishedAt\": 1780838135394\n}\n\nFile v2.0.7:references/architecture.md\n\n# 系统架构\n\n## 数据流总览\n\n```\n东方财富/巨潮资讯\n      │\n      ▼\neastmoney_api.py / cninfo_api.py  ─── 获取公告列表\n      │\n      ▼\nstock_watcher.py ─── 主入口，协调各模块\n      │\n      ├─ Phase 1a: 正则跳过判断 (ann_detail.should_skip_content)\n      │     │  13 条 SKIP_CONTENT_PATTERNS，极速过滤\n      │     ▼\n      ├─ Phase 1b: LLM 标题价值判断 (llm_judge.py)\n      │     │  并发 20 workers，判断 valuable / non-valuable\n      │     ▼\n      ├─ Phase 2: 并发下载正文 (ann_detail.fetch_announcement_content)\n      │     │  优先 API，回退 PDF 提取，max_workers=5\n      │     ▼\n      ├─ Phase 3: 顺序清洗 (text_cleaner.py) + 分批保存到 DB\n      │     ▼\n      ├─ daily_summary.py ─── 为有价值公告生成 LLM 摘要\n      │     │  BATCH_SIZE=1, workers=20, 定期报告跳过 LLM\n      │     ▼\n      └─ dashboard.py ─── Flask Web 仪表盘，lazy loading\n```\n\n## 模块分解\n\n### stock_watcher.py（主入口）\n\n**CLI 参数：**\n\n| 参数 | 用途 |\n|------|------|\n| `--force` | 强制重新抓取所有公告（覆盖已见检查） |\n| `--days N` | 抓取最近 N 天公告 |\n| `--dry-run` | 试运行，不更新数据库 |\n| `--group` | 只追踪指定分组（模糊匹配） |\n| `--list-groups` | 列出所有可用分组 |\n| `--stats` | 查看数据库统计 |\n| `--list` | 列出历史公告 |\n| `--fetch-content` | 补抓缺少全文的公告正文 |\n| `--clean` | 清洗已获取的公告正文 |\n| `--prune` | 清理无正文的空记录 |\n| `--source` | eastmoney（默认）或 cninfo |\n\n**执行流程：**\n1. 解析参数 → 执行子命令（stats/list/clean/prune/fetch-content）或完整运行\n2. 完整运行：获取自选股列表 → 获取公告列表 → 过滤已见 → 获取全文 → 入库\n\n### eastmoney_api.py（东方财富数据获取）\n\n**自选股获取（3 级回退）：**\n1. **myfavor API** `https://myfavor.eastmoney.com/v4/webouter` — 支持分组过滤\n2. **Cookie 解析** — 从 `selfSelectStocks` 字段正则提取\n3. **config.json** — 手动配置硬编码列表\n\n**公告 API：**\n- `https://np-anotice-stock.eastmoney.com/api/security/ann`\n- `ann_type=A` 为 A 股，`ann_type=H` 为港股\n- 参数：`stock_list={market},{code}`\n\n**Market 字段值：**\n\n| 值 | 市场 | 标签 |\n|----|------|------|\n| 0 | 深圳 | SZ |\n| 1 | 上海 | SH |\n| 100 | 美股 | US |\n| 104 | 期货 | FUT |\n| 116 | 港股 | HK |\n| 119 | 外汇 | FX |\n| 124 | 港股通 | HKI |\n| 134 | 港股通(深) | HKF |\n| 251 | 其他 | OTHER |\n\n### cninfo_api.py（巨潮资讯网数据获取）\n\n**API 端点：**\n- 列表：`POST https://www.cninfo.com.cn/new/hisAnnouncement/query`\n- PDF 基址：`https://static.cninfo.com.cn/{adjunctUrl}`\n\n**请求参数：**\n- `searchkey`: 股票代码\n- `seDate`: 日期范围 `YYYY-MM-DD~YYYY-MM-DD`\n- `pageNum` / `pageSize`: 分页\n- `column`: szse\n\n### ann_detail.py（公告正文获取）\n\n**内容获取优先级：**\n1. **内容 API** `https://np-cnotice-stock.eastmoney.com/api/content/ann`（需东方财富网络环境）\n2. **PDF 下载 + 文本提取** `https://pdf.dfcfw.com/pdf/H2_{art_code}_1.pdf`\n3. 外部传入 `pdf_url_override`（巨潮 PDF 链接）：直接下载 PDF\n\n**跳过全文采集的标题模式（13 条）：**\n1. 公司章程\n2. 信用评级 / 跟踪评级\n3. 募集说明书\n4. 付息公告\n5. 上市公告 / 摘牌\n6. 发行结果公告 / 票面利率 / 簿记建档 / 更名公告 / 发行完毕\n7. 董事会报告\n8. 法律意见书\n9. 股东会决议公告 / 股东会表决结果 / 投票表决结果\n10. 薪酬\n11. 周年会通告\n12. 担保额度\n13. 召开情况\n\n**TOC 提取：**\n超长文档（通函、海外市场公告、股东会会议资料、发行公告）只提取目录或开头 2000 字。\n\n### llm_judge.py（LLM 标题价值判断）\n\n**核心功能：**\n- 判断公告标题是否有价值（valuable / non-valuable）\n- 输出 category（大类）和 type（小类）\n- 使用 JSON mode（`response_format: {\"type\": \"json_object\"}`）\n- Fail-open：所有重试失败后默认视为有价值\n\n**重试策略：** 最多 2 次重试，间隔递增\n\n**System Prompt 结构：**\n1. A 股 8 大类 + HK 7 大类分类体系\n2. 高价值 type 列表\n3. 低价值 type 列表\n4. 需要结合标题判断的 type（董事会公告、借贷担保、利润分配）\n\n### text_cleaner.py（公告正文清洗）\n\n详见 `text-cleaning.md`。\n\n### daily_summary.py（每日公告摘要）\n\n**批处理参数：**\n- `BATCH_SIZE=1`：每次 LLM 调用只处理一条公告（避免超长上下文）\n- `max_workers=20`：并发线程数\n- `SKIP_LLM_TYPES`：定期报告类型跳过 LLM，使用固定摘要 `【类型】标题`\n\n**输出模式：**\n- `--digest` 输出格式化摘要列表（STDOUT），供 agent 读取转发\n- 格式：`DIGEST_TOTAL:N` → 编号列表\n\n### db.py（SQLite 存储）\n\n**核心特性：**\n- WAL 模式：`PRAGMA journal_mode=WAL`\n- UPSERT 含 null 保护：`ON CONFLICT(ann_id) DO UPDATE SET ... CASE WHEN excluded.x != '' THEN excluded.x ELSE announcements.x END`\n- 自动迁移：`_migrate_schema()` 增量添加新字段（full_text, clean_text, attach_url, summary, status, ann_type_tag, ann_type_category, clean_text_length）\n\n### dashboard.py（Flask Web 仪表盘）\n\n**路由：**\n| 端点 | 说明 |\n|------|------|\n| `GET /` | 首页（单页应用） |\n| `GET /api/stocks` | 股票概览统计（7/15/30天/全部） |\n| `GET /api/announcements/<code>` | 个股公告列表（lazy loading） |\n\n**前端特性：**\n- 股票表格行可展开\n- 搜索框实时过滤\n- 浮动个股栏（滚动时固定显示当前展开股票）\n- 分类标签展示\n\n## 过滤策略（3 层）\n\n```\n公告列表\n   │\n   ▼\nLayer 1: 正则跳过 (should_skip_content)\n   │  13 条 SKIP_CONTENT_PATTERNS\n   │  公司章程、信用评级、募集说明书、付息公告、上市公告等\n   │  跳过 → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 2: LLM 标题判断 (llm_judge.judge)\n   │  valuable → 继续下载全文\n   │  non-valuable → full_text=clean_text=\"\"，status=filtered\n   │\n   ▼\nLayer 3: 下载失败\n   │  API/PDF 均失败 → status=filtered\n   │\n   ▼\n最终 DB 入库\n   valuable 有价值 | filtered 已过滤\n```\n\n## LLM 有价值/无价值类型\n\n**高价值 type（几乎总是下载）：**\n- 财务报告类全部（业绩预告、业绩快报、季度/半年/年度报告）\n- 交易提示类全部（停牌提示、交易异动、澄清公告、风险提示、特别处理、终止上市等）\n- 重大事项类：资产重组、收购兼并、股权激励、关联交易、违纪违规\n- 股权股本类：回购股权、权益变动\n- 一般公告类：法律纠纷、产销经营快报、机构调研公告\n- 港股：翌日报表、须公布的交易\n\n**低价值 type（几乎总是跳过）：**\n- 中介公告（法律意见书、保荐机构核查意见、律师核查意见）\n- 股东大会通知\n- 薪酬管理制度、董事会议事规则、公司章程修正案\n- 债券付息公告、发行结果公告\n\nFile v2.0.7:references/classification.md\n\n# 公告分类体系\n\n## A股 8大类64小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 招股类 | 申报稿 | 募集资金用途、财务数据概览 | LLM 判断 |\n| 2 | 招股类 | 申报反馈 | 监管问询要点、回复内容 | LLM 判断 |\n| 3 | 招股类 | 招股说明书 | 发行规模、定价、募集资金投向 | LLM 判断 |\n| 4 | 招股类 | 发行定价 | 发行价格、市盈率、发行日期 | LLM 判断 |\n| 5 | 招股类 | 发行结果 | 实际发行股数、募集资金总额 | LLM 判断 |\n| 6 | 招股类 | 上市公告书 | 上市日期、交易安排 | LLM 判断 |\n| 7 | 财务报告类 | 业绩预告 | 预计营收/利润数字、同比增减幅度、业绩变动原因 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告类 | 业绩快报 | 实际营收/利润数字、同比增减、与预告差异 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告类 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 10 | 财务报告类 | 半年报告 | 半年度财务数据、经营讨论 | 跳过 LLM，固定摘要 |\n| 11 | 财务报告类 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 12 | 财务报告类 | 补充更正 | 更正内容、更正前后对比 | 跳过 LLM，固定摘要 |\n| 13 | 重大事项类 | 利润分配 | 每股分红金额、分红总额、股权登记日、除权除息日 | LLM 判断 |\n| 14 | 重大事项类 | 股份增减持 | 增减持主体、变动股数、变动后持股比例、原因及后续计划 | LLM 判断 |\n| 15 | 重大事项类 | 资金投向 | 投资项目、投资金额、预期收益、资金来源、实施周期 | LLM 判断 |\n| 16 | 重大事项类 | 资产重组 | 重组标的、交易金额、交易对手、重组方式、标的公司主营业务及行业、重组后对业务布局的影响 | LLM 判断 |\n| 17 | 重大事项类 | 收购兼并 | 交易标的、交易金额、交易对手、收购目的、标的公司主营业务及行业、标的估值及溢价率 | LLM 判断 |\n| 18 | 重大事项类 | 重大合同 | 合同金额、合同对手方、合同期限、合同内容、付款方式及条件、合同履行对营收/利润的影响、违约风险 | LLM 判断 |\n| 19 | 重大事项类 | 股权激励 | 授予/行权价格、激励对象人数及构成、限售期及解锁条件、业绩考核目标、总量占股本比例 | LLM 判断 |\n| 20 | 重大事项类 | 关联交易 | 交易对方（关联方关系）、交易金额、定价依据及公允性、交易目的及必要性、对上市公司独立性的影响 | LLM 判断 |\n| 21 | 重大事项类 | 借贷担保 | 担保金额、担保对象、被担保方财务状况、担保期限、反担保措施 | LLM 判断（大额→有价值，常规→无价值） |\n| 22 | 重大事项类 | 委托理财 | 理财金额、产品类型、预期收益率、期限、风险等级 | LLM 判断 |\n| 23 | 重大事项类 | 违纪违规 | 违规主体、违规事项、处罚措施、整改方案 | LLM 判断 |\n| 24 | 重大事项类 | 政策影响 | 政策内容、对公司业务的具体影响、公司应对措施 | LLM 判断 |\n| 25 | 重大事项类 | 人事变动 | 具体人名、原职务、新职务、变动原因 | LLM 判断 |\n| 26 | 交易提示类 | 停牌提示 | 停牌原因、预计停牌时间、复牌条件 | 自动有价值 |\n| 27 | 交易提示类 | 交易异动 | 异动类型（涨停/跌停/换手率）、异动原因、是否需核查 | 自动有价值 |\n| 28 | 交易提示类 | 澄清公告 | 澄清事项、市场传闻内容、事实情况、对股价影响 | 自动有价值 |\n| 29 | 交易提示类 | 风险提示 | 风险类型、风险内容、可能影响、应对措施 | 自动有价值 |\n| 30 | 交易提示类 | 特别处理 | ST/ST\\* 原因、风险警示内容、可能后果 | 自动有价值 |\n| 31 | 交易提示类 | 终止上市 | 终止原因、退市整理期、投资者保护措施 | 自动有价值 |\n| 32 | 交易提示类 | 恢复上市 | 恢复上市原因、复牌后交易安排、公司当前经营状况 | 自动有价值 |\n| 33 | 交易提示类 | 暂停上市 | 暂停上市原因、后续恢复条件、投资者风险提示 | 自动有价值 |\n| 34 | 配股类 | 配股预案 | 配股比例（几配几）、配股价格、募集资金总额、配股目的及资金用途、对每股收益的摊薄影响 | LLM 判断 |\n| 35 | 配股类 | 配股说明书 | 配股比例、配股价格、募集资金用途、配股条件、对现有股东的影响 | LLM 判断 |\n| 36 | 配股类 | 配股获准 | 获准日期、配股方案关键条款、后续时间安排 | LLM 判断 |\n| 37 | 配股类 | 配股发行 | 实际发行股数、实际募集资金、发行结果、上市日期 | LLM 判断 |\n| 38 | 配股类 | 配股上市 | 上市日期、配股价、对股价的影响 | LLM 判断 |\n| 39 | 增发类 | 增发预案 | 增发原因及资金需求、增发股数及价格、募集资金总额及投向、发行对象（公开/定向）、对每股收益的摊薄影响 | LLM 判断 |\n| 40 | 增发类 | 增发说明书 | 增发方案详情、募集资金用途、发行条件、风险因素 | LLM 判断 |\n| 41 | 增发类 | 增发获准 | 获准日期、方案关键条款、后续安排 | LLM 判断 |\n| 42 | 增发类 | 增发发行 | 实际发行股数、实际募集资金、发行价格、发行结果 | LLM 判断 |\n| 43 | 增发类 | 增发上市 | 上市日期、对股价的影响 | LLM 判断 |\n| 44 | 股权股本类 | 权益变动 | 变动主体、变动前持股数量及比例、变动股数、变动后持股比例、变动方式（二级市场/协议转让等） | LLM 判断 |\n| 45 | 股权股本类 | 股本变动 | 变动原因、变动前后股本结构、新增股份性质 | LLM 判断 |\n| 46 | 股权股本类 | 质押冻结 | 质押/冻结主体、质押股数、占持股比例、质权人、质押融资用途、平仓风险 | LLM 判断 |\n| 47 | 股权股本类 | 质押式回购 | 回购主体、回购金额、质押标的、期限、到期安排 | LLM 判断 |\n| 48 | 股权股本类 | 回购股权 | 累计回购金额、回购股数、占总股本比例、回购计划总额及完成进度 | LLM 判断 |\n| 49 | 股权股本类 | 约定购回 | 购回主体、购回金额、标的证券、期限、购回价格 | LLM 判断 |\n| 50 | 股权股本类 | 股权分置\n\nArchive v2.0.6: 23 files, 74364 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), HANDOVER.md (11192b), README.md (35611b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (13368b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14645b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_watcher.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2530b), SKILL.md (4524b), _meta.json (132b)\n\nArchive v2.0.5: 23 files, 74428 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), HANDOVER.md (11192b), README.md (35611b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (13368b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14645b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_watcher.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2729b), SKILL.md (4413b), _meta.json (132b)\n\nArchive v2.0.4: 23 files, 75015 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), HANDOVER.md (11192b), README.md (35611b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (13368b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14645b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_watcher.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2740b), SKILL.md (5673b), _meta.json (132b)\n\nArchive v2.0.3: 23 files, 75208 bytes\n\nFiles: config.json (268b), dashboard.sh (1070b), HANDOVER.md (11192b), README.md (35611b), requirements.txt (49b), run.sh (1445b), scripts/ann_detail.py (13368b), scripts/backfill_category.py (5332b), scripts/backfill_text_length.py (1071b), scripts/cninfo_api.py (5987b), scripts/daily_summary.py (20430b), scripts/dashboard.py (11884b), scripts/db.py (16928b), scripts/eastmoney_api.py (13365b), scripts/llm_judge.py (14645b), scripts/reclassify_all.py (4415b), scripts/refresh_cookie.py (4168b), scripts/setup.sh (4668b), scripts/stock_watcher.py (14541b), scripts/text_cleaner.py (6526b), skill-card.md (2906b), SKILL.md (6101b), _meta.json (132b)","readmeExcerpt":"Skill: stock-tracker Owner: 54lynnn Summary: 东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。 Tags: latest:2.2.0 Version history: v2.2.0 | 2026-07-01T01:18:27.859Z | user v2.2.0: 新增过滤规则（解除质押、公司理财、可转债审计报告、质押展期）+ config_manager/dependencies/error_handler重构 + 测试用例 v2.1.0 | 2026-06-13T07:51:40.924Z | user 新增公告过滤规则文档，记录6轮正则过滤规则演进 v2.0.10 | 2026-06-07T13:28:44.548Z | user fix: use absolute file:/// paths for references l","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 用法: bash run.sh [group] [days] [source]\nbash run.sh mygroup 15 eastmoney"},{"language":"text","snippet":"DIGEST_TOTAL:3\n1.\n【000001平安银行】-【平安银行2026年第一季度报告】\n【季度报告】...\n\n2.\n【600519贵州茅台】-【贵州茅台关于回购股份的进展公告】\n累计回购金额XX亿元..."},{"language":"text","snippet":"DIGEST_EMPTY:最近1天test板块无高价值公告"},{"language":"bash","snippet":"# 用法: bash dashboard.sh [group] [days] [source]\nbash dashboard.sh mygroup 15 eastmoney"},{"language":"bash","snippet":"cd ~/.openclaw/workspace/skills/stock-tracker\npip install requests pdfplumber flask"},{"language":"bash","snippet":"pip install playwright && playwright install chromium\npython3 scripts/refresh_cookie.py"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: \"stock-tracker\"\nversion: \"2.2.0\"\ndescription: \"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。\"\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"📊\",\n        \"requires\": { \"python\": \"3.9+\" },\n        \"install\":\n          [\n            {\n              \"id\": \"deps\",\n              \"kind\": \"shell\",\n              \"command\": \"cd {{SKILL_DIR}} && pip install requests pdfplumber flask\",\n              \"label\": \"Install Python dependencies\",\n            },\n          ],\n      },\n  }\n---\n\n# 📊 Stock Tracker - 东方财富自选股公告追踪\n\n**双模式技能** — Agent 定时自动追踪 + 用户 Web 仪表盘查看。\n\n告诉 agent 你想做什么，例如：\n\n> \"帮我看看持仓板块这两天有什么重要公告\"\n> \"每天8点提醒我有价值的自选股公告\"\n> \"帮我打开公告仪表盘看看\"\n\n## 模式一：Agent Run 模式\n\nAgent 定时运行 `run.sh`，自动抓取公告、生成摘要，输出有价值公告的 digest 转发给用户。\n\n告诉 agent 即可：\n\n> \"帮我设置 stock-tracker 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动运行：\n\n```bash\n# 用法: bash run.sh [group] [days] [source]\nbash run.sh mygroup 15 eastmoney\n```\n\n### 输出示例\n\n**有公告时：**\n```\nDIGEST_TOTAL:3\n1.\n【000001平安银行】-【平安银行2026年第一季度报告】\n【季度报告】...\n\n2.\n【600519贵州茅台】-【贵州茅台关于回购股份的进展公告】\n累计回购金额XX亿元...\n```\n\n**无公告时：**\n```\nDIGEST_EMPTY:最近1天test板块无高价值公告\n```\n\n---\n\n## 模式二：Dashboard 模式\n\n用户手动运行，抓取公告 + 生成摘要 + 启动 Web 仪表盘，浏览器查看所有公告详情。\n\n告诉 agent 即可：\n\n> \"帮我跑 stock-tracker 的 dashboard 模式，抓取 mygroup 板块最近15天的公告并打开仪表盘\"\n\n或者手动运行：\n\n```bash\n# 用法: bash dashboard.sh [group] [days] [source]\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n脚本自动执行一步（摘要已集成到主流程）：\n1. `stock_tracker.py --fetch-content` — 抓取公告 + 全文 + LLM 分类 + 自动生成摘要\n2. `dashboard.py` — 启动 Flask 仪表盘（默认端口 5001）\n\n启动后浏览器访问 `http://localhost:5001`，按 Ctrl+C 停止。\n\n**仪表盘功能：**\n- 股票列表表格：7天/15天/30天/全部的有价值公告比例\n- 点击展开：懒加载公告详情（标题、日期、摘要、正文、原文链接）\n- 类型标签：`大类 / 小类`（如 `股权股本类 / 回购`）\n- 搜索过滤，响应式设计\n- CSV 导出：点击右上角「导出 CSV」下载近 30 天有价值公告\n\n---\n\n## 首次设置\n\n告诉 agent 即可：\n\n> \"帮我初始化 stock-tracker，安装依赖、配置 Cookie 和 LLM\"\n\n或者按以下步骤手动设置：\n\n### 1. 安装依赖\n\n```bash\ncd ~/.openclaw/workspace/skills/stock-tracker\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n东方财富网页版登录后的 Cookie，用于获取自选股列表。\n\n1. 浏览器打开 [https://quote.eastmoney.com/zixuan/lite.html](https://quote.eastmoney.com/zixuan/lite.html) 并登录\n2. F12 → Console → 输入 `copy(document.cookie)` 回车\n3. 粘贴到 `cookie.txt`\n\n**自动续签（可选）：**\n```bash\npip install playwright && playwright install chromium\npython3 scripts/refresh_cookie.py\n```\n\n### 3. 配置 LLM（可选）\n\nLLM 用于标题价值判断、公告分类和摘要生成。未配置时仅使用正则过滤。\n\n```bash\n# .env 文件\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n```json\n// config.json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_tracker.py --group test --days 15 --fetch-content\npython3 scripts/stock_tracker.py --stats\n```\n\n### 5. 配置定时任务\n\n告诉 agent 即可，例如：\n\n> \"帮我设置 stock-tracker 定时任务，每天早上8点运行一次，追踪【xx】板块的最新公告，有重要公告通知我\"\n\n或者手动配置：\n\n```bash\nopenclaw cron add \\\n  --name stock-tracker \\\n  --cron \"0 1 * * *\" \\\n  --message \"运行股票公告扫描：cd {{SKILL_DIR}} && bash run.sh mygroup 15 eastmoney\"\n```\n---\n\n## 公告过滤规则\n\n三级过滤体系自动跳过低价值公告：\n\n**第一级：正则过滤**（标题匹配，全文采集前）\n"},{"path":"README.md","content":"# Stock Tracker - 东方财富自选股公告追踪\n\n自动追踪东方财富自选股公告，三级过滤 + LLM 分类摘要 + Web 仪表盘。支持 Agent 定时推送和手动查看。\n\n> 通过 ClawHub 安装：`clawhub install stock-tracker`\n\n---\n\n## 快速开始\n\n### 1. 安装依赖\n\n```bash\ncd /path/to/stock-tracker\npip install requests pdfplumber flask\n```\n\n### 2. 配置 Cookie\n\n浏览器登录 [东方财富自选股](https://quote.eastmoney.com/zixuan/lite.html)，F12 → Console → `copy(document.cookie)`，粘贴到 `cookie.txt`。\n\n自动续签：`pip install playwright && playwright install chromium && python3 scripts/refresh_cookie.py`\n\n### 3. 配置 LLM（可选）\n\n```bash\necho \"LLM_API_KEY=sk-your-api-key\" > .env\n```\n\n`config.json` 中配置模型地址等参数（默认使用 DeepSeek V4 Flash）。未配置时自动禁用 LLM，仅使用正则过滤。\n\n### 4. 验证运行\n\n```bash\npython3 scripts/stock_tracker.py --group test --days 15 --fetch-content\npython3 scripts/stock_tracker.py --stats\n```\n\n---\n\n## 两种模式\n\n### Agent Run 模式\n\n告诉 agent：`\"每天8点提醒我有价值的自选股公告\"`\n\n或手动运行：\n\n```bash\nbash run.sh mygroup 15 eastmoney\n```\n\n输出 digest 到 stdout（agent 读取转发），无公告时输出 `DIGEST_EMPTY:...`。\n\n### Dashboard 模式\n\n告诉 agent：`\"帮我打开公告仪表盘，看看 mygroup 板块最近15天的情况\"`\n\n或手动运行：\n\n```bash\nbash dashboard.sh mygroup 15 eastmoney\n```\n\n自动执行：抓取 → 摘要 → 启动 Web 仪表盘（`http://localhost:5001`），支持 CSV 导出，Ctrl+C 停止。\n\n---\n\n## 常用命令\n\n```bash\npython3 scripts/stock_tracker.py --stats                 # 数据库统计\npython3 scripts/stock_tracker.py --list                  # 最近公告\npython3 scripts/stock_tracker.py --list --stock 600519   # 指定股票\npython3 scripts/stock_tracker.py --list-groups           # 可用分组\npython3 scripts/stock_tracker.py --clean                 # 清洗正文\n```\n\n---\n\n## 文件结构\n\n```\nstock-tracker/\n  SKILL.md              # Agent 入口文档\n  README.md             # 本文档\n  config.json           # LLM 配置\n  cookie.txt            # 东方财富 Cookie\n  .env                  # LLM API Key\n  run.sh                # Agent Run 模式\n  dashboard.sh          # Dashboard 模式\n  scripts/              # Python 脚本\n    stock_tracker.py    # 主入口\n    eastmoney_api.py    # 东方财富 API\n    cninfo_api.py       # 巨潮资讯 API\n    ann_detail.py       # 公告详情获取\n    llm_judge.py        # LLM 标题判断\n    text_cleaner.py     # 正文清洗\n    daily_summary.py    # 摘要生成\n    db.py               # 数据库操作\n    dashboard.py        # Flask 仪表盘\n    refresh_cookie.py   # Cookie 自动续签\n    dependencies.py     # 依赖管理\n    error_handler.py    # 错误处理\n    config_manager.py   # 配置管理\n  tests/                # 单元测试\n  logs/                 # 运行日志\n  .stock-tracker-state/ # SQLite 数据库\n  references/           # 技术参考文档\n```\n\n---\n\n## 配置\n\n### config.json\n\n```json\n{\n  \"llm\": {\n    \"enabled\": true,\n    \"base_url\": \"https://opencode.ai/zen/go/v1\",\n    \"model\": \"deepseek-v4-flash\",\n    \"timeout\": 60,\n    \"retries\": 2\n  }\n}\n```\n\n### .env\n\n```\nLLM_API_KEY=sk-your-api-key-here\n```\n\n### 数据源\n\n默认全部走东方财富 API（A股+港股）。指定 `--source cninfo` 时 A 股走巨潮资讯网（PDF 更稳定），港股仍走东方财富。\n\n## 数据库字段\n\n| 字段 | 说明 |\n|------|------|\n| `ann_id` | 公告唯一标识 |\n| `stock_code` | 股票代码 |\n| `stock_name` | 股票名称 |\n| `title` | 公告标题 |\n| `ann_date` | 公告日期 |\n| `ann_type` | 公告类型 |\n| `url` | 公告链接 |\n| `art_code` | 文章编码 |\n| `full_text` | 原始正文 |\n| `clean_text` | 清洗后正文 |\n| `status` | 状态（valuable/fil"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn742cdrc476d1kbhpsvnrnznx81x4r7\",\n  \"slug\": \"stock-tracker\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1782868707859\n}"},{"path":"references/architecture.md","content":"# 系统架构\n\n## 数据流总览\n\n```\n东方财富/巨潮资讯\n      │\n      ▼\neastmoney_api.py / cninfo_api.py  ─── 获取公告列表\n      │\n      ▼\nstock_tracker.py ─── 主入口，协调各模块\n      │\n      ├─ Phase 1a: 正则跳过判断 (ann_detail.should_skip_content)\n      │     │  13 条 SKIP_CONTENT_PATTERNS，极速过滤\n      │     ▼\n      ├─ Phase 1b: LLM 标题价值判断 (llm_judge.py)\n      │     │  并发 20 workers，判断 valuable / non-valuable\n      │     ▼\n      ├─ Phase 2: 并发下载正文 (ann_detail.fetch_announcement_content)\n      │     │  优先 API，回退 PDF 提取，max_workers=5\n      │     ▼\n      ├─ Phase 3: 顺序清洗 (text_cleaner.py) + 分批保存到 DB\n      │     ▼\n      ├─ daily_summary.py ─── 为有价值公告生成 LLM 摘要\n      │     │  BATCH_SIZE=1, workers=20, 定期报告跳过 LLM\n      │     ▼\n      └─ dashboard.py ─── Flask Web 仪表盘，lazy loading\n```\n\n## 模块分解\n\n### stock_tracker.py（主入口）\n\n**CLI 参数：**\n\n| 参数 | 用途 |\n|------|------|\n| `--force` | 强制重新抓取所有公告（覆盖已见检查） |\n| `--days N` | 抓取最近 N 天公告 |\n| `--dry-run` | 试运行，不更新数据库 |\n| `--group` | 只追踪指定分组（模糊匹配） |\n| `--list-groups` | 列出所有可用分组 |\n| `--stats` | 查看数据库统计 |\n| `--list` | 列出历史公告 |\n| `--fetch-content` | 补抓缺少全文的公告正文 |\n| `--clean` | 清洗已获取的公告正文 |\n| `--prune` | 清理无正文的空记录 |\n| `--source` | eastmoney（默认）或 cninfo |\n\n### 新增模块（2026-06-14）\n\n**dependencies.py（依赖管理）**：\n- 统一管理模块间依赖\n- 使用延迟导入避免循环依赖\n- 提供 `get_db()`、`get_llm_judge()` 等函数\n\n**error_handler.py（错误处理）**：\n- 定义异常类层次结构\n- `StockTrackerError` 基类\n- `DatabaseError`、`APIError`、`ConfigError`、`CookieError`、`DataError` 子类\n- `handle_error()` 统一错误处理函数\n\n**config_manager.py（配置管理）**：\n- 使用 `dataclass` 定义类型安全的配置类\n- `LLMConfig`、`NotifyConfig`、`AppConfig` 数据类\n- `ConfigManager` 类统一管理配置加载、保存和 API Key\n\n**执行流程：**\n1. 解析参数 → 执行子命令（stats/list/clean/prune/fetch-content）或完整运行\n2. 完整运行：获取自选股列表 → 获取公告列表 → 过滤已见 → 获取全文 → 入库\n\n### eastmoney_api.py（东方财富数据获取）\n\n**自选股获取（3 级回退）：**\n1. **myfavor API** `https://myfavor.eastmoney.com/v4/webouter` — 支持分组过滤\n2. **Cookie 解析** — 从 `selfSelectStocks` 字段正则提取\n3. **config.json** — 手动配置硬编码列表\n\n**公告 API：**\n- `https://np-anotice-stock.eastmoney.com/api/security/ann`\n- `ann_type=A` 为 A 股，`ann_type=H` 为港股\n- 参数：`stock_list={market},{code}`\n\n**Market 字段值：**\n\n| 值 | 市场 | 标签 |\n|----|------|------|\n| 0 | 深圳 | SZ |\n| 1 | 上海 | SH |\n| 100 | 美股 | US |\n| 104 | 期货 | FUT |\n| 116 | 港股 | HK |\n| 119 | 外汇 | FX |\n| 124 | 港股通 | HKI |\n| 134 | 港股通(深) | HKF |\n| 251 | 其他 | OTHER |\n\n### cninfo_api.py（巨潮资讯网数据获取）\n\n**API 端点：**\n- 列表：`POST https://www.cninfo.com.cn/new/hisAnnouncement/query`\n- PDF 基址：`https://static.cninfo.com.cn/{adjunctUrl}`\n\n**请求参数：**\n- `searchkey`: 股票代码\n- `seDate`: 日期范围 `YYYY-MM-DD~YYYY-MM-DD`\n- `pageNum` / `pageSize`: 分页\n- `column`: szse\n\n### ann_detail.py（公告正文获取）\n\n**内容获取优先级：**\n1. **内容 API** `https://np-cnotice-stock.eastmoney.com/api/content/ann`（需东方财富网络环境）\n2. **PDF 下载 + 文本提取** `https://pdf.dfcfw.com/pdf/H2_{art_code}_1.pdf`\n3. 外部传入 `pdf_url_override`（巨潮 PDF 链接）：直接下载 PDF\n\n**跳过全文采集的标题模式（13 条）：**\n1. 公司章程\n2. 信用评级 / 跟踪评级\n3. 募集说明书\n4. 付息公告\n5. 上市公告 / 摘牌\n6. 发行结果公告 / 票面利率 / 簿记建档 / 更名公告 / 发行完毕\n7. 董事会报告\n8. 法律意见书\n9. 股东会决议公告 / 股东会表决结果 / 投票表决结果\n10. 薪酬\n11. 周年会通告\n12. 担保额度\n13. 召开情况\n\n**TOC 提取：**\n超长文档（通函、海外市场公告、股"},{"path":"references/classification.md","content":"# 公告分类体系\n\n## A股 8大类64小类\n\n| # | 大类 | 公告类型 | 提取重点 | Prompt 行为 |\n|---|------|---------|---------|------------|\n| 1 | 招股类 | 申报稿 | 募集资金用途、财务数据概览 | LLM 判断 |\n| 2 | 招股类 | 申报反馈 | 监管问询要点、回复内容 | LLM 判断 |\n| 3 | 招股类 | 招股说明书 | 发行规模、定价、募集资金投向 | LLM 判断 |\n| 4 | 招股类 | 发行定价 | 发行价格、市盈率、发行日期 | LLM 判断 |\n| 5 | 招股类 | 发行结果 | 实际发行股数、募集资金总额 | LLM 判断 |\n| 6 | 招股类 | 上市公告书 | 上市日期、交易安排 | LLM 判断 |\n| 7 | 财务报告类 | 业绩预告 | 预计营收/利润数字、同比增减幅度、业绩变动原因 | 跳过 LLM，固定摘要 |\n| 8 | 财务报告类 | 业绩快报 | 实际营收/利润数字、同比增减、与预告差异 | 跳过 LLM，固定摘要 |\n| 9 | 财务报告类 | 季度报告 | 季度财务数据、经营概况 | 跳过 LLM，固定摘要 |\n| 10 | 财务报告类 | 半年报告 | 半年度财务数据、经营讨论 | 跳过 LLM，固定摘要 |\n| 11 | 财务报告类 | 年度报告 | 年度财务数据、业务回顾、未来展望 | 跳过 LLM，固定摘要 |\n| 12 | 财务报告类 | 补充更正 | 更正内容、更正前后对比 | 跳过 LLM，固定摘要 |\n| 13 | 重大事项类 | 利润分配 | 每股分红金额、分红总额、股权登记日、除权除息日 | LLM 判断 |\n| 14 | 重大事项类 | 股份增减持 | 增减持主体、变动股数、变动后持股比例、原因及后续计划 | LLM 判断 |\n| 15 | 重大事项类 | 资金投向 | 投资项目、投资金额、预期收益、资金来源、实施周期 | LLM 判断 |\n| 16 | 重大事项类 | 资产重组 | 重组标的、交易金额、交易对手、重组方式、标的公司主营业务及行业、重组后对业务布局的影响 | LLM 判断 |\n| 17 | 重大事项类 | 收购兼并 | 交易标的、交易金额、交易对手、收购目的、标的公司主营业务及行业、标的估值及溢价率 | LLM 判断 |\n| 18 | 重大事项类 | 重大合同 | 合同金额、合同对手方、合同期限、合同内容、付款方式及条件、合同履行对营收/利润的影响、违约风险 | LLM 判断 |\n| 19 | 重大事项类 | 股权激励 | 授予/行权价格、激励对象人数及构成、限售期及解锁条件、业绩考核目标、总量占股本比例 | LLM 判断 |\n| 20 | 重大事项类 | 关联交易 | 交易对方（关联方关系）、交易金额、定价依据及公允性、交易目的及必要性、对上市公司独立性的影响 | LLM 判断 |\n| 21 | 重大事项类 | 借贷担保 | 担保金额、担保对象、被担保方财务状况、担保期限、反担保措施 | LLM 判断（大额→有价值，常规→无价值） |\n| 22 | 重大事项类 | 委托理财 | 理财金额、产品类型、预期收益率、期限、风险等级 | LLM 判断 |\n| 23 | 重大事项类 | 违纪违规 | 违规主体、违规事项、处罚措施、整改方案 | LLM 判断 |\n| 24 | 重大事项类 | 政策影响 | 政策内容、对公司业务的具体影响、公司应对措施 | LLM 判断 |\n| 25 | 重大事项类 | 人事变动 | 具体人名、原职务、新职务、变动原因 | LLM 判断 |\n| 26 | 交易提示类 | 停牌提示 | 停牌原因、预计停牌时间、复牌条件 | 自动有价值 |\n| 27 | 交易提示类 | 交易异动 | 异动类型（涨停/跌停/换手率）、异动原因、是否需核查 | 自动有价值 |\n| 28 | 交易提示类 | 澄清公告 | 澄清事项、市场传闻内容、事实情况、对股价影响 | 自动有价值 |\n| 29 | 交易提示类 | 风险提示 | 风险类型、风险内容、可能影响、应对措施 | 自动有价值 |\n| 30 | 交易提示类 | 特别处理 | ST/ST\\* 原因、风险警示内容、可能后果 | 自动有价值 |\n| 31 | 交易提示类 | 终止上市 | 终止原因、退市整理期、投资者保护措施 | 自动有价值 |\n| 32 | 交易提示类 | 恢复上市 | 恢复上市原因、复牌后交易安排、公司当前经营状况 | 自动有价值 |\n| 33 | 交易提示类 | 暂停上市 | 暂停上市原因、后续恢复条件、投资者风险提示 | 自动有价值 |\n| 34 | 配股类 | 配股预案 | 配股比例（几配几）、配股价格、募集资金总额、配股目的及资金用途、对每股收益的摊薄影响 | LLM 判断 |\n| 35 | 配股类 | 配股说明书 | 配股比例、配股价格、募集资金用途、配股条件、对现有股东的影响 | LLM 判断 |\n| 36 | 配股类 | 配股获准 | 获准日期、配股方案关键条款、后续时间安排 | LLM 判断 |\n| 37 | 配股类 | 配股发行 | 实际发行股数、实际募集资金、发行结果、上市日期 | LLM 判断 |\n| 38 | 配股类 | 配股上市 | 上市日期、配股价、对股价的影响 | LLM 判断 |\n| 39 | 增发类 | 增发预案 | 增发原因及资金需求、增发股数及价格、募集资金总额及投向、发行对象（公开/定向）、对每股收益的摊薄影响 | LLM 判断 |\n| 40 | 增发类 | 增发说明书 | 增发方案详情、募集资金用途、发行条件、风险因素 | LLM 判断 |\n| 41 | 增发类 | 增发获准 | 获准日期、方案关键条款、后续安排 | LLM 判断 |\n| 42 | 增发类 | 增发发行 | 实际发行股数、实际募集资金、发行价格、发行结果 | LLM 判断 |\n| 43 | 增发类 | 增发上市 | 上市日期、对股价的影响 | LLM 判断 |\n| 44 | 股权股本类 | 权益变动 | 变动主体、变动前持股数量及比例、变动股数、变动后持股比例、变动方式（二级市场/协议转让等） | LLM 判断 |\n| 45 | 股权股本类 | 股本变动 | 变动原因、变动前后股本结构、新增股份性质 | LLM 判断 |\n| 46 | 股权股本类 | 质押冻结 | 质押/冻结主体、质押股数、占持股比例、质权人、质押融资用途、平仓风险 | LLM 判断 |\n| 47 | 股权股本类 | 质押式回购 | 回购主体、回购金额、质押标的、期限、到期安排 | LLM 判断 |\n| 48 | 股权股本类 | 回购股权 | 累计回购金额、回购股数、占总股本比例、回购计划总额及完成进度 | LLM 判断 |\n| 49 | 股权股本类 | 约定购回 | 购回主体、购回金额、标的证券、期限、购回价格 | LLM 判断 |\n| 50 | 股权股本类 | 股权分置改革 | 改革方案概要、对价安排、流通股与非流通股比例变化 | LLM 判断 |\n| 51 |"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。 Skill: stock-tracker Owner: 54lynnn Summary: 东方财富自选股公告追踪。三级过滤 + LLM分类摘要 + Web仪表盘，支持 agent 定时推送。 Tags: latest:2.2.0 Version history: v2.2.0 | 2026-07-01T01:18:27.859Z | user v2.2.0: 新增过滤规则（解除质押、公司理财、可转债审计报告、质押展期）+ config_manager/dependencies/error_handler重构 + 测试用例 v2.1.0 | 2026-06-13T07:51:40.924Z | user 新增公告过滤规则文档，记录6轮正则过滤规则演进 v2.0.10 | 2026-06-07T13:28:44.548Z | user fix: use absolute file:/// paths for references l","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":874,"uniquenessScore":59,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T01:15:25.001Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-12T01:15:25.001Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T13:16:36.692Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}