出生时辰推断 — 通过流年事件反推时辰
触发条件
用户知道自己出生年月日,但不知道具体出生时间(时辰),希望推断出来。
核心原则(两条铁律)
- 问到能确认为止,不设问题数量上限。 不是问三四个就收尾——只要候选还剩 ≥2 个时间点,就继续问(追问新维度、换年份查码),直到收敛到唯一时间点,或穷尽手段后明确告知"无法区分"及原因。
- 不确定就问,绝不自己猜。 任何无法唯一确定的信息都必须向用户提问澄清,包括但不限于:
- 用户说"那大概一年""差不多"→ 问具体公历年份(农历/虚岁也要先换算确认)
- 用户描述的事件能对应多个字母档位(如"还行吧"→ b?a?c?)→ 用具体的追问逼出明确档位:"是顺利得到好处(e~g),还是客观没得到但你心态不错(i),还是平淡无波(a/c)?"
- 用户说"那年挺顺利的"但没说是哪方面 → 问具体维度(感情?工作?收入?社交?)
- 用户只说"出了件事"但说不清方向 → 问清是得到还是失去、主观开不开心
- 用户给出的年份/日期/性别与之前说的矛盾 → 指出矛盾并让用户确认 判断标准:这条信息如果不能 100% 确定地翻译成字母档位或年份,就必须再问一轮。
核心原理
- 出生时间只取 13 个时间点:0, 1, 3, 5, ..., 23(0 点=早子时,1 点=丑时,3 点=寅时,...,23 点=夜子时)。
- 接口
POST https://online.miaoxingjundd.com/api/oa/aiwords返回该出生时间在某年的运势字母码。 - 不同时辰 → 不同字母码。把 13 个时辰的码列出来,同一字母组合的时辰无法区分,不同的就能区分。
- 向用户问"某年发生了什么",翻译成字母含义后,与 13 列比对,逐步淘汰,最终收敛到少数时辰或唯一时辰。
接口(已实测)
请求
POST JSON:
{"birth":"1988-8-6-9","sex":"男","select":"流年","start":2025,"end":2027,"flag":0}
birth格式YYYY-M-D-H,用户只给年月日,HH 用 13 个时间点拼接(0,1,3,5,...,23)。日期补零与否均可(1988-8-6-9和1988-08-06-9实测都有效);2 位年(88-8-6-9)会 502,必须 4 位年。sex:男/女(用户输入)。select固定流年,flag固定0。
关键陷阱(实测,务必遵守)
- 端点是
aiwords(带 s),aiword(不带 s)返回 404。 start/end的实际行为:只返回start那一年(key 为"{start}年")。且end - start < 2时稳定返回"服务器异常"(实测end=Y+1必失败,Y+2起可用)。所以查第 Y 年:固定传start=Y, end=Y+2,若仍报异常则end=Y+3、Y+4、Y+5轮换重试。birth必须带小时:1988-8-6(不带小时)稳定返回"服务器异常",1988-8-6-9(带小时)正常。- 返回结构:
{"code":200,"data":null,"msg":"..."}。真正数据在msg里,是一段中文说明夹着一个 Python 字典字面量:感情运势:{'2025年': {'感情':'g','事业/考试':{'财':'g','印':'g','官':'g','比':'g','食':'g'}}}。字典的key是...解析方法:取:与。之间的文本eval成 dict(仅接口返回的字面量,安全)。 - 偶发 502/服务器异常 → 重试(脚本内置 8 次轮换重试 + 本地缓存)。
字母含义(解读用户事件 ↔ 码 的翻译表)
| 字母 | 含义 | |---|---| | a | 平稳延续:前一年有→今年保持;前一年没有→今年出现 | | b | 客观差强人意/平稳无挫折,但主观不开心、累心 | | c | 客观上没有,或客观不顺 | | d | 不顺,失去或没有 | | e | 顺利,有/获得好处 | | f | 顺利,有/获得好处 | | g | 顺利,有/获得好处 | | h | 客观顺利(得到了),但主观不开心、心情不愉悦 | | i | 客观不顺(没有),但主观比较开心 |
e/f/g 都是"顺利/有/好处",互相无法区分(都是好事),区分度来自 a~d、h、i。解读时重点问"好/坏 + 主观感受"。
维度含义
| 维度 | 含义 | |---|---| | 感情 | 感情走势(顶层 key) | | 财 | 做事执行力、收入、自我成就感 | | 印 | 工作/学业(按年龄判断)、稳定感安全感 | | 官 | 考试、领导关系、客户关系、名气尊重感 | | 比 | 同事朋友关系、社交圈子大小 | | 食 | 物质能力、生活快乐度、是否得到想要的东西 |
工作流
第 1 步:收集信息
问用户:
- 出生年月日(公历)和性别
- 已知出生时间的范围("上午/下午/晚上?家人提过吗?"——有范围直接砍掉一半)
- 让用户回忆 2~4 个记忆清晰的年份 的事(越具体越好:那年感情/工作/考试/收入/社交/开心程度怎样)。优先选事件差异大的年份(如"最好的一年"和"最惨的一年")。
- 若用户说"那年平稳/跟上年一样"→ 字母 a 的判定需要上一年的码,
--prev会多查前一年。
第 2 步:跑脚本拿 13 时间点对照表
python3 {skill_dir}/scripts/aiword_hours.py --birth 1988-8-6 --sex 男 --years 2020,2023,2025
# 需要解读字母a时加 --prev
# 需要原始数据做精确推理时加 --json
- 脚本对 13 个时间点 × 每个年份逐一调用(结果缓存
~/.cache/aiword-hours/,重复查询/换年份组只需增量调用;3 年全量约 5 秒)。 - 输出:①13 时间点 × N 年的字母表 ②按字母组合分组(同组无法区分)③组间差异字段提示。
第 3 步:多轮问答筛选(循环,直到收敛到唯一时间点)
每轮流程:
- 看脚本的"组间差异提示"——差异落在哪个维度(如 2020 年的"比/食"、2023 年的"感情"),就针对那个维度提问。例:
- 差异在
比→ "2020 年你跟同事朋友关系怎样?社交圈子变大还是变小?" - 差异在
感情且码是 h vs g → "2023 年感情有进展吗?得到的过程你开心吗?"(h=得到但不开心 vs g/e/f=得到且开心) - 差异在
dvse→ "2020 年有没有失去/破财/不顺的事?"
- 差异在
- 把用户回答翻译成字母档位(好/坏/平稳/主观感受),对照 13 列淘汰不符的时间点。
- 回答模糊/不确定 → 当场追问澄清(见核心原则2),不要用"我觉得应该是x档"这种猜测继续。
- 若当前年份组区分不完(同组还剩 ≥2 个时间点),换年份再查(
--years追加新年份,缓存复用),然后继续问。 - 若 13 列在某年份组全相同 → 这组年份没用,换年份。
- 候选还没剩到 1 个就继续——这就是"问到确认为止"。每轮只问 1~2 个最有力的问题(节奏问题,不是终止条件)。
第 4 步:给出结论(只在能确认时才下结论)
- 收敛到唯一时间点 → 报:"最可能的出生时间是 XX 点(X 时)",并说明依据(哪些年份哪些维度支持、被淘汰的时间点各被哪条证据排除)。
- 还剩 2~3 个 → 不下最终结论:告诉用户目前缩小到哪几个,再追问 1 个能区分它们的针对性问题(或换年份查码),然后继续第 3 步。
- 穷尽手段仍无法区分(用户对该差异维度的经历描述无法区分、或所有年份都查完了还同组)→ 如实说明:"只能确定出生时间在 X 和 Y(之间),按现有信息无法进一步区分",列出还差什么信息能定(例如"如果告诉我 2018 年你的工作变动情况,就能区分这两个")。
- 诚实说明置信度,不要为了让用户满意而把"大概率是"说成"就是"。
- 时间点 → 时辰对照:0/23 点=子时(23-1 点,分早子/夜子)、1 点=丑时(1-3)、3 点=寅时(3-5)、5 点=卯(5-7)、7 点=辰(7-9)、9 点=巳(9-11)、11 点=午(11-13)、13 点=未(13-15)、15 点=申(15-17)、17 点=酉(17-19)、19 点=戌(19-21)、21 点=亥(21-23)。
注意事项
- 用户口述年份可能是虚岁/农历,先确认"公历 2020 年还是 2021 年?"再查。
- 不要一次问太多问题;每轮基于上轮回答决定下一问(针对性提问是本 skill 的核心价值)。
- 脚本只读接口,无副作用;缓存文件可安全删除。
data字段永远是 null,别看它;数据只在msg里。- 接口可能不稳定(502/服务器异常),脚本已内置
end递增重试;仍失败就过几分钟再试或告知用户。
微信扫一扫