星座运势查询的指数怎么读:5 分制与 100 分制两套口径

约 10 分钟 进阶星座运势查询指数解读5分制100分制
# 星座运势查询的指数怎么读:5 分制与 100 分制两套口径 接入点 872-1 · 免费服务 · POST / GET · 返回 JSON · 适用:前端、数据展示工程师 · 阅读时间:约 6 分钟 · 最后实测核对:2026-09-18 ## 核心要点 - 星座运势查询接口(apiCode=872)的日、明日、周、月四个周期用 5 分制,指数字段是 `summary_star`、`love_star`、`money_star`、`work_star`。 - `year` 换成 100 分制,字段名也换了:`general_index`、`love_index`、`money_index`、`work_index`。 - 两套口径在类型上也不一样。2026-09-18 实测 5 分制的指数是数字,`year` 的指数是带「分」字的字符串。 ## 为什么两套口径会混 把五个周期喂给同一个星级组件,会出现两种错法。一种是把 `year` 的 `general_index` 当 5 分制渲染,`"77分"` 直接撑出 77 颗星。另一种是把日维度的 `4` 按 100 分制换算,显示成 4%,看起来像是运势极差。 让展示层先判断周期,再选满分值,就不会混。 ## 两套口径对照 | 周期 | 指数字段 | 满分 | 类型(2026-09-18 实测) | 实测样例 | |---|---|---|---|---| | `day` | `summary_star`、`love_star`、`money_star`、`work_star` | 5 | 数字 | `4`、`3`、`5` | | `tomorrow` | 同上 | 5 | 数字 | `4` | | `week` | 同上 | 5 | 数字 | `4`、`3` | | `month` | 同上 | 5 | 数字 | `4` | | `year` | `general_index`、`love_index`、`money_index`、`work_index` | 100 | 字符串带「分」 | `"77分"`、`"79分"` | 接口文档原文口径:日、周、月的指数标注为「最高 5 分」,`year` 的四个指数标注为「最高 100 分」。 ## 展示层映射 Python: ```python def render_stars(value, is_year: bool) -> str: """把两种口径的指数统一成 5 颗星展示。""" max_score = 100 if is_year else 5 num = int(str(value).replace("分", "")) # 兼容 "77分" 与 4 两种形态 filled = round(num / max_score * 5) filled = max(0, min(5, filled)) # 兜住越界值 return "*" * filled + "-" * (5 - filled) # 日维度 print(render_stars(body["day"]["summary_star"], False)) # 年维度 print(render_stars(body["year"]["general_index"], True)) ``` cURL 与 Node.js 的取数写法: ```bash curl -G "https://route.showapi.com/872-1" \ --data-urlencode "appKey=YOUR_APPKEY" \ --data-urlencode "star=shizi" \ --data-urlencode "needYear=1" \ --max-time 15 ``` ```javascript const url = new URL("https://route.showapi.com/872-1"); url.searchParams.set("appKey", "YOUR_APPKEY"); url.searchParams.set("star", "shizi"); url.searchParams.set("needYear", "1"); const data = await (await fetch(url, { signal: AbortSignal.timeout(15000) })).json(); const body = data.showapi_res_body; if (String(body.ret_code) !== "0") throw new Error(body.remark); const toNum = v => parseInt(String(v).replace(/[^\d]/g, ""), 10); const stars = (v, isYear) => { const max = isYear ? 100 : 5; const n = Math.max(0, Math.min(5, Math.round(toNum(v) / max * 5))); return "*".repeat(n) + "-".repeat(5 - n); }; console.log(stars(body.day.summary_star, false)); console.log(stars(body.year.general_index, true)); ``` ## 返回示例(2026-09-18 真实返回,长文案已截断) ```json { "showapi_res_code": 0, "showapi_res_body": { "day": { "summary_star": 4, "love_star": 3, "money_star": 4, "work_star": 5, "time": "20260918" }, "year": { "general_index": "77分", "love_index": "77分", "money_index": "75分", "work_index": "79分", "time": "2026" }, "star": "shizi", "ret_code": 0 } } ``` 同一个响应里,`day.summary_star` 是数字 `4`,`year.general_index` 是字符串 `"77分"`。取值时统一走一次 `str()` 加去单位,两种都能接住。 ## 类型处理 接口文档把五个周期的指数都描述为数值;2026-09-18 实测 5 分制的四项确为数字,`year` 的四项为带「分」字的字符串。 代码里不要写 `typeof value === "number"` 这类强判断。统一用 `int(str(value).replace("分", ""))` 转换,无论上游给数字还是字符串都能算。 ## 跨周期比较 5 分制衡量的是单日或单周的具体表现,100 分制衡量的是整年趋势,两者的语义与量纲都不同。做趋势图时按各自的满分归一化,不要直接把 `4` 和 `77` 放进同一根轴。 `year` 也没有爱情、工作之外的小维度,UI 上不要硬套日维度的四宫格模板。 ## FAQ **Q1:为什么年是 100 分、日是 5 分?** 接口设计上的两套口径,接口文档分别标注为「最高 5 分」与「最高 100 分」。展示时各按各的满分归一化。 **Q2:`summary_star` 到底是字符串还是数字?** 2026-09-18 实测日、明日、周、月四个周期返回的都是数字,`year` 的四个 `*_index` 返回的是带「分」字的字符串。统一做一次字符串化加去单位转换即可兼容。 **Q3:能把 5 分制乘以 20 换成百分制展示吗?** 数值上可以换算,但两套指标的语义不同。日维度是单日细分表现,年维度是全年趋势,建议分别展示。 **Q4:`general_index` 怎么取值?** 先去单位再转数值:`int(str(body["year"]["general_index"]).replace("分", ""))`,得到 `77`。 **Q5:四个指数里哪个适合做曲线?** 同一周期内、同一指数字段适合做时间轴曲线。跨周期拼接需要先归一化,否则曲线的量级会跳变。 ## 下一步阅读 - [星座运势查询返回字段全解:五个周期的字段对照](https://www.showapi.com/guides/horoscope-response-fields-872) - [星座运势查询:一次取齐五个周期的 needX 开关规则](https://www.showapi.com/guides/horoscope-multi-period-872) - [星座运势查询的缓存怎么设](https://www.showapi.com/guides/horoscope-cache-872) - [星座配对返回字段全解:22 个字段的含义与实测取值](https://www.showapi.com/guides/constellation-match-fields-872) - **本系列共 13 篇**:查看[星座运势 API 指南总目录](https://www.showapi.com/guides/horoscope-guides-872)
加载中...