Initial commit
This commit is contained in:
370
skills/get-fortune-analysis/SKILL.md
Executable file
370
skills/get-fortune-analysis/SKILL.md
Executable file
@@ -0,0 +1,370 @@
|
||||
---
|
||||
name: get-fortune-analysis
|
||||
description: 生成视觉华丽、内容详实、具有仪式感的流年运势报告(流金星象风格)。
|
||||
---
|
||||
# Skill Name: get-fortune-analysis
|
||||
# Version: 4.1.0
|
||||
# Description: 生成视觉华丽、内容详实、具有仪式感的流年运势报告(流金星象风格)。
|
||||
|
||||
## 1. Input Parameters
|
||||
| Parameter | Type | Description |
|
||||
| :--- | :--- | :--- |
|
||||
| `birth_year`, `birth_month`, `birth_day`, `birth_hour` | Integer | 用户出生时间 |
|
||||
| `focus_type` | String | (可选) "事业", "财运", "情感" |
|
||||
|
||||
## 2. Workflow
|
||||
|
||||
### Step 1: Calculation (Python)
|
||||
调用 `get_cyber_divination_data` 获取 `bazi` (八字基础) 和 `fortune` (流年十神) 数据。
|
||||
|
||||
### Step 2: Reasoning (深度分析模式)
|
||||
基于 `bazi` 和 `fortune` 进行多维度推理。
|
||||
**文案要求:**
|
||||
* **口吻**:温暖、笃定、专业,类似资深命理师或星座专家的语气。
|
||||
* **结构**:
|
||||
1. **年度关键词**:4个字,精准概括全年基调(如“破茧成蝶”)。
|
||||
2. **核心能量**:解释流年十神对用户命局的深层影响(30-50字)。
|
||||
3. **事业/财运**:具体的职场发展路径和财富机遇分析(50-80字)。
|
||||
4. **情感/人际**:人际关系模式与情感走向分析(50-80字)。
|
||||
|
||||
### Step 3: JSON Output
|
||||
生成适配前端的 JSON 数据。
|
||||
|
||||
```json
|
||||
{
|
||||
"fortune_report": {
|
||||
"score": 88,
|
||||
"keyword": "灵感迸发 · 贵人引路",
|
||||
"user_tag": "丁火 (身弱)",
|
||||
"stars": {
|
||||
"c": "★★★★☆",
|
||||
"w": "★★★☆☆",
|
||||
"l": "★★★★★"
|
||||
},
|
||||
"analysis": {
|
||||
"overview": "2026 丙午流年,火气旺盛,对你而言是充满灵性与机遇的一年。虽然竞争压力(比劫)增大,但也激活了你命局中的‘印星’能量。这意味着今年你的直觉力、学习力将达到巅峰,是沉淀自我、弯道超车的最佳时机。",
|
||||
"career": "今年不适合盲目扩张,适合‘深耕’。职场上会遇到强有力的女性贵人或资深导师,给你带来关键性的指点。若从事创意、咨询、教育行业,今年极易出成果。切记:多听少说,以柔克刚。",
|
||||
"love": "情感方面,桃花星悄然绽放。单身者极易在学习场所、图书馆或艺术展上邂逅精神契合的伴侣;有伴侣者,今年是进行深度沟通、解决历史遗留问题的破冰之年,关系将升华到精神层面。"
|
||||
}
|
||||
}
|
||||
}```
|
||||
|
||||
|
||||
### 2. 前端展示代码 (`result_card.html`)
|
||||
|
||||
*修改点:在首页(`ritual-layer`)增加了动态生成漂浮二进制代码的逻辑。代码粒子是半透明的金色/白色,缓慢上升并消散,营造神秘的数据空间感。*
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>2026 流年运势书</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Noto+Serif+SC:wght@400;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
--bg-deep: #1a0b2e;
|
||||
--bg-gradient: radial-gradient(circle at 50% 0%, #431d69 0%, #1a0b2e 80%);
|
||||
--gold-light: #fcf6ba;
|
||||
--gold-dark: #bf953f;
|
||||
--gold-gradient: linear-gradient(to bottom, #fcf6ba, #bf953f);
|
||||
--glass-bg: rgba(255, 255, 255, 0.08);
|
||||
--card-border: rgba(255, 255, 255, 0.15);
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--bg-deep);
|
||||
background-image: var(--bg-gradient);
|
||||
color: #fff;
|
||||
font-family: 'Noto Serif SC', serif;
|
||||
margin: 0;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
overflow-x: hidden;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.app-container {
|
||||
width: 100%;
|
||||
max-width: 414px;
|
||||
position: relative;
|
||||
min-height: 100vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* --- 1. 启动页 (Ritual Layer) --- */
|
||||
.ritual-layer {
|
||||
position: absolute;
|
||||
top: 0; left: 0; width: 100%; height: 100%;
|
||||
z-index: 100;
|
||||
background: var(--bg-deep);
|
||||
background-image: var(--bg-gradient);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: opacity 0.8s ease;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* 新增:二进制数据容器 */
|
||||
.binary-container {
|
||||
position: absolute;
|
||||
top: 0; left: 0; width: 100%; height: 100%;
|
||||
pointer-events: none;
|
||||
z-index: 0; /* 在最底层 */
|
||||
}
|
||||
|
||||
/* 新增:二进制粒子样式 */
|
||||
.binary-particle {
|
||||
position: absolute;
|
||||
bottom: -20px;
|
||||
font-family: 'Courier New', monospace;
|
||||
color: rgba(252, 246, 186, 0.3); /* 微弱的金白色 */
|
||||
font-size: 10px;
|
||||
user-select: none;
|
||||
animation: floatUp linear forwards;
|
||||
}
|
||||
|
||||
/* 启动页内容容器 (确保在粒子之上) */
|
||||
.ritual-content {
|
||||
position: relative;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.fingerprint-area {
|
||||
width: 100px; height: 100px;
|
||||
border: 2px solid rgba(191, 149, 63, 0.3);
|
||||
border-radius: 50%;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
position: relative; cursor: pointer;
|
||||
margin-bottom: 20px;
|
||||
backdrop-filter: blur(2px); /* 轻微磨砂,突出按钮 */
|
||||
}
|
||||
|
||||
.fingerprint-area::after {
|
||||
content: ''; position: absolute; width: 100%; height: 100%;
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 0 30px var(--gold-dark);
|
||||
opacity: 0; animation: breathe 2s infinite;
|
||||
}
|
||||
|
||||
.fingerprint-icon {
|
||||
font-size: 40px; color: var(--gold-dark); transition: color 0.3s;
|
||||
}
|
||||
|
||||
.hint-text {
|
||||
color: rgba(255,255,255,0.6); font-size: 14px; letter-spacing: 2px;
|
||||
}
|
||||
|
||||
/* --- 2. 结果页 (Result Layer) --- */
|
||||
/* ... (保持不变) ... */
|
||||
.result-layer {
|
||||
padding: 20px; opacity: 0; transform: translateY(20px);
|
||||
transition: all 0.8s ease; display: none;
|
||||
}
|
||||
.header-card { text-align: center; margin-bottom: 30px; position: relative; }
|
||||
.year-title { font-family: 'Playfair Display', serif; font-size: 16px; color: rgba(255,255,255,0.7); letter-spacing: 4px; margin-bottom: 5px; }
|
||||
.score-box { font-size: 72px; font-weight: 700; background: var(--gold-gradient); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin: 10px 0; text-shadow: 0 0 30px rgba(191, 149, 63, 0.4); }
|
||||
.keyword-badge { display: inline-block; border: 1px solid var(--gold-dark); color: var(--gold-light); padding: 4px 12px; border-radius: 20px; font-size: 14px; background: rgba(0,0,0,0.3); }
|
||||
.detail-card { background: var(--glass-bg); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid var(--card-border); border-radius: 16px; padding: 24px; margin-bottom: 20px; box-shadow: 0 10px 30px rgba(0,0,0,0.2); }
|
||||
.section-title { display: flex; align-items: center; color: var(--gold-light); font-size: 16px; font-weight: bold; margin-bottom: 12px; border-bottom: 1px solid rgba(255,255,255,0.1); padding-bottom: 8px; }
|
||||
.section-title span { margin-right: 8px; }
|
||||
.text-content { font-size: 14px; line-height: 1.8; color: rgba(255,255,255,0.9); text-align: justify; }
|
||||
.star-row { display: flex; justify-content: space-between; margin-bottom: 10px; font-size: 14px; }
|
||||
.stars { color: var(--gold-dark); letter-spacing: 2px; }
|
||||
.footer-share { text-align: center; font-size: 12px; color: rgba(255,255,255,0.4); margin-top: 30px; padding-bottom: 30px; }
|
||||
|
||||
/* 动画 Keyframes */
|
||||
@keyframes breathe {
|
||||
0% { opacity: 0.3; transform: scale(1); }
|
||||
50% { opacity: 0.8; transform: scale(1.1); }
|
||||
100% { opacity: 0.3; transform: scale(1); }
|
||||
}
|
||||
|
||||
/* 新增:粒子上浮动画 */
|
||||
@keyframes floatUp {
|
||||
0% { transform: translateY(0) rotate(0deg); opacity: 0; }
|
||||
20% { opacity: 0.5; }
|
||||
80% { opacity: 0.2; }
|
||||
100% { transform: translateY(-120vh) rotate(20deg); opacity: 0; }
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="app-container">
|
||||
|
||||
<div class="ritual-layer" id="ritualLayer">
|
||||
<div class="binary-container" id="binaryContainer"></div>
|
||||
|
||||
<div class="ritual-content">
|
||||
<div style="margin-bottom: 40px; opacity: 0.7;">
|
||||
<svg width="60" height="60" viewBox="0 0 24 24" fill="none" stroke="#bf953f" stroke-width="1">
|
||||
<circle cx="12" cy="12" r="10"></circle>
|
||||
<path d="M12 2a15 15 0 0 0 0 30 15 15 0 0 0 0-30"></path>
|
||||
<path d="M2 12h20"></path>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<div class="fingerprint-area" id="fingerBtn">
|
||||
<div class="fingerprint-icon">
|
||||
<svg width="50" height="50" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
||||
<path d="M2 12C2 6.48 6.48 2 12 2s10 4.48 10 10v1c0 2.21-1.79 4-4 4s-4-1.79-4-4V7c0-1.66-1.34-3-3-3S8 5.34 8 7v6c0 1.1.9 2 2 2s2-.9 2-2V7"></path>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hint-text">长按开启 2026 运势书</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="result-layer" id="resultLayer">
|
||||
<div class="header-card">
|
||||
<div class="year-title">FORTUNE REPORT 2026</div>
|
||||
<div class="score-box" id="scoreVal">0</div>
|
||||
<div class="keyword-badge" id="mainKeyword">读取中...</div>
|
||||
<div style="font-size: 12px; color:rgba(255,255,255,0.5); margin-top: 10px;">
|
||||
日主:<span id="userTag">--</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-card">
|
||||
<div class="star-row"><span>事业前程 Career</span><span class="stars" id="careerStars">★★★★☆</span></div>
|
||||
<div class="star-row"><span>财富机缘 Wealth</span><span class="stars" id="wealthStars">★★★☆☆</span></div>
|
||||
<div class="star-row"><span>情感关系 Love</span><span class="stars" id="loveStars">★★★★★</span></div>
|
||||
</div>
|
||||
<div class="detail-card">
|
||||
<div class="section-title"><span>✦</span> 年度总批 Overview</div>
|
||||
<div class="text-content" id="overviewText">正在解析星盘数据...</div>
|
||||
</div>
|
||||
<div class="detail-card">
|
||||
<div class="section-title"><span>⚔</span> 事业与财富</div>
|
||||
<div class="text-content" id="careerText">...</div>
|
||||
</div>
|
||||
<div class="detail-card">
|
||||
<div class="section-title"><span>♥</span> 情感与建议</div>
|
||||
<div class="text-content" id="loveText">...</div>
|
||||
</div>
|
||||
<div class="footer-share">Mystic AI Lab © 2026</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// --- 模拟 AI 返回的数据 ---
|
||||
const aiData = {
|
||||
"fortune_report": {
|
||||
"score": 88,
|
||||
"keyword": "灵感迸发 · 贵人引路",
|
||||
"user_tag": "丁火 (身弱)",
|
||||
"stars": { "c": "★★★★☆", "w": "★★★☆☆", "l": "★★★★★" },
|
||||
"analysis": {
|
||||
"overview": "2026 丙午流年,对你而言是充满灵性与机遇的一年。虽然流年火旺带来了竞争压力,但也激活了你命局中的‘印星’能量。这意味着今年你的直觉力、学习力将达到巅峰,是沉淀自我、弯道超车的最佳时机。",
|
||||
"career": "今年不适合盲目扩张,适合‘深耕’。职场上会遇到强有力的女性贵人或资深导师,给你带来关键性的指点。若从事创意、咨询、教育行业,今年极易出成果。",
|
||||
"love": "情感方面,桃花星悄然绽放。单身者极易在学习场所、图书馆或艺术展上邂逅精神契合的伴侣;有伴侣者,今年是进行深度沟通、解决历史遗留问题的破冰之年。"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// --- 二进制粒子效果 ---
|
||||
const binaryContainer = document.getElementById('binaryContainer');
|
||||
let particleInterval;
|
||||
|
||||
function createBinaryParticle() {
|
||||
const particle = document.createElement('div');
|
||||
particle.classList.add('binary-particle');
|
||||
// 随机生成 01 字符串
|
||||
const len = Math.floor(Math.random() * 6) + 2;
|
||||
let text = "";
|
||||
for(let i=0; i<len; i++) text += Math.random() > 0.5 ? "1" : "0";
|
||||
particle.innerText = text;
|
||||
|
||||
// 随机位置和属性
|
||||
particle.style.left = Math.random() * 100 + '%';
|
||||
const duration = Math.random() * 10 + 8; // 8-18秒飘动时间
|
||||
particle.style.animationDuration = duration + 's';
|
||||
particle.style.fontSize = (Math.random() * 8 + 8) + 'px';
|
||||
particle.style.opacity = Math.random() * 0.3 + 0.1;
|
||||
|
||||
binaryContainer.appendChild(particle);
|
||||
|
||||
// 动画结束后移除
|
||||
setTimeout(() => {
|
||||
particle.remove();
|
||||
}, duration * 1000);
|
||||
}
|
||||
|
||||
// 开始生成粒子
|
||||
function startBinaryRain() {
|
||||
// 初始先生成一批
|
||||
for(let i=0; i<15; i++) createBinaryParticle();
|
||||
// 然后定期生成
|
||||
particleInterval = setInterval(createBinaryParticle, 600);
|
||||
}
|
||||
|
||||
function stopBinaryRain() {
|
||||
clearInterval(particleInterval);
|
||||
// 可选:渐隐清除现有粒子
|
||||
// binaryContainer.style.opacity = 0;
|
||||
}
|
||||
|
||||
|
||||
// --- 交互逻辑 ---
|
||||
const btn = document.getElementById('fingerBtn');
|
||||
const ritual = document.getElementById('ritualLayer');
|
||||
const result = document.getElementById('resultLayer');
|
||||
let pressTimer;
|
||||
|
||||
btn.addEventListener('touchstart', startRitual, {passive: false});
|
||||
btn.addEventListener('mousedown', startRitual);
|
||||
btn.addEventListener('touchend', endRitual);
|
||||
btn.addEventListener('mouseup', endRitual);
|
||||
btn.addEventListener('mouseleave', endRitual);
|
||||
|
||||
function startRitual(e) {
|
||||
e.preventDefault();
|
||||
btn.style.transform = "scale(0.95)";
|
||||
btn.style.borderColor = "#fff";
|
||||
document.querySelector('.fingerprint-icon').style.color = "#fff";
|
||||
pressTimer = setTimeout(revealResult, 1500);
|
||||
}
|
||||
|
||||
function endRitual() {
|
||||
clearTimeout(pressTimer);
|
||||
btn.style.transform = "scale(1)";
|
||||
btn.style.borderColor = "rgba(191, 149, 63, 0.3)";
|
||||
document.querySelector('.fingerprint-icon').style.color = "#bf953f";
|
||||
}
|
||||
|
||||
function revealResult() {
|
||||
stopBinaryRain(); // 停止生成粒子
|
||||
ritual.style.opacity = '0';
|
||||
setTimeout(() => {
|
||||
ritual.style.display = 'none';
|
||||
result.style.display = 'block';
|
||||
requestAnimationFrame(() => {
|
||||
result.style.opacity = '1';
|
||||
result.style.transform = 'translateY(0)';
|
||||
runNumberAnimation();
|
||||
});
|
||||
}, 800);
|
||||
// 填充数据(省略详细代码,与上版相同)...
|
||||
document.getElementById('mainKeyword').innerText = aiData.fortune_report.keyword;
|
||||
document.getElementById('userTag').innerText = aiData.fortune_report.user_tag;
|
||||
document.getElementById('overviewText').innerText = aiData.fortune_report.analysis.overview;
|
||||
}
|
||||
|
||||
function runNumberAnimation() { /* (省略,与上版相同) */
|
||||
document.getElementById('scoreVal').innerText = aiData.fortune_report.score;
|
||||
}
|
||||
|
||||
// 页面加载后启动特效
|
||||
startBinaryRain();
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
91
skills/get-fortune-analysis/lunar_python.py
Executable file
91
skills/get-fortune-analysis/lunar_python.py
Executable file
@@ -0,0 +1,91 @@
|
||||
pip install lunar_python
|
||||
import datetime
|
||||
from lunar_python import Lunar, Solar
|
||||
|
||||
def get_cyber_divination_data(birth_year, birth_month, birth_day, birth_hour=0, birth_minute=0):
|
||||
"""
|
||||
赛博算命核心算法 v2.1
|
||||
- 输出适配 HTML 前端渲染
|
||||
"""
|
||||
|
||||
# --- 基础配置 (简化版) ---
|
||||
GAN_WU_XING = {"甲": "木", "乙": "木", "丙": "火", "丁": "火", "戊": "土", "己": "土", "庚": "金", "辛": "金", "壬": "水", "癸": "水"}
|
||||
ZHI_WU_XING = {"子": "水", "丑": "土", "寅": "木", "卯": "木", "辰": "土", "巳": "火", "午": "火", "未": "土", "申": "金", "酉": "金", "戌": "土", "亥": "水"}
|
||||
RELATIONSHIP = {
|
||||
"木": {"木": "同", "火": "生", "土": "克", "金": "被克", "水": "被生"},
|
||||
"火": {"木": "被生", "火": "同", "土": "生", "金": "克", "水": "被克"},
|
||||
"土": {"木": "被克", "火": "被生", "土": "同", "金": "生", "水": "克"},
|
||||
"金": {"木": "克", "火": "被克", "土": "被生", "金": "同", "水": "生"},
|
||||
"水": {"木": "生", "火": "克", "土": "被克", "金": "被生", "水": "同"}
|
||||
}
|
||||
TEN_GODS = {
|
||||
"同_同": "比肩 (Friend)", "异_同": "劫财 (Rob)",
|
||||
"同_生": "食神 (Artist)", "异_生": "伤官 (Rebel)",
|
||||
"同_克": "偏财 (Windfall)", "异_克": "正财 (Salary)",
|
||||
"同_被克": "七杀 (7-Killings)", "异_被克": "正官 (Officer)",
|
||||
"同_被生": "偏印 (Owl)", "异_被生": "正印 (Seal)"
|
||||
}
|
||||
|
||||
# --- 1. 排盘 ---
|
||||
solar = Solar.fromYmdHms(birth_year, birth_month, birth_day, birth_hour, birth_minute, 0)
|
||||
lunar = Lunar.fromSolar(solar)
|
||||
ba_zi = lunar.getEightChar()
|
||||
day_master = ba_zi.getDayGan()
|
||||
dm_element = GAN_WU_XING[day_master]
|
||||
dm_yin_yang = "阳" if day_master in ["甲", "丙", "戊", "庚", "壬"] else "阴"
|
||||
|
||||
# --- 2. 辅助函数 ---
|
||||
def get_ten_god(target_gan):
|
||||
if not target_gan: return ""
|
||||
target_element = GAN_WU_XING.get(target_gan) or ZHI_WU_XING.get(target_gan)
|
||||
rel = RELATIONSHIP[dm_element].get(target_element, "同")
|
||||
|
||||
# 简化阴阳判定
|
||||
target_yy = "阳" if target_gan in ["甲", "丙", "戊", "庚", "壬", "寅", "申", "巳", "亥"] else "阴"
|
||||
is_same = (dm_yin_yang == target_yy)
|
||||
key = f"{'同' if is_same else '异'}_{rel if rel in ['生','克','被生','被克'] else '同'}"
|
||||
return TEN_GODS.get(key, "未知")
|
||||
|
||||
# --- 3. 旺衰硬规则 ---
|
||||
score = 0
|
||||
month_zhi = ba_zi.getMonthZhi()
|
||||
m_ele = ZHI_WU_XING[month_zhi]
|
||||
|
||||
# 得令 (+40)
|
||||
if RELATIONSHIP[dm_element][m_ele] in ["同", "被生"]: score += 40
|
||||
elif RELATIONSHIP[dm_element][m_ele] == "被克": score -= 20
|
||||
|
||||
# 得地 (+15/each)
|
||||
for zhi in [ba_zi.getYearZhi(), ba_zi.getDayZhi(), ba_zi.getTimeZhi()]:
|
||||
if ZHI_WU_XING[zhi] == dm_element: score += 15
|
||||
|
||||
body_strength = "身强 (Strong)" if score >= 40 else "身弱 (Weak)"
|
||||
strength_cn = "身强" if score >= 40 else "身弱"
|
||||
|
||||
# --- 4. 流年 ---
|
||||
current_year = datetime.datetime.now().year
|
||||
# 简单的流年计算 (以立春为界需要更复杂逻辑,这里简化取当年农历年干支)
|
||||
# 修正:直接用 Lunar 获取当年的干支
|
||||
current_lunar = Lunar.fromYmd(current_year, 6, 1)
|
||||
annual_gan = current_lunar.getYearGan()
|
||||
annual_zhi = current_lunar.getYearZhi()
|
||||
|
||||
annual_god = get_ten_god(annual_gan)
|
||||
|
||||
return {
|
||||
"meta": {
|
||||
"solar_date": f"{birth_year}-{birth_month}-{birth_day}",
|
||||
"lunar_date": f"{lunar.getYearInChinese()}年{lunar.getMonthInChinese()}月{lunar.getDayInChinese()}"
|
||||
},
|
||||
"bazi": {
|
||||
"day_master": day_master,
|
||||
"element": dm_element,
|
||||
"strength": strength_cn,
|
||||
"score": score
|
||||
},
|
||||
"fortune": {
|
||||
"current_year": f"{current_year} ({annual_gan}{annual_zhi})",
|
||||
"year_god": annual_god.split(" ")[0], # 只取中文名,如 "七杀"
|
||||
"lucky_direction": lunar.getDayPositionCaiDesc() # 财神方位
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user