Files
Hermes-Skills/lottery-hk/scripts/lottery_特码.py
T
mike 37ff8f84c4 lottery_特码: format_te_ma_result 改 period 智能判别 Qi/Nq
bug: CLI 传 period=084 但 main() 把 period 改成 v_xg.json Qi=083
  → '084 期特码分析' 仍显示 '083 期' (CLI 失效)

修:
1. main() 不再覆盖 period (保留用户 CLI 传的)
2. format_te_ma_result 智能判别:
   - period == Nq: Week/Day 就是 period 开彩日 (直接用)
   - period == Qi: Week/Day 是 Nq 期开彩日 (-3 天推算 Qi 期)
   - period 是其他期: 不推算

验证:
- CLI 084 → '084 期特码分析' + '本期 084 期开彩日' (8/4 周二)
- CLI 不传 → '083 期特码分析' + '本期 (083) 开彩日: Nq -3 天' (8/1 周六推算)
2026-08-04 16:05:42 +08:00

270 lines
10 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: 要分析哪期 (None=自动取 v_xg.json Qi)
qi_week / qi_day / qi_nq: v_xg.json 字段 (None=自动取)
"""
# 一次性查 v_xg.json 拿所有字段
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'))
qi_xg = v.get('Qi', '???')
nq_xg = v.get('Nq', '???')
week_xg = v.get('Week', '?')
day_xg = v.get('Day', '?')
except Exception:
qi_xg = nq_xg = '???'
week_xg = day_xg = '?'
# 如果用户没传 period, 默认用 Qi
if period is None:
period = qi_xg
if qi_week is None:
qi_week = week_xg
if qi_day is None:
qi_day = day_xg
if qi_nq is None:
qi_nq = nq_xg
L = []
L.append("=" * 62)
L.append(f"{period} 期特码分析 (纯挂牌, 不混 Qi 期已开数据)")
# v_xg.json 字段语义 (2026-08-04 修正):
# Qi = 最新已开 (刚开)
# Nq = 未开下期
# Week/Day = Nq 期开彩日
# Data.1-7 = Qi-2 期已开号码 (不是 Qi 期)
# 如果 period == Nq 期, Week/Day 就是 period 开彩日 (直接用)
# 如果 period == Qi 期, Week/Day 是 Nq 期开彩日 (要 -3 天推算 Qi 期)
if str(period) == str(qi_nq):
# period 是 Nq 期 (未开), Week/Day 直接是 period 开彩日
L.append(f"v_xg.json: Qi={qi_xg} (最新已开) | Nq={nq_xg} (未开下期) | Week={week_xg} (Day={day_xg}) = 本期 {period} 期开彩日")
elif str(period) == str(qi_xg):
# period 是 Qi 期 (已开), Week/Day 是 Nq 期, 要 -3 天推算 Qi 期开彩日
L.append(f"v_xg.json: Qi={qi_xg} (最新已开) | Nq={nq_xg} (未开下期) | Week={week_xg} (Day={day_xg}) = Nq 期开彩日")
L.append(f"本期 ({period}) 开彩日: Nq 期开彩日 ({qi_week} Day={qi_day}) 之前 1 个开彩日 (-3 天)")
else:
# period 是其他期 (Cli 传用户指定)
L.append(f"v_xg.json: Qi={qi_xg} (最新已开) | Nq={nq_xg} (未开下期) | Week={week_xg} (Day={day_xg}) = Nq 期开彩日")
L.append(f"本期 ({period}) 开彩日: 用户指定期 (非 Qi/Nq), 不推算")
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 一次, 传所有
# (period 保留用户 CLI 传的, 不要被 Qi 覆盖 — 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:
v = json.loads(r.read().decode('utf-8'))
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))