修: format_te_ma_result 内部自动取 v_xg.json - period=None → 自动取 Qi - qi_week=None → 自动取 Week - qi_day=None → 自动取 Day main() 也改: - CLI 参数: python3 lottery_特码.py [period] - 不传自动取 Qi - 一次取 Qi+Week+Day, 避免重复 API call 结果: 任何期号跑都正确 - 082 → '082 期' + 周四 + 7/30 - 083 → '083 期' + 周二 + 8/4 - 自动同步, 0 硬编码
249 lines
9.0 KiB
Python
Executable File
249 lines
9.0 KiB
Python
Executable File
"""
|
||
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):
|
||
"""输出特码候选 + 推荐分配
|
||
|
||
period: 不传则自动取 v_xg.json Qi 期
|
||
qi_week / qi_day: 配套开彩日 (不传取 ?)
|
||
"""
|
||
# 自动取 Qi + 挂牌期信息
|
||
if period is None or qi_week is None or qi_day 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', '?')
|
||
except Exception:
|
||
if period is None:
|
||
period = '???'
|
||
if qi_week is None:
|
||
qi_week = '?'
|
||
if qi_day is None:
|
||
qi_day = '?'
|
||
|
||
L = []
|
||
L.append("=" * 62)
|
||
L.append(f"{period} 期特码分析 (纯挂牌, 不混 Qi-2 期数据)")
|
||
L.append(f"开彩: {qi_week} (Day={qi_day}) {period} 期 21:30 北京时间")
|
||
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 一次, 传所有
|
||
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', '?')
|
||
except Exception:
|
||
qi_week = qi_day = '?'
|
||
print(format_te_ma_result(weights, period, 15, qi_week, qi_day)) |