星座运势查询的指数怎么读: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)





