Knowledge Base Skill
支持图片附件与OCR的文字提取,按业务类型管理问答知识库。
基于瑞士星历计算月相、个人情绪周期及月亮对命盘的影响,生成图文报告。
openclaw skills install @dynamicsalex/astro-lunar-insights命令、参数、文件名以原文为准
此技能计算月相并从多个占星学角度分析月亮对个人的影响。图表包含左右并列的两个轮盘(月相轮 + 出生盘与过运月亮的结合),下方为三组水平图例,右侧为文字分析面板。
图表始终包含一个二维码(用于捐赠),默认使用捆绑的 frame_small.png.dat;用户可通过 --frame 参数自定义。
所有行星位置均通过 瑞士星历表 库(pyswisseph 2.10.3.2)计算,基于 NASA 的 JPL DE431 星历数据。行星位置精度:约 0.003°。宫位宫头采用 普拉西杜斯系统,通过 swe.houses_ex() 计算。
| 要求 | 详情 |
|---|---|
| 操作系统 | Windows(x64) |
| Python | 3.14.x |
| 运行时环境 | Microsoft Visual C++ Redistributable 2015–2022(x64) |
| Pillow | 12.x — pip install pillow |
| 瑞士星历表 | 内置为 swisseph.cp314-win_amd64.pyd.dat |
lunar_analysis.py --json → JSON 数据(所有月相关指标) → draw_lunar.py → PNG 图像
↕
lunar_analysis.py → 文字分析输出lunar_analysis.py 是唯一的计算引擎。draw_lunar.py 通过子进程调用它来生成图表。
月亮相对于太阳的位置(角距):
同时计算:光照百分比、与地球距离(公里)、最近月相的确切日期。
最重要的个人月相指标。过运月亮在约 28 天周期内与出生月亮形成各种相位:
| 相位 | 时间点 | 含义 |
|---|---|---|
| 合相 | 每约 28 天 | 个人新月 — 情绪重启,新周期开始 |
| 四分相 | 约第 7 和第 21 天 | 危机点 — 需要行动,情绪紧张 |
| 对冲 | 约第 14 天 | 个人满月 — 情绪高潮,意识觉醒 |
| 六分相 | 约第 7 和第 21 天 | 和谐 — 直觉顺畅,适合规划 |
| 十二分相 | 约第 4 和第 24 天 | 机会 — 轻柔支持 |
| 五分相 | 约第 11 和第 17 天 | 调整 — 需要重新校准 |
| 半四分相 | 约第 3.5 和第 10.5 天 | 小困扰 |
| 三分之二四分相 | 约第 10.5 和第 17.5 天 | 不安 — 打破旧模式 |
| 半十二分相 | 约第 2 和第 16 天 | 微弱影响 |
月亮相对于出生太阳的位置定义了个人月周期(约 29.5 天):
| 阶段 | 角距 | 含义 |
|---|---|---|
| 个人新月 | 0° | 个人周期起点。内向能量。启动新项目。 |
| 个人新月盈 | 45° | 初步显现。能量积累。迈出第一步。 |
| 个人上弦月 | 90° | 行动节点。挑战出现。坚持前行。 |
| 个人盈凸 | 135° | 优化阶段。调整方法。 |
| 个人满月 | 180° | 高潮。最大觉察。情绪揭示。 |
| 个人传播期 | 225° | 分享。传授所学。 |
| 个人下弦月 | 270° | 意识危机。学会放手。 |
| 个人残月 | 315° | 休憩。反思。为下一周期做准备。 |
显示哪个生活领域被情绪激活:
| 宫位 | 生活领域 |
|---|---|
| I | 个性、外貌、自我 |
| II | 金钱、价值观、资源 |
| III | 沟通、兄弟姐妹、学习 |
| IV | 家庭、居所、根源 |
| V | 创造力、子女、浪漫 |
| VI | 健康、工作、日常事务 |
| VII | 伴侣关系、婚姻 |
| VIII | 转化、共享资源 |
| IX | 哲学、旅行、高等教育 |
| X | 职业、声誉、公众形象 |
| XI | 朋友、团体、希望 |
| XII | 潜意识、独处、业力 |
从新月到新月共 30 个“月日”,每个具有特定能量:
月亮每日移动速度影响情绪处理方式:
同时追踪接近近地点(更近则更强)或远地点(更远则更弱)。
完整呈现过运月亮与每个出生行星的互动关系,显示哪些心理功能处于情绪激活状态。
# 今日分析
python scripts/lunar_analysis.py 24.04.1983 07:00 Ижевск --lang ru --name "Алексей"
# 任意指定日期分析
python scripts/lunar_analysis.py 24.04.1983 07:00 Ижевск --target-date 05.06.2026 --lang ru
# 英文输出
python scripts/lunar_analysis.py 24.04.1983 07:00 Ижевск --lang en
# JSON 输出(供渲染器 / AI 使用)
python scripts/lunar_analysis.py 24.04.1983 07:00 Ижевск --target-date 05.06.2026 --json# 今日图表(俄语)
python scripts/draw_lunar.py 24.04.1983 07:00 Ижевск --lang ru --name "Алексей"
# 任意指定日期图表
python scripts/draw_lunar.py 24.04.1983 07:00 Ижевск --target-date 05.06.2026 --lang ru --name "Алексей"
# 英语
python scripts/draw_lunar.py 24.04.1983 07:00 Ижевск --target-date 05.06.2026 --lang en --name "Alexey"| 参数 | 说明 |
|---|---|
date | 出生日期 DD.MM.YYYY |
time | 出生时间 HH:MM |
city | 出生城市 |
--target-date | 目标日期,格式为 DD.MM.YYYY 或 YYYY-MM-DD(默认:今天)。支持任意过去、现在或未来的日期。若省略,则使用系统当前日期。 在 lunar_analysis.py 和 draw_lunar.py 中均支持。 |
--lang | 语言:ru 或 en(默认:ru) |
--name | 显示用的姓名 |
--json | 输出 JSON 格式而非文本 |
--output | 将 JSON 直接写入文件(UTF-8 编码,绕过控制台编码限制) |
--conclusion | 包含 AI 生成结论的 JSON 文件路径 |
{
"name": "Алексей",
"birth_date": "24.04.1983",
"birth_time": "07:00",
"birth_city": "Ижевск, Россия",
"target_date": "05.06.2026",
"moon_phase": {
"name": "Waning Gibbous",
"elongation": 236.33,
"illumination": 77.7,
"distance_au": 0.002669,
"distance_km": 399206
},
"nearest_phases": {
"New Moon": {"date": "15.06.2026", "days_diff": 9.6},
"Full Moon": {"date": "31.05.2026", "days_diff": -5.1}
},
"lunar_day": {"number": 20, "meaning_ru": "День орла..."},
"transit_moon": {"lon": 311.18, "sign": "Capricorn", "speed": 12.14},
"transit_moon_to_natal_moon": {"aspect": "Sesquiquadrate", "orb": 0.91},
"personal_phase": {"key": "last_quarter", "name_ru": "Персональная последняя четверть"},
"transit_moon_house": {"house": 7, "title_ru": "Партнёрство, брак..."},
"moon_speed": {"speed": 12.14, "description_ru": "Нормальная..."},
"transit_moon_aspects": [
{"transit": "Moon", "natal": "Sun", "aspect": "Square", "major": true, "orb": 7.6}
],
"engine": "Swiss Ephemeris v20230604"
}+---------------------------+---------------------------+-------------------+
| | | |
| ФАЗА ЛУНЫ | НАТАЛЬНОЕ КОЛЕСО | TEXT ANALYSIS |
| MOON PHASE WHEEL | NATAL CHART WHEEL | PANEL |
| (3400/2 = 1700 wide) | (1700 wide) | (2360×2880) |
| | | |
| - Phase circle | - Sign sectors (elements)| - Moon phase |
| - Illumination % center | - House cusps (Placidus) | - Nearest phases |
| - Phase degree markers | - Natal planets (circles | - Lunar day |
| - Current position | with letter codes) | - Moon aspects |
| indicator (yellow) | - Transit Moon (outer | - Personal phase |
| | orbit, highlighted) | - House |
| | - ASC/MC lines | - Moon speed |
| | - Aspect lines (colored) | - All aspects |
| | | - Conclusion |
| | | |
+---------------------------+---------------------------+-------------------+
图例(位于两个轮盘下方,三组等高并列):
┌─────────────────┬─────────────────┬─────────────────┐
│ ПЛАНЕТЫ │ АСПЕКТЫ │ СТИХИИ │
│ (PLANETS) │ (ASPECTS) │ (ELEMENTS) │
│ │ │ │
│ ♈ SU Sun │ □ Conj │ ■ Огонь │
│ ♉ MO Moon │ ✶ Sext │ ■ Земля │
│ ♊ ME Mercury │ □ Sqr │ ■ Воздух │
│ ... │ △ Trine │ ■ Вода │
│ │ □ Qnc │ │
│ │ ☍ Opp │ │
└─────────────────┴─────────────────┴─────────────────┘scripts/ 目录中包含两个内置字体:
| 字体 | 用途 | 扩展名 |
|---|---|---|
seguisym.ttf.dat | 黄道符号 ♈♉♊… 以及行星符号 ☉☽☿… | .dat(ClawHub 兼容) |
segoeuisl.ttf.dat | 希腊字母、拉丁字母、数字 | .dat(ClawHub 兼容) |
运行时会自动复制为 .ttf 格式以兼容 Pillow。
| 脚本 | 用途 | 依赖项 |
|---|---|---|
scripts/lunar_analysis.py | 核心计算引擎。 所有月相数据、文本与 JSON 输出。 | swisseph, math, json |
scripts/draw_lunar.py | 渲染器。 调用 lunar_analysis.py --json,绘制 5760×2880 的图表。 | subprocess, json, math, Pillow |
scripts/swisseph.cp314-win_amd64.pyd.dat | Swiss Ephemeris 二进制文件(2 MB)——JPL DE431 天文历表 | MSVC++ Redist |
scripts/seguisym.ttf.dat | 黄道与行星符号字体 | — |
scripts/segoeuisl.ttf.dat | 希腊语/拉丁语字体 | — |
步骤 1: python scripts/lunar_analysis.py <date> <time> <city> --json --target-date <date>
步骤 2: AI 分析 JSON 并将增强后的结论写入 JSON 文件
(详见下方 AI 结论 JSON 格式)
步骤 3: python scripts/draw_lunar.py <date> <time> <city> --lang ru --name "Name" --conclusion <file.json>当提供 --conclusion 时,AI 生成的文本将原样用于图表中。
每个指标对应一个解释部分(1–8),整体总结显示在第 9 部分(结论)。
若未提供 --conclusion,脚本将使用内置的自主解释。
结论文件必须在顶层包含指标键(不嵌套于 metrics 内)。
每个指标包含一个 interpretation 字段(字符串、包含 description 的字典,或元组)。
overall 字段包含第 9 部分的总体摘要。
⚠️ 规则:在可能的情况下,始终提供完整的 AI 扩展解读。
自主解读(内置脚本中)仅作为 CLI 使用时的备用方案。当该技能通过 OpenClaw 代理调用时,代理 必须 分析 JSON 数据,并为所有指标生成扩展解读。这是高质量预测与模板化输出的关键区别。
步骤 1: python scripts/lunar_analysis.py <日期> <时间> <城市> --json --target-date <日期>
步骤 2: AI 分析 JSON 并为所有指标提供扩展解读
步骤 3: AI 生成包含整体总结的结论 JSON 文件
步骤 4: python scripts/draw_lunar.py <日期> <时间> <城市> --lang ru --name "姓名" --conclusion <文件.json>缺少步骤 3 和 4 时,生成的图表将仅包含自主模式下的简短解读。
AI 应重点关注:
问题: Windows 控制台(cmd/PowerShell)在重定向 stdout 时使用 cp1251/cp866 编码,即使设置了 PYTHONIOENCODING=utf-8 仍会导致 UTF-8 输出异常。
解决方案: lunar_analysis.py 支持 --output file.json 参数,该参数直接以 UTF-8 编码将 JSON 写入文件,完全绕过控制台编码问题。draw_lunar.py 内部已使用此机制 — 它通过传递 --output /tmp/lunar_analysis_tmp.json 给子进程,并直接读取该文件。
对于 CLI 用户: 在重定向输出到文件时,请使用 --output:
python scripts/lunar_analysis.py 24.04.1983 07:00 Ижевск --lang ru --json --output result.json若需在终端中显示文本,请设置 PYTHONIOENCODING=utf-8 并执行 chcp 65001(cmd)或在 PowerShell 中使用 $env:PYTHONIOENCODING='utf-8'。
本工具为娱乐与教育用途,非科学方法。请勿根据占星解读做出医疗或财务决策。
--frame 参数默认使用内置的 frame_small.png.dat,不再为可选。用户无需再显式传入 --frame。--frame 现已注明具有内置默认值。lunar_analysis.py 添加 --output file.json 参数 — 直接以 UTF-8 编码写入文件,避免 Windows 控制台 cp1251 编码问题。draw_lunar.py 现在通过临时文件内部使用 --output 进行子进程通信。lunar_{name}_{date}_{lang}.png。.ttf 与 .pyd 文件打包为 .dat 格式(ClawHub 兼容),运行时自动复制。__pycache__ 及从技能目录生成的 .ttf/.pyd 文件。seguisym.ttf 字体渲染图形化相位符号(△ □ ✶ ☌ ☍ ⚹ ⚺ ∠),而非文字名称(如三合、四分等),与图例风格一致_get_word_color 和 ASP_SYMBOL_COLORS 映射表,将相位符号以占星学对应颜色显示(如绿色 △、红色 □、蓝色 ✶ 等)draw_lunar.py 增加 --target-date 参数支持** — 之前仅 lunar_analysis.py 通过位置参数支持目标日期;现在两个脚本均支持 --target-datedraw_lunar.py 将 --target-date 参数传递给 lunar_analysis.py 的子进程调用lunar_analysis.py 中 --target-date 作为显式标志** — 之前仅支持作为第4个位置参数;现也支持作为 --target-date 标志,保持一致性--target-date 支持 DD.MM.YYYY 和 YYYY-MM-DD 两种格式max_w = w // 2 - 20),实现两倍更快的断行处理overall 文本)还是自主模式(显示 summary.cycle_energy + summary.intensity)下均持续展示interp_text() 的健壮性**:现可处理所有结论数据格式——字符串、列表、包含 description 键的字典、包含 interpretation 键的字典、元组nonlocal y 模式替换为可变列表 _y = [y],避免嵌套绘图函数中出现 UnboundLocalErrordraw_lunar.py.bak 和 draw_lunar.py.bak2 文件保留,用于回滚moon_phase, lunar_day 等),每个键包含 interpretation 字段;仅 overall 字段用于第9节总结interp_text() 和 show_interp()** 在 draw_text_panel 中统一提取来自字典、元组或字符串格式的解释文本overall 内容lunar_{name}_{date}_{lang}.png已收录 1 个 Skill