5.1 KiB
候选数稀疏诊断 + 实装 fix (2026-08-20 v1.4.0)
触发
lottery_特码_cron.sh cron 推送出现以下信号:
- "🏆 特码候选" 表只有 2-3 行(而非 5 行)
- 用户问 "号码就这么两个吗?" / "候选号能不能多几个?"
用户偏好(2026-08-20 实锤)
用户原话: "可以 4-5 个号合适"
之前 (2026-08-20 上午) skill 建议是"尊重数据稀疏,不要硬凑"。用户直接说不要这个, 要 4-5 个号。实装 flip:
| 旧哲学 (尊重数据) | 新哲学 (v1.4.0 实装, 用户向) |
|---|---|
| 推送末尾加"⚠️ 今天稀疏" | 直接补到 5 个, 末尾标"兜底占位" |
| 不动 most_common(8) | 显式补足 top.append((n, 0)) |
| 不解码 火烧/六肖 | 解码本年生肖号, +1/+2 |
不要重新回去 "尊重数据" 那套 — 用户否决过。
根因(参考, 已不再是阻断)
get_te_ma_candidates() 用 weights = Counter(), 最终候选数 = Counter 实际条数, 由 sol.2344a.cc 挂牌页决定:
| 字段 | 权重 | 命中率 |
|---|---|---|
正版彩图挂 (彩图挂直接给号) |
+5 | ~50% (常只有 1-2 个号) |
另版挂 |
+3 | ~30% |
尾数 X尾 |
+2 (本) / +1 (+10/+20/+30) | ~70% |
六肖 / 出肖 / 火烧 |
v1.4.0 起解码本年生肖号 (+1 / +2) | 100% |
玄机诗诗象 (NN) |
+3 | ~60% |
| 三一玄数 | +2 (硬编码 3/1/13/31) | 100% |
| 六信红字 "大数偏多" | +1 (25-49 全加) | 100% |
常见稀疏组合: 当天挂牌帖只发了 正版彩图挂 = 2, 9 两个号 → weights = {2:5, 9:5} → 2 个候选。
实装的 fix (3 改动一起)
1. 挂牌页抓取放宽
lottery_特码.py::get_te_ma_candidates() 第 198 行:
# ❌ 旧
gua_links = re.findall(...)[:3]
# ✅ 新 (v1.4.0)
gua_links = re.findall(...)[:8]
多抓几页挂牌, 挂牌稀疏时也有足够数据源。
2. 火烧/六肖 解码本年生肖号
之前 火烧 / 六肖 / 出肖 字段只记录不直接给号。现在加生肖→本数映射:
SX_TO_BENSHENG = {
'鼠': 23, '牛': 22, '虎': 21, '兔': 20, '龙': 19, '蛇': 18,
'马': 17, '羊': 16, '猴': 15, '鸡': 14, '狗': 13, '猪': 12,
}
# 火烧 命中某生肖 → 该号 +2 (本年生肖权重高)
# 六肖/出肖 每命中一个生肖 → 该号 +1
示例: 091 期挂牌 火烧=鸡 → 加 14 (+2 权重); 六肖=兔狗龙鼠牛蛇 → 加 20, 19, 22 (各 +1)。
3. format_te_ma_result 兜底
候选数 < 4 时, weights.most_common(8) + 显式补足到 5 个:
top = weights.most_common(8)
if len(top) < 4:
need = 5 - len(top)
existing = {n for n, _ in top}
for n in range(1, 50):
if n not in existing:
top.append((n, 0)) # 权重 0 = 占位, 排最后
existing.add(n)
if len(top) >= 5:
break
关键: most_common() 不返回权重 0 的号, 必须用 top.append((n, 0)) 显式扩展。
来源标记也得变 — get_src(num, w) 在 w == 0 时返回 "兜底占位 (挂牌稀疏)", 不再是 fallback "其他挂牌提示"。
验证 (2026-08-20 Nq=091 期)
跑 bash ~/.hermes/scripts/lottery_特码_cron.sh 输出 8 候选, 重点分配 5 个 ¥15=5/4/3/2/1:
| 排序 | 特码 | 权重 | 来源 |
|---|---|---|---|
| 🥇 | 35 | 4 | 挂牌 另版挂 (35) + 挂牌 尾数 5尾 (+30) |
| 🥈 | 2 | 2 | 挂牌 尾数 2尾 (本) |
| 🥉 | 22 | 2 | 挂牌 尾数 2尾 (+20) + 挂牌 六肖 牛=22 |
| 4 | 5 | 2 | 挂牌 尾数 5尾 (本) |
| 5 | 14 | 2 | 挂牌 火烧 鸡=14 (本年生肖) |
| 6 | 12 | 1 | 挂牌 尾数 2尾 (+10) |
| 7 | 32 | 1 | 挂牌 尾数 2尾 (+30) |
| 8 | 15 | 1 | 挂牌 尾数 5尾 (+10) |
配套 wrapper 修复: cron Qi→Nq 二次修正
lottery_特码_cron.sh 第 9-19 行之前取 Qi (已开期), cron 推的是已开期 (无前瞻意义)。这次硬规则: d['Nq'] + fallback '088'。
# ❌ 旧
QI=$(... d['Qi'] ...)
# ✅ 新 (v1.4.0)
TARGET=$(... d['Nq'] ...)
改这两文件后必须 grep "Qi" 确认 runtime 路径全用 Nq。
配套 cron schedule 修复: verify_lottery 14:30→22:30
668dcf3ec54d lottery-draw-result 之前 schedule=30 14 * * 0,2,4 (= 北京 22:00, 开彩前 30 分钟), v_xg.json 还停在 Qi=089, 无 090 期数据 → verify 报"未找到分析文件"。改 30 22 * * 0,2,4 (北京 22:30, 开彩后 1 小时), 等 v_xg.json 更新到 Qi 后再跑。
回退条件
如果用户明确说 "不要兜底, 太离谱了" / "不要解码生肖, 玄学污染":
- 删除
format_te_ma_result里的if len(top) < 4块 - 保留 (1) 挂牌抓 3→8 + (2) 火烧/六肖 解码本年生肖号
- 保留 (3) cron wrapper Qi→Nq + verify schedule 修正 (这两个跟候选数无关)
跟单场景的类比
okx-auto-position 信号源缺失闸 (2026-08-18 v4.5.53) 是同种"数据告诉你没有就跳过"模式:
- trader='未知' → 跳过,推"信号源未知", 不要硬凑 trader
两个 skill 区别:
- lottery 候选: 用户明确要"补到 4-5 个号" → 兜底 ✅
- okx 跟单 trader: 数据告诉你没有 trader → 跳过 ✅
判断标准:用户原话, 不是哲学一致性。