trading: 日内T/长桥/六合彩文档与脚本 + quant-factor-mining 新目录

This commit is contained in:
2026-09-25 01:25:38 +08:00
parent 734b168082
commit 3f17a4eb1f
23 changed files with 1821 additions and 376 deletions
+294 -234
View File
@@ -1,64 +1,104 @@
---
name: lottery-hk
description: "香港六合开奖抓取与分析 (user B1EF5044 偏好, 文化娱乐参考不构成投注建议)。数据源: sol.2344a.cc (2026-07-29 替代 sol.0051.cc) + btc.tktk.app/data/v_xg.json + tktk.tktk4.cc。SQLite 存数据。**触发规则 (硬性)**: 用户问'特码'/'买码'/'今晚开什么'/'下期开什么'/'分析'/'玄学'/'六合分析' → **必须调 `python3 scripts/lottery_特码.py [期号]`** (纯挂牌 + 玄机诗 + 红字, 输出 Top 5 特码 + 重点金额分配)。**禁止**: (1) 跑 `lottery.py analyze` (5 期数据无意义, user 已确认); (2) 编造 (Data.1-7 实际是 Qi 期真开彩, 不是 Qi-2 期); (3) agent 自己写 4 框架 (河洛/梅花/玄空/奇门) 公式 (reference 没推演方法); (4) 编 4 框架数据。时区: 默认北京时间 UTC+8, 挂牌日=开彩日 (sol.2344a.cc 时间戳)。**v_xg.json 字段 (2026-08-04 修正)**: **Qi = 最新已开期号** (刚开), Nq=再下次, **Week/Day = Nq 期开彩日** (不是 Qi 期! 例 Qi=083 + Week=周二 Day=04 → 083 期是 8/1 周六, 084 期是 8/4 周二), **Data.1-7 = Qi 期真开彩号码** (2026-08-04 marksix6.com 验证) — Qi=083 + Data=[37,7,16,1,32,22,23] 跟 marksix6.com 083 期真开一致。Nq = 未开下期号, Week/Day = Nq 期开彩日 (北京时间)。推送格式: 横向 markdown 表格 (4-8 列, QQ 可左右滑动), 必须标 (北京时间), 不写刚开/最新, 不加 A/B/C 简单回答模板 (agent 自加, 用户不要)。用户问'从哪取'只答来源一行不展开。4 框架脚本: scripts/lottery_4frame.py (v_xg.json + 综合挂牌 + 六信红字 + 玄机诗 4 步自动跑)。详见 references/v_xg-data-qi-pitfall.md。"
version: 1.2.7
tags: [lottery, hk, 六合彩, analysis, sol-2344a, qdrant-memory]
description: "香港六合开奖抓取与分析 (user B1EF5044 偏好, 文化娱乐参考不构成投注建议)。数据源: sol.2344a.cc + btc.tktk.app/data/v_xg.json + marksix6.com (真开彩验证, browser 渲染)。**v_xg.json `Data.1-7` = Qi 期真开彩 (2026-08-04 marksix6.com 验证), 是 cron no_agent 模式下唯一可用的真开彩源**。**触发规则 (硬性)**: 用户问'特码'/'买码'/'今晚开什么'/'下期开什么'/'分析'/'玄学'/'六合分析' → **必须调 `python3 scripts/lottery_特码.py [期号]`** (纯挂牌 + 玄机诗 + 红字, 输出 Top 5 特码 + 重点金额分配)。**禁止**: (1) 跑 `lottery.py analyze` (5 期数据没意义, user 已确认); (2) 编造 (Data.1-7 = Qi 期真开彩号码); (3) agent 自己写 4 框架 (河洛/梅花/玄空/奇门) 公式; (4) 编 4 框架数据; (5) 访问 hkjc.com (被所有外部 browser agent 拦, 详见 references/hkjc-com-blocked.md); (6) 用 Qi 跑特码分析 (用户问的是 Nq 未开下期, 2026-08-13 怒纠); (7) 候选表'来源'列用硬编码字典 (必须用 src_tracker 动态抓取, 2026-08-13 修过)。**v_xg.json 字段 (2026-08-04 第 4 次修正)**: Qi=最新已开期号, Nq=未开下期, Week/Day=Nq 期开彩日, Data.1-7=Qi 期真开彩号码。时区: 默认北京时间 UTC+8, 挂牌日=开彩日。推送格式: 横向 markdown 表格 (4-8 列, QQ 可左右滑动), 必须标 (北京时间), 不写刚开/最新, 不加 A/B/C 简单回答模板。用户问'从哪取'只答来源一行不展开。详见 references/v_xg-data-qi-pitfall.md + references/cron-draw-result-flow.md。"
version: 1.5.0
# 2026-08-30 v1.5.0: hot-data cron 加"上期开奖回顾"段 (在分析前推 Qi 期真开 + Top 5 + 特码命中判定); 用户硬偏好 #12 = 只看特码命中, 不要平码命中
# 2026-08-20 v1.4.0: 候选 <4 兜底实装 (挂牌抓 3→8 + 火烧/六肖解码 + format_te_ma_result 显式补 5); cron wrapper Qi→Nq 二次修正; verify_lottery schedule 14:30→22:30 (开彩后 1h)
tags: [lottery, hk, 六合彩, analysis, sol-2344a, marksix6, qdrant-memory, v_xg-json, cron-no-agent]
---
# 香港六合开奖分析
**⏰ 时区规则(硬规则)**: 所有时间默认 **北京时间(UTC+8)**。v_xg.json 的 `Qi`=最新已开, `Nq`=未开下期, `Week`/`Day`/`Year`/`Moon` 是 **Nq 期(未开下期)** 的开彩日。**挂牌日 ≈ 开彩日 (sol.2344a.cc 帖子时间戳 = 实际开奖日, 通常同天或 1-3 天前)**。任何"周几"都指北京时间;写 QQ 推送必须带"北京时间"字样或 +8 时区。
**⚠️ 历史版本错误** (已修正): 早期 SKILL.md 写"挂牌提前 2-3 天"是错的。**用户 2026-07-30 反复纠正后确认: 挂牌日 = 开彩日, 同一天**。
**⏰ 时区规则(硬规则)**: 所有时间默认 **北京时间(UTC+8)**。v_xg.json 的 `Qi`=最新已开, `Nq`=未开下期, `Week`/`Day` 是 **Nq 期(未开下期)** 的开彩日。**挂牌日 = 开彩日 (sol.2344a.cc 帖子时间戳 = 实际开奖日, 同天)**。
**🚨 用户硬偏好 (每次回复前必读, 违反必被纠正)**:
1. **直接说从哪取的, 不要分析/解释** — 答"082 是周几" → 一行答 "sol.2344a.cc 082 期挂牌 07-30 = 周四开彩 (北京时间 21:30)", **不展开** "为什么不是周三" / "Qi 字段语义" / 长篇对比。
1. **直接说从哪取的, 不要分析/解释** — 答"082 是周几" → 一行答 "sol.2344a.cc 082 期挂牌 07-30 = 周四开彩 (北京时间 21:30)", **不展开** "为什么不是周三"。
2. **错了立刻重做, 不要"分析"或"等回话"** — 用户原话: "知道错了, 还要来确认, 你直接跑不行吗"。立刻跑正确的事。
3. **不要在回复结尾加 "A/B/C 简单回答" 模板** — 用户问 "这是什么技能输出的?" 才意识到是 agent 自加的模板, **没有任何 skill 输出这个**。直接回答用户问题。
4. **看到"4 框架"不要自己造公式** — "4 框架" 指 `references/analysis-example-073/074/075.md` 里 3 步推演流程 (v_xg.json + 挂牌 + 红字), **不是** agent 自己写 河洛/梅花/玄空/奇门 公式。**必跑** `python3 scripts/lottery_4frame.py`。
5. **"特码分析" 必跑真脚本** — 看到 "特码"/"买码"/"今晚开什么" → **必跑** `python3 scripts/lottery_特码.py [期号]`, **不混** Qi 期已开号码。
5. **"特码分析" 必跑真脚本** — 看到 "特码"/"买码"/"今晚开什么" → **必跑** `python3 scripts/lottery_特码.py [期号]`。
6. **不要在回复里算时间** — agent 默认时间不准 (system prompt 时间可能旧), 要实时用 `date` 命令确认北京时间。
更多偏好见 `references/agent-workflow-pitfalls.md` (跨 skill 通用, 必读)。
7. **不要去 hkjc.com 找真开彩** (详见 references/hkjc-com-blocked.md): hkjc.com 拦所有外部 browser agent (Browserbase / bet.hkjc.com / racing.hkjc.com / fonts.googleapis.com 卡 30s+ timeout)。**marksix6.com 只在 agent 模式用 browser**; **no_agent 模式用 v_xg.json `Data.1-7`** (curl + UA)。
8. **分析推送用 Nq (未开下期), 不是 Qi (已开)** — 用户问"特码"是问"下期买什么", 跑 Qi 期等于把历史当预测。2026-08-13 用户反馈"你这前面写的期数是已开的,分析的数据也是已开的?我只要你分析未开的啊"。**硬规则**: `lottery_特码.py` 和 `lottery_特码_cron.sh` runtime 路径全用 `v_xg.json['Nq']`, 不要 Qi。详见 `references/cron-default-qi-vs-nq-pitfall.md`。
9. **候选表「来源」列必须用真实抓取源, 禁止硬编码字典** — 2026-08-13 反馈 "分析资料来源怎么没了?", 根因 = `format_te_ma_result` 用了 8 个号码的硬编码 `src_map` 字典, 其他号码 fallback "其他挂牌提示" 抹掉了真实抓取源。**修法**: `get_te_ma_candidates` 内部 `src_tracker = defaultdict(list)` 同步记录, `format_te_ma_result` 优先用 `src_tracker`, 硬编码字典删除。详见 `references/candidate-source-tracker-pitfall.md`。
10. **📌 规则/陷阱要写到「一定会被读」的位置** — 用户原话 "你写到一个一定能生效的地方, 不要又写到一个可读可不读的地方了" (2026-08-13)。**可读可不读的位置 = 没用** (如 `references/*.md` 单文件)。
- **最生效的位置 (按优先级)**:
1. **SKILL.md 顶部「硬规则」/「硬偏好」区** (每次加载必读)
2. **脚本顶部 docstring** (改这个脚本的人必读)
3. **CLI main 入口紧贴代码的注释** (改默认期号/参数必读)
4. **cron wrapper 顶部 4 行注释** (改 cron 必读)
5. `references/*.md` 单文件 — 只在以上 4 处都写完后, **作为详细案例** 补充, 不作为唯一落点
- 写完硬规则后必须**验证它在 runtime 路径里生效** (跑一遍脚本看输出)
11. **开奖后流程 (2026-08-13)**: `draws` 表入库**只有手填命令** `python3 scripts/lottery_特码.py add <period> <special> <n1..n6>` 和 **verify_lottery.sh 自动调 add** (v_xg.json 拿得到时), 没有从 marksix6.com 抓真开的独立脚本。详见 `references/draws-table-manual-add-pitfall.md` + `references/cron-draw-result-flow.md`。
12. **🎯 命中判定只看特码, 不要平码命中 (2026-08-30)**: 用户原话"只要特码命中的"。lottery_特码_cron.sh (hot-data 推送) 加的"上期开奖回顾"段**只输出特码命中 ✅/❌**, 不输出"平码命中 N1/N2", 不要自行扩展。这是用户**显式偏好**, 不需要他再说一次。verify_lottery.sh 仍可输出平码命中 (那是22:30 核验报告, 性质不同)。
**⏰ 沟通风格**: 用户要"直接说怎么取的,不要分析/解释"。回答"081 是周几"时,直接说"来源是 v_xg.json Week=周四" — 不分析"为什么不是周二"。
**🚨 硬规则 (每次推送前自检, 2026-08-04 marksix6.com 验证)**:
1. **时区**: 所有时间默认 **北京时间 (UTC+8)**, 必须标"(北京时间)"后缀
2. **挂牌日 = 开彩日** (硬规则): sol.2344a.cc 挂牌帖时间戳 = 实际开奖日,**同天**。旧描述"挂牌提前 2-3 天"是错的。
3. **v_xg.json 字段语义 (2026-08-04 第 4 次修正, marksix6.com 验证)**:
- **`Qi` = 最新已开期号** (刚开)
- **`Nq` = 未开下期期号** (下一个)
- **`Week`/`Day`/`Year`/`Moon` = Nq 期开彩日** (北京时间)
- **`Data.1-7` = Qi 期真开彩号码** (7 个 + 5 行字段 sx/nim/color/style/number)
- 取 Qi 期开彩日: Nq 期开彩日 - 1 个开彩日 (周二/四/六规律), 或查 sol.2344a.cc 挂牌帖
4. **🔥 cron 自动期号必须是 `Nq` (未开下期), 不是 `Qi` (已开)**: `lottery_特码_cron.sh` + `lottery_特码.py` 默认期号 = `v_xg.json Nq`。**用 Qi = 已开期, 分析完全错位** (2026-08-13 修过, 写死错误: Qi→Nq, fallback '082'→'088')。
5. **推送格式**: 不写"刚开"/"最新" — 用具体期号+明确日期
6. **沟通**: 用户要直接说数据来源,不要长篇分析
7. **4 框架分析**: **直接调 `python3 scripts/lottery_4frame.py`**(4 步流程: v_xg.json + 综合挂牌 + 六信红字 + 玄机诗),**不要 agent 自己造公式**。
8. **Cron 模式**: 用 `no_agent: true` + 真脚本 (`lottery_特码_cron.sh` / `verify_lottery.sh`), 不要 agent 模式 (会编)。
9. **来源映射必须动态 (2026-08-13 修过)**: 候选表的"来源"列必须用 `src_tracker` (实际抓取), **禁止**用硬编码字典 `src_map = {3:'...', 13:'...'}`。号码无 src 时才 fallback "其他挂牌提示"。
10. **📌 用户硬偏好 (2026-08-13 沉淀)**: 规则要写到"一定会被读"的位置 (见上面用户硬偏好 10)。
11. **开奖后流程 (2026-08-13)**: 见上面用户硬偏好 11。
12. **🎯 候选数 ≥ 4 (2026-08-20 实装)**: 见用户硬偏好 12。
12. **🎯 候选数 ≥ 4 (2026-08-20 实装)**: 用户原话"可以4-5个号合适"。**实装三改一起**: (a) `gua_links[:3] → [:8]` 多抓挂牌; (b) 火烧/六肖 解码本年生肖号 (火烧+2, 六肖/出肖各生肖+1); (c) `format_te_ma_result` 候选 <4 时 `top.append((n, 0))` 显式补到 5, 来源标"兜底占位 (挂牌稀疏)"。**已验证 Nq=091 期输出 8 候选, 重点分配 5 个 ¥15=5/4/3/2/1** (详见 `references/2026-08-20-candidate-sparsity-diagnosis.md`)。如果用户说"不要兜底" → 删 `if len(top) < 4` 块, 保留 (a)(b) 改进。
**📦 4 框架 (奇门/梅花/河洛/玄空) 的位置**:
- **真脚本**: `scripts/lottery_4frame.py` (4 步流程, 自动跑)
- **Reference**: `references/analysis-example-073/074/075.md` (073 真实推演示范: 3 步 v_xg+挂牌+红字)
- **不要**: agent 写 河洛/梅花/玄空/奇门 公式, reference 没推演方法, 拍脑袋推的没意义
- **Cron 直接调 `python3 lottery_4frame.py` 拿完整分析**, agent 不需要手动算
**⚠️ 4 框架 ≠ agent 自己造公式 (2026-07-30 实战)**: user 问"4 框架"时,**先 cat `references/analysis-example-073/074/075.md` 看实际推演流程**。073 example 是 3 步: (1) v_xg.json 五行统计 (2) 综合挂牌解读 (爆/出肖) (3) 六信红字。**不要**自己写 河洛洛书九宫 / 梅花起卦 / 玄空飞星盘 / 奇门遁甲 公式,这些 reference 没推演方法,agent 拍脑袋推的没意义。**改用 `lottery_4frame.py` 脚本跑。**
**5 期数据 (analyze 频率) 没意义**: `lottery.py analyze` 输出 5 期冷热号,数据量太少,user 已明确说"不要跑频率,没有意义"。`analyze` 只用作辅助核对,不是主要分析方法。
从天空彩票抓取香港六合彩开奖结果,提供数据分析。**数据存SQLite,不存图片。**
从天空彩票抓取香港六合开奖结果,提供数据分析。**数据存SQLite,不存图片。**
## 数据源
### 主站
- 主站: https://tktk.tktk4.cc/ww.htm(首页,含iframe开奖倒计时)
- **资料站**: https://sol.2344a.cc/(所有挂牌/解牌/玄机资料实际托管在此, 2026-07-29 已迁移)
- 综合挂牌: https://sol.2344a.cc/zongheguapai/ ← 首选挂牌数据源
- 六信红字: https://sol.2344a.cc/lxhz/
- 梅花诗/玄机: https://sol.2344a.cc/xuanjiziliao/
- 解牌: https://sol.2344a.cc/jiepai/
- 平碼平肖: https://sol.2344a.cc/pingxiaopingma/
- **ai.c8c.cc** (NOT sol.2344a.cc 替代): 六合站, 与 sol 系列无关
### 当前开奖JSON API
- **v_xg.json**: `https://btc.tktk.app/data/v_xg.json`(直接返回JSON,无需浏览器)
- **Qi 字段语义 (pitfall)**: Qi = **最新已开**期号 (刚开), Nq = 未开下期。**真开奖**要从 sol.2344a.cc 挂牌历史 / 数据库历史查
- **sol.2344a.cc 历史API**: `/e/api/api.php?get=sixlist&year=YYYY` 仍返回空 (历史AJAX失效)
### 主站 (挂牌/资料)
- **资料站**: `https://sol.2344a.cc/` (2026-07-29 迁移自 sol.0051.cc)
- 综合挂牌: `https://sol.2344a.cc/zongheguapai/` ← 首选挂牌数据源
- 六信红字: `https://sol.2344a.cc/lxhz/`
- 梅花诗/玄机: `https://sol.2344a.cc/xuanjiziliao/`
- 解牌: `https://sol.2344a.cc/jiepai/`
- 平碼平肖: `https://sol.2344a.cc/pingxiaopingma/`
### 真开彩验证源 (按 cron 模式分流, 2026-08-13)
| 源 | 模式 | 端点 | 备注 |
|---|---|---|---|
| **v_xg.json `Data.1-7`** | **no_agent + script (cron 主用)** | `curl -A "Mozilla/5.0" v_xg.json` | Qi 期真开彩, 跟 marksix6.com 验证一致; **必须带 UA, 裸 curl 返 403** |
| **marksix6.com** | **agent 模式 (browser 渲染)** | `browser_navigate` + `browser_snapshot` | Vue SSR 包装页, curl 拿不到; no_agent 拿不到 |
| **hkjc.com** | ❌ 拦所有外部 browser agent | `bet.hkjc.com/ch/marksix/results` | 全堵, 详见 `references/hkjc-com-blocked.md` |
**关键决策 (2026-08-13)**: cron 核验脚本 (`verify_lottery.sh`) **不再依赖 marksix6.com browser** (no_agent 拿不到), **统一走 v_xg.json curl + UA**。这是 no_agent 模式下唯一可用的真开彩源。详见 `references/cron-draw-result-flow.md`。
### 当前开奖 JSON API
- **v_xg.json**: `https://btc.tktk.app/data/v_xg.json` (直接 JSON, 无需 browser)
- **字段语义 (2026-08-04 第 4 次修正, marksix6.com 验证)**:
- `Qi` = 最新已开期号 (刚开) — 例 Qi=083 = 083 期 8/1 周六已开
- `Nq` = 未开下期期号 — 例 Nq=084 = 084 期 8/4 周二未开
- `Week`/`Day` = Nq 期开彩日 — 例 Week=周二 Day=04 = 084 期 8/4 周二
- **`Data.1-7` = Qi 期真开彩号码** (Qi 期=刚开期, Data 显示 Qi 期真开, 不是 Qi-1 也不是 Qi-2)
- **sol.2344a.cc 历史 API**: `/e/api/api.php?get=sixlist&year=YYYY` 仍返回空
- ⚠️ **v_xg.json DB 故障**: 偶发 "Cann't connect to DB!" 200 OK 但返回空文本 (2026-08-02 出现, 2026-08-13 重现), 脚本必须校验返回是有效 JSON
### 开奖时间
- 每周二、四、六 21:30(北京时间)
- 49个号码,6个平码 + 1个特码
- 每周二、四、六 21:30 (北京时间)
- 49 个号码, 6 个平码 + 1 个特码
### tktk API架构(从public.js逆向)
tktk Vue.js应用的数据源URL模式: `https://btc.tktk.app/data/v_{cod}.json?{timestamp}`
### tktk API 架构 (从 public.js 逆向)
URL 模式: `https://btc.tktk.app/data/v_{cod}.json?{timestamp}`
| cod | 彩种 | 说明 |
|-----|------|------|
@@ -69,263 +109,283 @@ tktk Vue.js应用的数据源URL模式: `https://btc.tktk.app/data/v_{cod}.json?
| xjp | 新加坡六合 | 每天 18:35-18:55 |
| fckl8 | 快乐8 | 每天 21:25-21:40 |
JSON返回格式:
```json
{
"Data": {
"1": {"nim":"金","number":"34","color":"红","style":"red","sx":"鸡"},
"2": {...}, ... "7": {...}
},
"Time": "21点30分", "Day": "05", "Moon": "07", "Year": 2026,
"Qi": "071", "Nq": "072", "Week": "周日", "Auto": false
}
```
- `Data.1`-`Data.6`: 平码,`Data.7`: 特码
- `Qi`: **最新已开期号**(刚开), `Nq`: **未开下期期号**(下一个)
- `nim`: 五行,`sx`: 生肖,`color`: 波色(红/蓝/绿)
### ⚠️ 重要: v_xg.json 字段语义陷阱
### ⚠️ 重要: v_xg.json 字段语义陷阱
- **正确语义 (2026-08-04 修正)**:
- **Qi = 最新已开期号** (刚开)
- **Nq = 未开下期期号** (下一个)
- **Week/Day = Nq 期开彩日** (北京时间)
- **Data.1-7 = Qi 期真开彩号码** (2026-08-04 marksix6.com 验证)
- **7 号码 (Data.1-7)**: Qi 期真开彩号码 (2026-08-04 marksix6.com 验证, Qi=083 时显示 083 期 7 个号码)
- **实战 (2026-07-29)**: cron 周二 14:00 (7/28 22:00) 跑, v_xg.json Qi=081 (= 081 期, 已开), 7 号码是 081 期 (Qi 期, 当时是 081 期真开)
- **取下下期 / 周几等时间**: 拿 v_xg.json 即可(Qi 是最新已开期号, Nq 是再下次, Week/Day 是 Nq 期开彩日, 不是 Qi 期)
- **取 Qi 期真开号码**: v_xg.json 不显示 Qi 期号, 需查 sol.2344a.cc/挂牌 或 lottery.db (Qi 期已开,但 v_xg.json 只显示 Qi 期号, 不显示号码)
- **2026-08-04 实战**: Qi=083 (083 期 8/1 周六已开), Nq=084 (084 期 8/4 周二未开), Week=周二 Day=04 (= 084 期开彩日), Data.1-7 = 081 期号码 (Qi-2)
- 详见 `references/v_xg-data-qi-pitfall.md`
- **取 Qi 期 (实际刚开)**: v_xg.json 不显示, 查 sol.2344a.cc/挂牌 或 lottery.db
- **2026-08-04 修正 (第 4 次)**: Data.1-7 = Qi 期真开彩号码 (不是 Qi-1, 也不是 Qi-2) — 详见 `references/v_xg-data-qi-pitfall.md`
### ⚠️ v_xg.json Data 字段格式 (重要)
- Data.1 - Data.6: 平码, Data.7: 特码
- 每个号码含 5 个字段: `nim`(五行) / `sx`(生肖) / `color`(波色) / `style`(red) / `number`(数字)
- **Data.1-7 = Qi 期真开彩** (Qi 期就是 Data 显示的期, 不是更早)
## 数据存储
**SQLite数据库**: `~/.hermes/trading/lottery.db`
**SQLite 数据库**: `~/.hermes/trading/lottery.db`
- `draws` 表: 开奖记录(期号、日期、6个号码+特码、生肖、五行、波色)
- `cold_data` 表: 冷数据(key-value,网页文本内容)
- `image_links` 表: 图片链接(类别、标题、URL、期号,不下载图片)
- **不存图片文件**,图片类只存URL链接
- `draws` 表: 开奖记录 (期号、日期、6 个号码+特码、生肖、五行、波色)
- `cold_data` 表: 冷数据 (key-value, 网页文本内容)
- `image_links` 表: 图片链接 (类别、标题、URL、期号, 不下载图片)
- **`analysis` 表 (2026-08-04 新增)**: 每次分析入库 (id, period, candidates JSON, budget, v_xg_qi/nq/week/day, actual_special, hit, created_at)
- 用 `lottery_特码.py add <period> <special> [n1 n2 n3 n4 n5 n6]` 手填真开
- `check_hits()` 自动对比 draws 表 actual_special → 更新 hit=1/0
- `list` CLI 看历史 (含 hit 状态)
- **不存图片文件**
## 脚本用法
```bash
SCRIPT=~/.hermes/skills/trading/lottery-hk/scripts/lottery.py
python3 $SCRIPT add <期号> <号码> # 手动添加
python3 $SCRIPT add_full <期号> <号码> <生肖> # 手动添加(带生肖)
python3 $SCRIPT history [期数] # 查看历史
python3 $SCRIPT analyze # 分析(频率/热号/冷号/生肖/五行/波色)
python3 $SCRIPT zodiac # 生肖号码对照表
python3 $SCRIPT next # 下期开奖时间
python3 $SCRIPT import_json <文件> # 导入JSON历史数据
python3 $SCRIPT save_cold <key> <content> # 保存冷数据
python3 $SCRIPT get_cold <key> # 读取冷数据
python3 $SCRIPT save_image <类别> <标题> <URL> [期号] # 保存图片链接
python3 $SCRIPT list_images [类别> # 列出图片链接
```
### 4 框架分析 (scripts/lottery_4frame.py)
**v_xg.json + 挂牌 + 红字 + 玄机诗 4 步自动跑**(不靠 agent 推公式):
```bash
python3 ~/.hermes/skills/trading/lottery-hk/scripts/lottery_4frame.py
```
输出: 4 步流程完整分析 (Qi 期号 + 挂牌详情 + 红字 + 5 条玄机诗)
**不要** agent 自己写 河洛/梅花/玄空/奇门 公式 (reference 没推演方法)。
### 特码分析 (scripts/lottery_特码.py)
**纯挂牌分析**(不混 Qi 期数据,不跑频率):
### lottery_特码.py (主要)
```bash
python3 ~/.hermes/skills/trading/lottery-hk/scripts/lottery_特码.py [期号]
# 跑分析, 动态取 Qi/Week/Day (不写死)
# 入库 SQLite analysis 表
# **默认无参 = 自动取 v_xg.json Nq 期 (未开下期, 要预测的那期)** — 2026-08-13 修正, 之前错取 Qi(已开)
python3 ~/.hermes/skills/trading/lottery-hk/scripts/lottery_特码.py add 083 23 37 7 16 1 32 22
# 手填真开: <period> <special> [n1..n6] → INSERT draws + reset 该 period analysis.actual_special + check_hits
python3 ~/.hermes/skills/trading/lottery-hk/scripts/lottery_特码.py list [N]
# 列出最近 N 条 analysis (id, period, Top 5, ¥, v_xg, 真开, hit, 时间)
python3 ~/.hermes/skills/trading/lottery-hk/scripts/lottery_特码.py hits
# 单独跑 check_hits
```
输出:
- Top 5 特码候选(按挂牌共识权重排序)
- 重点金额分配(默认 ¥15 = 5/4/3/2/1)
- 来源映射(挂牌链接 + 玄机诗)
### lottery_特码_cron.sh (cron wrapper, 11:30 北京, 2026-08-30 加"上期开奖回顾"段)
```bash
# 流程 (2026-08-30 加):
# 1. 取 v_xg.json Nq (本期未开下期, 用于分析) + Qi (上期已开, 用于回顾)
# 2. 从 lottery.db draws 表读 Qi 期开奖结果 (7 个号码), 缺失则 fallback v_xg.json
# 3. 从 ~/.hermes/cron/output/5bec1f60f77f/*.md 读 Qi 期 Top 5 候选 (用 🥇🥈🥉 锚定, 避免抓到日期/年份)
# 4. 输出"上期开奖回顾"段: 平码 + 特码 + 预测 Top 5 + **特码命中判定** ✅/❌ (只看特码, 不判平码)
# 5. 跑 lottery_特码.py Nq 跑本期分析
# 详细 docstring 见脚本顶部
```
**不要**:
- Qi 期已经开了, 资料来源是 sol.2344a.cc 挂牌 (挂牌日=开彩日) — v_xg.json Data.1-7 = Qi 期真开彩号码 (2026-08-04 marksix6.com 验证)
- 不要跑 `lottery.py analyze` (5 期数据无意义)
- 不要 agent 自己写 4 框架玄学公式 (河洛/梅花/玄空/奇门, reference 没推演方法)
### verify_lottery.sh (cron wrapper, 22:30 北京, 2026-08-13 新建)
```bash
# 核验当前期预测 vs 实际开奖, 记录命中率
# 流程: curl v_xg.json (UA + proxy fallback) → draws 表 fallback → 自动 add_draw → 找 Qi 期 .md → 输出报告
# 详见 references/cron-draw-result-flow.md
```
## 生肖映射(网站实际映射,已验证)
### lottery_4frame.py (4 框架玄学)
```bash
python3 ~/.hermes/skills/trading/lottery-hk/scripts/lottery_4frame.py
# 4 步流程: v_xg.json + 综合挂牌 + 六信红字 + 玄机诗
# 不要 agent 自己推公式 (reference 没方法)
```
网站的生肖表和标准12生肖轮转不同,用 mod 12 映射:
### lottery.py (辅助)
```bash
SCRIPT=~/.hermes/skills/trading/lottery-hk/scripts/lottery.py
python3 $SCRIPT add <期号> <号码> # 手动添加
python3 $SCRIPT history [期数] # 查看历史
python3 $SCRIPT zodiac # 生肖号码对照表
python3 $SCRIPT next # 下期开奖时间
# ⚠️ analyze 输出 5 期冷热号没意义, user 已确认
```
## 生肖映射 (网站实际映射, 已验证)
网站的生肖表和标准 12 生肖轮转不同, 用 mod 12 映射:
```
0=狗, 1=猪, 2=蛇, 3=马, 4=羊, 5=虎, 6=兔, 7=鼠, 8=牛, 9=猴, 10=鸡, 11=龙
```
071期验证: 34=鸡(34%12=10)✅, 46=鸡(46%12=10)✅, 17=虎(17%12=5)✅
071 期验证: 34=鸡(34%12=10)✅, 46=鸡(46%12=10)✅, 17=虎(17%12=5)✅
## 冷数据 vs 热数据
- **🧊 冷数据** (存 cold_data 表): 歷史、生肖表、日期、常識、全年、技巧、規律、策略
- **🔥 热数据** (每期更新): 開獎、掛牌、解牌、綜掛、平碼平肖、玄机资料、论坛高手推荐等
**🧊 冷数据**(存cold_data表,不常变):
- 歷史、生肖表、日期、常識、全年、技巧、規律、策略
**🔥 热数据**(每期更新):
- 開獎、掛牌、解牌、綜掛、平碼平肖、玄机资料、论坛高手推荐等
## 参考资料
## 8. 资金分配偏好 (跨 skill, 2026-07-30)
### 资金分配偏好 (2026-07-30)
**用户偏好**: 信号/分析结果要给**重点分配**, 不是平均分或全部平均。
- ❌ 错: "5 个候选号, 各买 1 元"
- ✅ 对: "5 个候选号, 按权重 5/4/3/2/1 元分配, 重点放在前 2-3 个"
- 默认预算: 信号类 (特码/跟单) 用 ¥15 = 5/4/3/2/1
- 排序时给 emoji (🥇🥈🥉) 让用户快速识别重点
- 排序时给 emoji (🥇🥈🥉)
适用范围: lottery 特码、币圈跟单、股票做 T 信号等任何"有预算上限的信号推送"。
## 注意事项
### 候选数 < 4 时诊断 (2026-08-20 v1.4.0 实装 fix)
**用户偏好**: 4-5 个候选号最合适, 2 个显得"没什么可买的"。
- 页面用Vue.js动态加载,非开奖时间段(21:14-21:40外)可能无数据
- 图库类页面(玄机图库、经典图库等)是图片,不抓取
- 网站有大量博彩广告,解析时需过滤
**实装的 fix (3 改动一起)**:
1. **挂牌页抓取放宽** (`lottery_特码.py::get_te_ma_candidates`): `gua_links = re.findall(...)[:3]` → `[:8]` — 多抓几页挂牌, 挂牌稀疏时也有足够数据源。
2. **火烧/六肖 解码本年生肖号**: 之前 `火烧` / `六肖` / `出肖` 字段**只记录不直接给号**, 现在加 `SX_TO_BENSHENG = {'鼠':23,'牛':22,..., '猪':12}` 解码本年生肖号, 火烧 +2, 六肖/出肖 每个生肖 +1。
3. **`format_te_ma_result` 兜底**: 候选数 < 4 时, `weights.most_common(8)` + 显式补足到 5 个, 占位的号权重=0, 来源标记 "兜底占位 (挂牌稀疏)"。**most_common 不返回权重 0 的号**, 这里用 `top.append((n, 0))` 显式扩展。
**配套 wrapper 修复**: `lottery_特码_cron.sh` 已二次修正 Qi→Nq (2026-08-20 之前 wrapper 改过 Qi→Nq 但又有人改回去了, 这次硬规则:`d['Nq']` + fallback `'088'`)。
**验证 (2026-08-20 跑 Nq=091 期)**: 输出 8 个候选, 重点分配 5 个 (¥15 = 5/4/3/2/1):
- 🥇 35 (权重 4, 另版挂 + 尾数 5尾+30)
- 🥈 2 (权重 2, 尾数 2尾本)
- 🥉 22 (权重 2, 尾数 +20 + 六肖 牛=22)
- 4 5 (权重 2, 尾数 5尾本)
- 5 14 (权重 2, 火烧 鸡=14 本年生肖)
**回退条件**: 如果用户明确说"不要兜底, 太离谱了" → 把 `format_te_ma_result` 里的 `if len(top) < 4` 块删除, 保留挂牌抓取放宽 + 火烧/六肖 解码。
详见 `references/2026-08-20-candidate-sparsity-diagnosis.md`。
## 注意事项
- **页面用 Vue.js 动态加载**, 非开奖时间段 (21:14-21:40 外) 可能无数据
- **图库类页面** (玄机图库、经典图库等) 是图片, 不抓取
- **网站有大量博彩广告**, 解析时需过滤
- **v_xg.json DB 故障**: sol.2344a.cc/btc.tktk.app 偶发 "Cann't connect to DB!" 200 OK 但返回空文本 (2026-08-02 出现), 脚本静默失败
### 📌 082 期实战案例 (2026-07-29 凌晨, 用户多次纠正)
**事件流**:
1. cron `668dcf3ec54d lottery-draw-result` 14:00 UTC (= 北京 22:00) 跑
2. v_xg.json `Qi=081 (081 期 7/28 周二已开), Nq=082 (082 期 7/30 周四未开), Week=周四, Day=30 (= Nq=082 期开彩日 = 7/30 周四)`
3. agent 推: "081 期 = 7/30 周四 21:30 开彩" — **错**(实际 081 = 7/28 周二)
4. agent 推: "082 期 = 8/1 周六 21:30" — **错**(实际 082 = 7/30 周四)
5. 用户反复纠正"081 时间错 / 不要分析 / 你直接跑不行吗"
6. **真相**: 挂牌日 = 开彩日 (sol.2344a.cc 挂牌 07-28 13:35 = 081 周二开彩)
3. agent 推: "081 期 = 7/30 周四 21:30 开彩" — **错** (实际 081 = 7/28 周二)
4. 用户反复纠正"081 时间错 / 不要分析 / 你直接跑不行吗"
5. **真相**: 挂牌日 = 开彩日 (sol.2344a.cc 挂牌 07-28 13:35 = 081 周二开彩)
**坑 1 (v_xg.json 字段)**: `Week`/`Day` 是 **Nq 期开彩日** (未开下期), 不是 Qi 期(已开)。
- Qi=081 → 081 周二开 (7/28 已开), Nq=082 → 082 周四开 (7/30 未开)
- Week=周四 → 081 错的,实际 Qi 081 期是周二,但 Week 字段是 **Nq=082 期开彩日** = 周四 — **这是 agent 多次误读的根本原因**
**坑 2 (挂牌日 vs 开彩日)**: sol.2344a.cc 挂牌帖的发布时间 ≠ 开彩日,实际是**同一天**(挂牌发出来当天就是开彩日)。**挂牌提前 2-3 天的旧描述是错的**。
**坑 2 (挂牌日 vs 开彩日)**: sol.2344a.cc 挂牌帖发布时间 = 开彩日,**同一天**。
**坑 3 (沟通)**: agent 答 "081 是周几" 时,反复用"为什么不是周二"的长篇分析 → 用户纠正"我说了,你不要分析,只说怎么取的就行了"。
**正确做法**:
- 用户问"081 是周几" → 一行答: "挂牌日 = 开彩日, sol.2344a.cc 07-28 13:35 挂牌 = 081 周二开彩 (北京时间 21:30)"
- **不展开** "为什么" / "不是周四" / "Qi 字段语义"
- 出错立刻认错,不要找理由
### 📌 084 期实战命中 (2026-08-04, 第 4 次修正验证)
- 8/4 14:03 北京 v_xg.json: Qi=083 (083 期 8/1 周六已开), Data.1-7=[37,7,16,1,32,22,23]
- marksix6.com browser 验证: 083 期 8/1 周六 21:32 真开彩 = 37/7/16/1/32/22 + **23** ✅
- **结论**: Data.1-7 = Qi 期真开彩号码, **不是 Qi-1 也不是 Qi-2** (第 4 次修正确认)
- 8/4 15:22 北京 v_xg.json: Qi=084 (084 期 8/4 周二已开), Data.1-7=[31,16,4,11,13,33,38]
- lottery_特码.py 跑 084 期: Top 1 = **38** (权重 10)
- 手填 084 期真开 special=38 → check_hits: analysis #4 hit=✓ **中奖!**
## 🚨 硬规则 (每次推送前自检)
### 📌 088 期 命中 (2026-08-13, 特码 23 中) + 089 期 特码 23 不在 Top 5
- 088 期 8/13 周四 21:30 开, 真开 special=23, 我推 Top 5 有 23 (#5, ¥1, 权重 1)
- ✅ 088 期中奖 ¥42 (42 倍赔率)
- 089 期 8/15 周六 21:30 开, 真开 special=14, 我推 Top 5 = 38/26/1/4/11
- ❌ 089 期未中 — 14 不在 Top 5 (Top 1=38 差太远)
- 结论: 特码分析命中率不稳定, 仅为文化娱乐参考
1. **时区**: 所有时间默认 **北京时间 (UTC+8)**, 必须标"(北京时间)"后缀
2. **挂牌日 = 开彩日** (硬规则): sol.2344a.cc 挂牌帖时间戳 = 实际开奖日,**同天**。旧描述"挂牌提前 2-3 天"是错的。
3. **v_xg.json 字段** (2026-08-04 第三次修正):
- `Qi` = **最新已开期号** (刚开)
- `Data.1-7` = **Qi 期真开彩号码** (2026-08-04 验证) — 7 个
- `Week`/`Day`/`Year`/`Moon` = **Nq 期开彩日** (北京时间, **不是 Qi 期!**)
- `Nq` = 再下期
- 取 Qi 期开彩日: Nq 期开彩日 - 1 个开彩日 (周二/四/六规律), 或查 sol.2344a.cc 挂牌帖
- 取 Qi 期真开号码: 查 sol.2344a.cc/挂牌 或 lottery.db (v_xg.json 不显示 Qi 期号码)
- **取 Qi 期真开号码**: 查 sol.2344a.cc/挂牌 或 lottery.db (v_xg.json 不显示 Qi 期)
4. **推送格式**: 不写"刚开"/"最新" — 用具体期号+明确日期
5. **沟通**: 用户要直接说数据来源,不要长篇分析
6. **4 框架分析**: **直接调 `python3 scripts/lottery_4frame.py`**(4 步流程: v_xg.json + 综合挂牌 + 六信红字 + 玄机诗),**不要 agent 自己造公式**(reference 073 流程是 3 步推演,不是 4 框架玄学公式)。`lottery.py` 不支持 4 框架。
### 📌 088 期 Cron Qi/Nq 错位 bug (2026-08-13, 用户怒纠)
- cron `5bec1f60f77f lottery-hot-data` 推送标题 "🎯 分析期号: 087 (v_xg.json Qi)"
- **实际 087 期 8/11 周二 已开**, 088 期 8/13 周四才是未开
- 用户原话: "你这前面写的期数是已开的, 分析的数据也是已开的? 我只要你分析未开的啊"
- **根因**: `lottery_特码_cron.sh` 第 9-19 行 `print(d['Qi'])` 取的已开期, `lottery_特码.py` 默认 fallback 也是 Qi
- **修法**: 两个文件同步 Qi → Nq, fallback `'082'` → `'088'` (因为 2026-08-13 当时 Nq=088)
- **验证**: 修完跑 cron wrapper → 输出 "🎯 分析期号: 088 (v_xg.json Nq 未开下期)", 用户确认正确
- **教训**: 用户问"特码"永远指"下期买什么", runtime 路径不能 fallback 到 Qi, **改这两个文件立刻 grep "Qi" 确认 runtime 路径全用 Nq**
## 🚨 用户偏好 (2026-07-30 实战反复纠正, 必读)
### 📌 088 期 lottery-draw-result cron 错配 bug (2026-08-13)
- cron `668dcf3ec54d lottery-draw-result` 配置: `script=laboratory_特码_cron.sh` (分析脚本), `schedule=0 14 * * 0,2,4` UTC (= 北京 22:00)
- **根因**: 22:00 北京开彩后 30 分钟 cron 跑**未开下期分析** (跟 11:30 那次重复), 完全不是"记录命中"
- **修法**: script → `verify_lottery.sh` (新建), schedule → `30 14 * * 0,2,4` UTC (北京 22:30, 等 v_xg.json 更新到 Qi), verify_lottery.sh 内部自动 v_xg.json curl + add_draw + check_hits
- **教训**: cron 配错脚本是"静默 bug" — 跑出来的输出看起来正常, 实际功能错位。**改 cron 必须同时检查 schedule 跟 script 是否匹配, 跑一次真输出验证**
1. **直接说从哪取的, 不要分析/解释** — 回答"081 是周几" → 一行答 "sol.2344a.cc 07-28 13:35 挂牌 = 081 周二开彩", **不展开** "为什么不是周四" / "Qi 字段语义" / 长篇对比
2. **出错立刻认错, 不要 "分析" 或 "等回话"** — 知道错了就立刻重做正确的事, 不要"让我再想想"/"让我检查一下"
3. **不要在回复结尾加 "A/B/C 简单回答" 选项** — 这是 agent 自己加的回复模板, **不是用户让的** (2026-07-30 user 指出 "这是什么技能输出的" — 实际没有这个 skill, 是我加的)
4. **看到 "4 框架" / "跑 X 框架" 关键词, 不要立刻自己推公式** — 先看 `references/analysis-example-073/074/075.md` 用 example 方法推演, 不是自己写
5. **挂错 / 跑错 / 答错不要重发分析, 立刻重做** — 用户说 "你直接跑不行吗" 意思是: **别说废话, 重做**
### 📌 095 期 上期开奖回顾 实跑 (2026-08-30, v1.5.0 验证)
### Pitfalls (2026-07-29 更新)
`lottery_特码_cron.sh` 11:30 北京跑,新增的"上期开奖回顾"段实跑输出:
```
🎯 分析期号: 096 (v_xg.json Nq 未开下期)
- **sol.2344a.cc 全站 200 OK** (替代失效的 sol.0051.cc):
- https://sol.2344a.cc/zongheguapai/ ✅
- https://sol.2344a.cc/lxhz/ ✅
- https://sol.2344a.cc/xuanjiziliao/ ✅
- https://sol.2344a.cc/jiepai/ ✅
- https://sol.2344a.cc/pingxiaopingma/ ✅
- 挂牌帖含 "080期/081期" + 发布日期, 可索引历史
━━━ 上期开奖回顾 ━━━
**095 期**
| 位置 | 号码 |
|:---|:---|
| 平码 | 30 · 4 · 11 · 26 · 8 · 7 |
| 特码 | **42** |
- **sol.2344a.cc "Cann't connect to DB!" 第三次故障形态 (2026-08-02)**:
- 状态: HTTP 200,但 curl 返回 `Cann't connect to DB!` 文本(不是 ERR_CONNECTION_REFUSED)
- 受影响: sol.2344a.cc/* 全站 + btc.tktk.app/data/v_xg.json
- 后果: `lottery_4frame.py` 静默失败(exit 0,输出空)— 脚本未检测 DB 错误
- 降级: 仅依赖本地 SQLite draws 表
预测 Top 5: 33,25,26,22,22
命中: ❌ 特码 42 未中
```
- **📌 v_xg.json 字段语义 (2026-08-02 修正, 重要!)**:
- `Qi` = **最新已开期号** (刚开)
- `Nq` = 再下期
- `Week`/`Day`/`Year`/`Moon` = **Nq 期开彩日** (北京时间, 不是 Qi 期)
- **`Data.1-7` = Qi 期真开彩号码** (2026-08-04 验证) — 7 个号码 + 5 行字段 (sx/nim/color/style/number)
- 取 Qi 期真开 (实际刚开) 号码: 查 sol.2344a.cc/挂牌 或 lottery.db, **v_xg.json 不显示 Qi 期**
- 实战案例 (2026-08-04 14:03 北京): Qi=083 (083 期 8/1 周六已开), Data.1-7=081 期号码 (Qi-2), 083 期真开号 v_xg.json 不显示 (只能查 sol.2344a.cc/挂牌)
- 详见 `references/v_xg-data-qi-pitfall.md`
- **挂牌日 = 开彩日** (用户 2026-07-30 实战确认, 同一天, 不是提前 2-3 天): sol.2344a.cc 挂牌发布时间 = 实际开奖日
- **取 Qi 期真开**: 7 号码 = Data.1-7 (就是 Qi 期!), Qi 期号 = v_xg.json Qi, 真号从 v_xg.json 拿 (2026-08-04 验证)
- **取真历史**: sol.2344a.cc 挂牌索引 或本地 SQLite draws 表
**用户偏好落实**:
- ✅ "只判特码" (用户 2026-08-30 原话 "只要特码命中的") — 不输出"平码命中 26"
- ✅ Top 5 grep 锚定 `🥇🥈🥉` 行避免抓到年份/日期 (最初误抓到 `2026` 是 grep 没限定)
- ✅ 复用 verify_lottery.sh 的 draws 表 + v_xg.json fallback 路径
- **📌 推送格式偏好 (用户硬偏好, 2026-07-30 实战)**: QQ 推送用 **markdown 横向表格** (每票 1 列, 4-8 票可滑动比较)。**严禁** 1 票 1 块 (垂直堆叠), 用户说过"用列表方式显示 / 把所有表格都换成这样的"。
- 字段顺序: 名称表 + 项目表 (2 张表上下)
- 列用票代码, 行用指标 (现价/股息率/趋势/MA50/支撑/离均线/ATR/策略)
- 类似脚本: `daily_t_analysis.py` / `dividend_alert.py` / `cn_dividend_buy_timing.py` 全部已转横向表格
- **时间默认北京时间(用户硬规则, 2026-07-30)**: 任何日期时间 (挂牌/开奖/推送) 默认 UTC+8 北京时间;cron schedule UTC → 换算时也明确标"北京"
- **v_xg.json Week/Day 是 Nq 期开彩日** (北京时间周二/四/六 21:30, **不是 Qi 期, 是再下期**)
- **挂牌日 = 开彩日** (同天, 用户 2026-07-30 实战确认, 不是提前 2-3 天)
- **用户纠正"082 时间错"**: 因为 agent 没标"北京时间" + 没区分挂牌日和开奖日
- 沟通风格: 用户要"直接说怎么取的,不要分析/解释" — 错了立刻认错
**教训**: Top 5 提取用 `grep -hE '^\\| [🥇🥈🥉] \\| \\*\\*[0-9]+\\*\\*'` 锚定 emoji 行,**不是**裸 grep `\\*\\*[0-9]+\\*\\*` (后者会抓到时间戳/年份)。
- **v_xg.json 在 browser_navigate 下返回空白包装页**: skill文档说"直接返回JSON,无需浏览器"——但在 cron agent 模式下 terminal 被拦截,只能用 browser_navigate。此时 btc.tktk.app/data/v_xg.json 显示的是一个带 Pretty-print 复选框的包装页,JSON 内容不在 DOM 里。**临时方案**: 用 browser_snapshot(full=true) 尝试,或改用 tktk.tktk4.cc 首页的 Vue iframe 框架内的数据。
### 📌 090 期 cron schedule 错位 bug (2026-08-20)
- 用户反馈: "之前 14:30 跑的 cron 输出 `lottery_特码.py` not found" + verify 输出 "未找到分析文件 查找路径: /home/openclaw/.hermes/cron/output/5bec1f60f77f/"
- **根因**: 当时 `lottery-draw-result` cron 配置 `schedule=30 14 * * 0,2,4` (= 北京 22:00, **开彩前 30 分钟**)
- **错配双重**: (a) 开彩前 v_xg.json 还停在 Qi=089, 无 090 期数据 → verify 报"未找到分析文件"; (b) 14:30 wrapper 调 `lottery_特码.py` 跑分析 (应该 verify 跑核验), 两个 cron 错配
- **修法**: schedule `30 14` → `30 22 * * 0,2,4` (= 北京 22:30, 开彩后 1 小时), 让 verify 等到 v_xg.json 更新到 Qi=090 (Nq=091) 后再跑
- **验证**: 22:30 跑完输出 "090 期 平码 39·41·8·9·7·14, 特码 49", last_run_at 变成 22:30:36
- **教训**: verify 类 cron schedule **必须在 v_xg.json 更新后** (开彩后 30 分钟-1 小时), 不是"开彩前几分钟"
- **e/api/kj.php?xg 返回空页面**: 同样 Vue 包装,cron 模式无法获取实际开奖数据。
### 📌 095 期 verify_lottery.sh SKILL_DIR 路径 bug (2026-09-02)
- **tktk.tktk4.cc 历史页 (history/) 返回 404**: 不是正确路径。
**症状**: 9/2 22:30 北京 cron `668dcf3ec54d lottery-draw-result` 跑完, 推 QQ 报告末尾出现:
```
python3: can't open file '/home/openclaw/.hermes/scripts/lottery_特码.py': [Errno 2] No such file or directory
⚠️ add_draw 失败
```
- **sol.2344a.cc 历史API仍失效**: `/e/api/api.php?get=sixlist&year=YYYY` 返回空数据(2026-07确认)。需要从挂牌帖文本提取历史期号
**用户反馈**: "报这么多错" — 看到一堆 python3: can't open 报错 + 后续"未找到分析文件"。
- **历史数据无批量API**: 目前没有可用的批量历史开奖数据API。**替代**: 从 sol.2344a.cc 挂牌列表按"期号/发布日期"索引
**根因**:
```bash
# 旧 (在 ~/.hermes/scripts/verify_lottery.sh 中, cron 调用)
SKILL_DIR="$(cd "$(dirname "$0")/.." && pwd)"
# $0 = /home/openclaw/.hermes/scripts/verify_lottery.sh
# dirname = /home/openclaw/.hermes/scripts
# .. = /home/openclaw/.hermes ← 错了! 应该是 skill 根
# 然后 SKILL_DIR/scripts/lottery_特码.py = /home/openclaw/.hermes/scripts/lottery_特码.py ← 不存在
```
- **生肖表URL会过期**: sol.2344a.cc 的生肖表页面每年更新,旧URL会404。应先访问 https://sol.2344a.cc/sssx/ 列表页,找到最新年份的文章链接。
**正解** (硬编码优先 + fallback, 已实装):
```bash
# lottery skill 在 ~/.hermes/skills/trading/lottery-hk/, 但脚本被复制到 ~/.hermes/scripts/
# 优先找 skill 原目录, fallback 到 scripts 根
if [ -f "$HOME/.hermes/skills/trading/lottery-hk/scripts/lottery_特码.py" ]; then
SKILL_DIR="$HOME/.hermes/skills/trading/lottery-hk"
else
SKILL_DIR="$(cd "$(dirname "$0")/.." && pwd)"
fi
```
- **中文彩票站内容多为图片**: sol.2344a.cc 等网站的详细资料(公式、规律、技巧)嵌在图片中,curl/sed只能抓到文章标题索引,无法提取实际内容。需要用 browser 工具查看页面截图。
**手动补登 095 期** (因为 add_draw 失败了, 095 期没入库):
```bash
python3 ~/.hermes/skills/trading/lottery-hk/scripts/lottery_特码.py add 095 42 30 4 11 26 8 7
# → ✅ 095 期真开彩入库
```
- **⚠️ "4 框架" ≠ agent 自己造公式 (2026-07-30 实战, 用户多次拒绝)**: 用户说"4 框架"指 **reference `analysis-example-073/074/075.md` 里的真实推演流程** (v_xg.json 五行统计 + 综合挂牌解读 + 六信红字), **不是 agent 自己写 河洛/梅花/玄空/奇门 公式**。用户原话: "记得我说过不要跑频率, 没有意义, 我要说什么你才能记住"。**看到"4 框架"必跑 `python3 scripts/lottery_4frame.py`** (已固化真脚本), 不要尝试自己推公式。
- **⚠️ 特码分析不混 Qi 期数据 (2026-07-30 实战)**: 用户原话: "不要参考 081 期的, 没有意义, 就用挂牌分析就行了"。分析 `082 期` 时, 只用 sol.2344a.cc 挂牌 + 玄机 + 红字, **不要混 `v_xg.json Data.1-7` (那是 081 期已开号码, 不算 082 资料)**。**特码分析必跑 `python3 scripts/lottery_te_ma.py`** (已固化真脚本)。
- **⚠️ 不要在回复结尾加 "A/B/C 简单回答" 选项 (2026-07-30 用户指出)**: 这是 agent 自己加的回复模板, **不是用户让的, 也不是任何 skill 输出的**。看到用户问"这是什么技能输出的"才意识到: agent 默认加了"简单回答 X"模板, 但用户没要求。**不要在回复结尾加这种模板**, 直接回答用户问题。
- **⚠️ 出错立刻重做, 不要"分析"或"等回话" (2026-07-30 用户原话)**: 用户说"知道错了, 还要来确认, 你直接跑不行吗"。错了立刻重做, 不要 "让我再想想" / "让我检查一下" / 重新分析原因。
- **⚠️ "从哪取"只答来源一行, 不展开 (2026-07-30 实战)**: 用户原话: "我要知道你从哪里取的时间啊?" — agent 不该展开"我对比了 X / Y / Z 三个数据源才确认" 的分析。**回答"082 时间从哪取的" → 直接答 "v_xg.json `Week=周四 Day=30`", 不展开**。
**090-094 期无法补登**: v_xg.json 只存**当下一期** Data.1-7, 没有历史真开彩数据。draws 表 090-094 期永远空着, 这部分历史数据无法恢复。
**教训**:
- 任何 cron 脚本从 skill 复制到 `~/.hermes/scripts/` → `dirname $0/..` 路径**绝对**会错
- 解决方案: **优先硬编码已知 skill 路径**, fallback 用相对路径 (顺序别反)
- 见 `memory-check-utf8-zombie-lock-fix` skill § 15c — 通用 SKILL_DIR/SCRIPT_DIR 路径 bug 修法
**关联 lessons**:
- § 用户硬偏好 11 (开奖后流程) — verify_lottery.sh 是关键一环, 路径错等于流程断
- § 11 Pitfall B (脚本位置铁律) — skill 内 vs scripts/ 两套副本, cron 必须 scripts/
## 定时任务 (2026-08-13 改)
| 任务 | cron schedule | 模式 | 推送到 | script | 备注 |
|------|-----------|------|------|--------|------|
| lottery-hot-data | 30 11 * * 0,2,4 (北京) | **no_agent + script** | QQ | `lottery_特码_cron.sh` | 开彩前 2h 抓热数据, 跑 Nq 期分析 |
| lottery-draw-result | 30 22 * * 0,2,4 (北京) | **no_agent + script** | QQ | `verify_lottery.sh` | **开彩后 1h** 核验 (2026-08-20 从 14:30 改), 等 v_xg.json 更新到 Qi |
⚠️ **Cron 改 no_agent + script 模式 (2026-08-04)**: agent 模式 cron 经常编 (标题/时间/号码), 改 no_agent + script 后 0% 编概率。详见 `references/2026-08-04-analytics-history-and-cron-no-agent.md` + `references/cron-draw-result-flow.md` + `references/cron-browser-mode.md`。
开奖时间: 21:30 北京时间 → 11:30 UTC=19:30 北京 抓热数据, 14:30 UTC=22:30 北京 抓结果。
## 参考资料
- `references/zodiac-table.md`: 2026年完整生肖五行波色对照表(号码→生肖→五行→波色→分类)
- `references/draw-dates.md`: 2021-2023年搅珠日期(JS日历数据)
- `references/v_xg-qi-pitfall.md`: **v_xg.json Qi 字段语义陷阱实战**(2026-07-29 发现, Qi = 最新已开期号)
- `references/zodiac-table.md`: 2026 年完整生肖五行波色对照表
- `references/draw-dates.md`: 2021-2023 年搅珠日期 (JS 日历数据)
- `references/v_xg-data-qi-pitfall.md`: **v_xg.json 字段语义陷阱 (第 4 次修正, marksix6.com 验证)**
- `references/v_xg-qi-pitfall.md`: v_xg.json Qi 字段语义陷阱 (历史归档, 第 1 版)
- `references/common-knowledge.md`: 生肖属性文章索引、关键概念
- `references/techniques.md`: 规律秘诀文章索引(出波、波色法等)
- `references/patterns.md`: 固定规律文章索引(日期定波、杀肖、出尾等)
- `references/strategies.md`: 买码建议文章索引(赢钱秘诀、七戒律等)
- `references/agent-workflow-pitfalls.md`: **2026-07-30 实战累积的用户硬偏好 + agent workflow 坑** (跨 skill 通用, 必读)
- `references/2026-08-04-analytics-history-and-cron-no-agent.md`: **2026-08-04 新** — SQLite `analysis` 表 (入库 + check_hits) + `add/list/hits` CLI + cron `no_agent + script` 模式 (避免 agent 编) + GitLab 502 临时挂处理 + CN cron `30 11` 错峰调整
- 不要加 "A/B/C 简单回答" 模板
- "从哪取" 只答来源一行
- 错了立刻重做, 不分析
- 跑 4 框架/特码 必跑真脚本
- 推送用横向 markdown 表格
- cron agent 模式限制
- 4 位置保证 cron 读到硬规则
- `references/082-success-workflow.md`: **2026-07-30 082 期成功跑通的工作流** (反向参考, 跑通的不是只有坑, 复用成功路径)
## 定时任务
| 任务 | cron schedule | 模式 | 推送到 |
|------|-----------|------|------|
| lottery-hot-data | 30 11 * * 0,2,4 (北京) | **no_agent + script** | QQ |
| lottery-draw-result | 0 14 * * 0,2,4 (北京) | **no_agent + script** | QQ |
⚠️ **Cron 改 no_agent + script 模式 (2026-08-04)**: agent 模式 cron 经常编 (标题/时间/号码), 改 no_agent + script (直接调 `lottery_特码_cron.sh`) 后 0% 编概率。详见 `references/2026-08-04-analytics-history-and-cron-no-agent.md`。
开奖时间: 21:30 北京时间 → 先抓热数据分析(19:30=11:30 UTC),抓结果(14:00 UTC)。
注意: draw-result cron 跑时 7 号码已在 sol.2344a.cc 历史挂牌文里 (挂牌日 ≈ 开彩日, 通常 1-3 天前发布), agent 应该同时查 v_xg.json (Qi 期号) + sol.2344a.cc 历史挂牌 (Qi 期真开).
- `references/techniques.md`: 规律秘诀文章索引 (出波、波色法等)
- `references/patterns.md`: 固定规律文章索引 (日期定波、杀肖、出尾等)
- `references/strategies.md`: 买码建议文章索引 (赢钱秘诀、七戒律等)
- `references/cron-default-qi-vs-nq-pitfall.md`: **Cron 默认 Qi vs Nq 陷阱 (2026-08-13)** — 抓期号/分析必须用 Nq
- `references/candidate-source-tracker-pitfall.md`: **候选表「来源」列硬编码陷阱 (2026-08-13)** — `src_map` 字典 → 动态 `src_tracker`
- `references/draws-table-manual-add-pitfall.md`: **开奖后流程断点 (2026-08-13)** — draws 表手填 + cron 配错脚本 + verify Qi-1 → Qi 修复
- `references/cron-draw-result-flow.md`: **开奖后核验 cron 完整流程 (2026-08-13 新建)** — 22:30 北京 + verify_lottery.sh + v_xg.json as 真开彩源 (no_agent 唯一可行)
- `references/cron-browser-mode.md`: **Lottery cron 模式分工 (2026-08-13 改)** — no_agent 模式 curl 直接生效, agent 模式才用 browser
- `references/agent-workflow-pitfalls.md`: **跨 skill 通用, 必读** (用户硬偏好 + agent workflow 坑)
- `references/2026-08-04-analytics-history-and-cron-no-agent.md`: SQLite `analysis` 表 + CLI + cron `no_agent + script` 模式 + GitLab 502 处理
- `references/hkjc-com-blocked.md`: **2026-08-04 新** — hkjc.com 拦所有外部 browser agent, 改用 marksix6.com (agent 模式) / v_xg.json (no_agent 模式)
- `references/site-status.md`: 各站点状态 (sol.2344a.cc / btc.tktk.app / etc)
- `references/site-navigation.md`: 站点导航
- `references/lottery-sources.md`: 数据源汇总
- `references/082-success-workflow.md`: 082 期成功跑通的工作流 (反向参考)
- `references/analysis-example-073/074/075.md`: 3 期真实推演示范 (4 框架真方法)
- `references/2026-07-21-esoteric-analysis-capability-index.md`: 玄学分析能力索引
- `references/marksix6-com-verification-source.md`: marksix6.com 详细说明
- **`references/lottery-te-ma-2026-08-04-marksix6-verification.md`**: 2026-08-04 实战验证 marksix6 真实开彩
- **`references/2026-08-30-hot-data-previous-draw-recap.md`**: hot-data cron 加"上期开奖回顾"段 (上期 Qi 平码+特码+预测 Top 5+特码命中判定, 用户硬偏好 #12 "只要特码命中的", grep Top 5 锚定 `🥇🥈🥉` 行避免抓到日期年份)