Files
Hermes-Skills/lottery-hk/scripts/lottery_特码.py
T
mike 5425c90f08 lottery_特码 + SKILL: 修正 v_xg.json Week/Day 字段语义
**2026-08-04 修正**:
v_xg.json Week/Day 实际是 **Nq 期开彩日**, 不是 Qi 期!

验证:
- Qi=083 + Week=周二 Day=04
- Nq=084 (再下次)
- 推测: 083 期开彩日 = 8/4 周二 - 1 个开彩日 = 8/1 周六
- sol.2344a.cc 083 期挂牌日 = 8/1 (✓ 一致)
- 084 期开彩日 = 8/4 周二 (v_xg.json Week/Day)

修改:
1. lottery_特码.py: format_te_ma_result 加 qi_nq 参数
   - header 显示 Qi + Nq + Qi 期推测开彩日
   - main() 自动取 Qi+Nq+Week+Day
2. SKILL.md: 多处改 Week/Day 描述
   - line 89, 92, 261, 269, description
   - 'Week/Day 是 Nq 期开彩日, 不是 Qi 期!'
3. version 1.2.7 不变 (这次是大修描述)

下次跑 cron 会自动按 Qi=083 显示:
  Qi 期推测开彩日: 周二 Day=04 之前 1 个开彩日 (挂牌日 = 开彩日)
2026-08-04 14:50:18 +08:00

258 lines
9.5 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
082 期特码分析 (纯挂牌, 不用 Qi-1 期数据)
按 user 2026-07-30 实战需求:
1. 不跑频率 (5 期数据无意义)
2. 不混 Qi-2 期号码 (081 期 已开, 不算 082 资料)
3. 只用挂牌 + 玄机诗 + 红字 推演
4. 输出 5 个候选特码 (有重点, 按挂牌共识排序)
5. 不强行 4 框架 (河洛/梅花/玄空/奇门) 公式 (reference 没推演方法)
"""
import re
import json
import subprocess
from collections import Counter
def curl_url(url):
try:
result = subprocess.run(
['curl', '-x', 'http://127.0.0.1:7890', '-L', '-s', url],
capture_output=True, text=True, timeout=20
)
return result.stdout
except Exception as e:
return f"[error: {e}]"
def fetch_sol_list(path, marker, limit=10):
html = curl_url(f'https://sol.2344a.cc{path}')
out = []
for line in html.split('\n'):
if marker in line:
clean = re.sub(r'<[^>]+>', ' ', line).strip()
m = re.search(rf'{marker}[^"]*?(?=</)', clean) or re.search(rf'{marker}[^"]*', clean)
if m and m.group(0).strip():
out.append(m.group(0).strip()[:200])
seen, unique = set(), []
for l in out:
if l not in seen:
seen.add(l)
unique.append(l)
return unique[:limit]
def fetch_sol_detail(path):
"""拿详情: 正版彩图挂 / 另版挂 / 爆 / 出肖"""
html = curl_url(f'https://sol.2344a.cc{path}')
text = re.sub(r'<script[^>]*>.*?</script>', '', html, flags=re.DOTALL)
text = re.sub(r'<style[^>]*>.*?</style>', '', text, flags=re.DOTALL)
text = re.sub(r'<[^>]+>', ' ', text)
text = re.sub(r'\s+', ' ', text).strip()
fields = {}
for kw in ['正版彩图挂', '另版挂', '四字', '六肖', '尾数', '火烧', '爆', '出肖', '挂牌出肖', '挂牌成语']:
m = re.search(kw + r'[:]([^。\s]{1,30})', text)
if m:
fields[kw] = m.group(1).strip()
return fields
def get_te_ma_candidates(period='082'):
"""特码候选 - 按挂牌共识排序
规则:
1. 挂牌 彩图挂直接给号 (权重最高 × 5)
2. 挂牌 爆 生肖 (权重 × 4)
3. 玄机诗 诗象 给号 (权重 × 3)
4. 彩霸王 三一玄数 (权重 × 2)
5. 玄机字字型 (权重 × 2)
"""
weights = Counter()
# Step 1: 综合挂牌 列表 + 详情
gua_html = curl_url('https://sol.2344a.cc/zongheguapai/')
gua_links = re.findall(rf'href="(/zongheguapai/\d+\.html)"[^>]*>.*?{period}期', gua_html)[:3]
for link in gua_links:
f = fetch_sol_detail(link)
# 正版彩图挂 给出号
if '正版彩图挂' in f:
m = re.search(r'\d+', f['正版彩图挂'])
if m:
weights[int(m.group(0))] += 5 # 彩图挂直接给号最高权重
# 另版挂 给出号
if '另版挂' in f:
m = re.search(r'\d+', f['另版挂'])
if m:
weights[int(m.group(0))] += 3
# 尾数 (如 1尾,3尾) -> +10, +30
if '尾数' in f:
for m in re.finditer(r'(\d+)尾', f['尾数']):
weights[int(m.group(1))] += 2
weights[int(m.group(1)) + 10] += 1
weights[int(m.group(1)) + 20] += 1
weights[int(m.group(1)) + 30] += 1
# Step 2: 玄机诗 (xuanjiziliao)
xuan = fetch_sol_list('/xuanjiziliao/', f'{period}期', limit=20)
for line in xuan:
# 诗象: 09、47
if '提供' in line or '猜' in line:
for m in re.finditer(r'[(](\d+)[)]', line):
num = int(m.group(1))
if 1 <= num <= 49:
weights[num] += 3
# 彩霸王 三一玄数
if '三一' in line or '一三' in line:
weights[3] += 2
weights[1] += 2
weights[13] += 2
weights[31] += 2
# 玄机字 (沐字型 8 划)
if '《沐》' in line:
weights[8] += 2
# 红马蓝狗 (马 红色 = 偏红, 狗 蓝色 = 偏蓝)
if '红马' in line:
weights[12] += 1 # 马=12 偏红
if '蓝狗' in line:
weights[18] += 1 # 狗=18 偏蓝
# Step 3: 六信红字 (红字 大数偏多)
hong = fetch_sol_list('/lxhz/', f'{period}期', limit=5)
for line in hong:
if '頤養' in line or '天年' in line:
# 大数偏多 (>25)
for n in range(25, 50):
weights[n] += 1
return weights
def format_te_ma_result(weights, period=None, budget=15, qi_week=None, qi_day=None, qi_nq=None):
"""输出特码候选 + 推荐分配
period: 不传则自动取 v_xg.json Qi 期
qi_week / qi_day: 配套开彩日 (不传取 ?)
qi_nq: Nq 期号 (再下次)
"""
# 自动取 Qi + 挂牌期信息
if period is None or qi_week is None or qi_day is None or qi_nq is None:
try:
import urllib.request
req = urllib.request.Request('https://btc.tktk.app/data/v_xg.json',
headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req, timeout=10) as r:
v = json.loads(r.read().decode('utf-8'))
if period is None:
period = v.get('Qi', '???')
if qi_week is None:
qi_week = v.get('Week', '?')
if qi_day is None:
qi_day = v.get('Day', '?')
if qi_nq is None:
qi_nq = v.get('Nq', '?')
except Exception:
if period is None:
period = '???'
if qi_week is None:
qi_week = '?'
if qi_day is None:
qi_day = '?'
if qi_nq is None:
qi_nq = '?'
L = []
L.append("=" * 62)
L.append(f"{period} 期特码分析 (纯挂牌, 不混 Qi-2 期数据)")
# v_xg.json Week/Day 是 Nq 期开彩日, 不是 Qi 期 (2026-08-04 修正)
# 所以 Qi 期的开彩日要从 Nq 期倒推 (-3 天), 或拿挂牌日
L.append(f"v_xg.json Qi={period} (下次开) Nq={qi_nq} (再下次开)")
L.append(f"Qi 期推测开彩日: {qi_week} Day={qi_day} 之前 1 个开彩日 (挂牌日 = 开彩日)")
L.append("=" * 62)
L.append("")
L.append("📋 挂牌资料源:")
L.append(" 1. https://sol.2344a.cc/zongheguapai/ (综合挂牌)")
L.append(" 2. https://sol.2344a.cc/xuanjiziliao/ (玄机诗)")
L.append(" 3. https://sol.2344a.cc/lxhz/ (六信红字)")
L.append("")
L.append(f"💰 总预算: {budget} 元 (按重点分配)")
L.append("")
# 排序 Top 5+
top = weights.most_common(8)
L.append("🏆 特码候选 (按挂牌共识权重):")
L.append("")
L.append("| 排序 | 特码 | 权重 | 来源 |")
L.append("|---|---|---|---|")
# 常见号映射 (通用)
src_map = {
9: '诗象 (09, 47 单出) + 彩图挂 09',
33: '彩图挂 33',
5: '彩图挂 05',
47: '诗象 (单, 单出)',
13: '彩霸王 三一玄数',
3: '彩霸王 三一',
1: '彩霸王 一三',
31: '彩霸王 一三',
8: '玄机字 (沐 8 划) + 中宫生气',
}
for i, (num, w) in enumerate(top, 1):
src = src_map.get(num, '其他挂牌提示')
emoji = ['🥇', '🥈', '🥉', '4', '5', '6', '7', '8'][i-1]
L.append(f"| {emoji} | **{num}** | {w} | {src} |")
L.append("")
# 重点分配 (按权重比例)
L.append(f"💸 重点分配 ({budget} 元):")
L.append("")
L.append("| 特码 | 金额 | 占比 | 权重比 | 中奖得 |")
L.append("|---|---|---|---|---|")
# 按权重比例分配
total_w = sum(w for _, w in top[:5])
splits = [5, 4, 3, 2, 1] # 默认 5/4/3/2/1 分配
for i, (num, w) in enumerate(top[:5], 1):
amt = splits[i-1] if i <= len(splits) else 1
win = amt * 42
emoji = ['🥇', '🥈', '🥉', '4', '5'][i-1]
L.append(f"| {emoji} {num} | ¥{amt} | {amt*100//budget}% | {w}/{total_w} | ¥{win} |")
L.append("")
L.append(f"📊 总投入: ¥{sum(splits[:min(5, len(top))])}")
L.append("")
L.append("⚠️ 文化娱乐参考, 不要按这些号买")
L.append("📌 按 SKILL.md 提示: 推算仅供娱乐, 不构成投注建议")
return '\n'.join(L)
if __name__ == '__main__':
import sys
# 支持 CLI 参数: python3 lottery_特码.py [period]
period = sys.argv[1] if len(sys.argv) > 1 else None
if period is None:
# 自动取 v_xg.json Qi
try:
import urllib.request
req = urllib.request.Request('https://btc.tktk.app/data/v_xg.json',
headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req, timeout=10) as r:
period = json.loads(r.read().decode('utf-8')).get('Qi', '082')
except Exception:
period = '082'
weights = get_te_ma_candidates(period)
# 自动取 v_xg.json Qi + Week + Day + Nq 一次, 传所有
try:
import urllib.request
req = urllib.request.Request('https://btc.tktk.app/data/v_xg.json',
headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(req, timeout=10) as r:
v = json.loads(r.read().decode('utf-8'))
period = v.get('Qi', period)
qi_week = v.get('Week', '?')
qi_day = v.get('Day', '?')
qi_nq = v.get('Nq', '?')
except Exception:
qi_week = qi_day = qi_nq = '?'
print(format_te_ma_result(weights, period, 15, qi_week, qi_day, qi_nq))