feat(ncm): 风控加固——接口响应短 TTL 缓存 + 游客 MUSIC_A + track/all 死代码
三(按 NCMAPI_NOTES §2.1/§4/§6):
① 接口级响应缓存(对齐参考 apicache 2 分钟,防风控高频 ip 错误):
- 新增 core/ncm_apicache.{c,h}——内存 4 槽 LRU(单槽≤128KB,TTL 120s,
键=md5(path+\x01+json))+ 可选盘缓存 <data_dir>/ncm_api_cache/.json
(8B 墙钟头+body,超 TTL miss 并删,30s 节流清过期)。自包含模块
(仅 libc+pthread+clock_gettime),可独立链接无符号冲突。
- ncm_api.c:api_post 拆「请求+解析」两段,新增 api_post_cached;四个只读
接口接线:user_playlist/playlist_detail/song_detail/cloudsearch。
song_url/lyric/vip 不入缓存。
- 手动刷新绕过:ncm_api_cache_refresh_path(path) 一次性标记;home/歌单
topbar ↻ 接入;playlist_open/search 不标记(走缓存)。
- 盘层挂载 appstate_init;登出 appstate_logout 全清(防串账号)。
② 游客 MUSIC_A:ncm_req.c weapi+eapi 无 MUSIC_U 且非 login 路径补
MUSIC_A=anonymous_token(对齐参考 cookie 伪装)。
③ track/all 死代码清理:移除 ncm_api_playlist_track_all(真实服务器 8 形态全
404,无调用点);ncm_api_parse_track_all 保留(离线重放/单测),注释标注
「已验证不存在,勿用于真实请求」。
验证:新 bench/apicache_sim.c(0 网络)①TTL 内不重复请求/②过期重拉/③手动
刷新绕过/④cloudsearch 按键区分/⑤清空重拉/⑥盘缓存写入+clear 全 PASS;stream/
player_flow/window/search/cache_evict(1-9)/pagination/playlist_race sim 全
PASS;test_ncm_core host+mipsel(qemu) PASS;build_ncm.sh -Wall -Wextra 0
warning(text 1026914/data 1664/bss 1363460);0 高频真实请求。新 ncm md5
a69c93538920eba9d42a2ebb42f8fdca(留主会话上卡)。
This commit is contained in:
1 parent
9d5301f931
commit
ea645ce2a6
17 files changed
+717
-74
No files matched your search
@@ -3187,3 +3187,64 @@ d102c64f7fab73e981a789c5960e6bd9 ncm_host # 宿主调试二进
|
||||
防止同 incident 二次兜底(新图也死时不再回 song/detail)。
|
||||
- **歌单封面兜底语义未变**:兜底链两级都失败后仍清目标、保留当前显示封面(歌单封面在进歌单时已由
|
||||
`cover_request(pcur->cover, NULL)` 取到)。未新增对 `g_st.cover_url` 的主动重取。
|
||||
|
||||
## 36. 风控加固批:接口级响应短 TTL 缓存 + 游客 MUSIC_A + track/all 死代码(2026-09-02)
|
||||
|
||||
> 依据:NCMAPI_NOTES(319 权威接口地图)§2.1/§4/§6。仅改 `patch_v2/ncm_app/`。
|
||||
> 三项:①位只读接口响应缓存(对齐参考 apicache 2 分钟);②游客 `MUSIC_A=anonymous_token`;③清理死代码。
|
||||
|
||||
### 36.1 ① 接口级响应短 TTL 缓存(user_playlist / playlist_detail / song_detail / cloudsearch)
|
||||
|
||||
- 新增 **`core/ncm_apicache.{c,h}`**(自包含:仅 libc+pthread+clock_gettime,不依赖 ncm_store/ncm_crypto/ncm_common 函数,可独立链接)。
|
||||
- **内存**:4 槽 LRU,单槽 ≤128KB,TTL 默认 120s;键 = md5(`path` + `\x01` + 参数 json)。超 TTL 过期、超容量逐 LRU 最旧。
|
||||
- **盘(可选)**:`<data_dir>/ncm_api_cache/<key>.json`,文件头 8B 墙钟毫秒 + body;超 TTL 视为 miss(并删除);写入按 30s 节流清过期文件,磁盘占用有界。
|
||||
- 失效:登出/换账号 `ncm_apicache_clear` 全清;盘超 TTL 自然过期。
|
||||
- **`core/ncm_api.c`**:`api_post` 拆为「请求(ncm_http)+解析」两段;新增 `api_post_cached`(先查缓存、miss/过期/手动刷新→真网络、成功后写缓存)。四个只读接口路由到 `api_post_cached`:`user_playlist`(weapi) / `playlist_detail`(eapi,v6) / `song_detail`(eapi,v3) / `cloudsearch`(weapi)。`song_url`/`lyric`/`vip` **不入缓存**(逐曲/需新鲜/低频)。
|
||||
- **手动刷新绕过**:`ncm_api_cache_refresh_path(path)` 标记某路径下一次调用绕过缓存(一次性消费)。接入 home topbar ↻(`/api/user/playlist`) 与歌单 topbar ↻(`/api/v6/playlist/detail`);`playlist_open`/`search` 不标记(走缓存)。
|
||||
- 盘层挂载:`appstate_init` → `ncm_apicache_init(g_st.data_dir)`;`appstate_logout` → `ncm_apicache_clear()`。
|
||||
|
||||
### 36.2 ② 游客 MUSIC_A(未登录 cookie 伪装,NCMAPI_NOTES §4)
|
||||
|
||||
- `core/ncm_req.c`:weapi 分支(无 `MUSIC_U` 且非 login 路径)补 `MUSIC_A=anonymous_token` 进会话 cookie;eapi 分支同样(无 `MUSIC_U` 且非 login 路径)追加到 eapi Cookie 头。与参考「常驻 cookie 伪装」对齐,降低未登录需登录接口被服务端判定异常(401/400 需验证)概率。
|
||||
|
||||
### 36.3 ③ track/all 死代码清理(NCMAPI_NOTES §1.1 实锤 404)
|
||||
|
||||
- `core/ncm_api.c`/`.h`:**移除**网络封装 `ncm_api_playlist_track_all`(真实服务器无 `/api/playlist/track/all`,8 形态全 404;无任何调用点)。
|
||||
- `ncm_api_parse_track_all`(离线解析器)**保留**供 `offline_track_all`/`probe_track_all`/`test_ncm_core` 离线重放/单测(0 请求),注释标注「已验证端点不存在,仅离线单测用,勿用于真实请求」。
|
||||
|
||||
### 36.4 验证(宿主 + qemu;新缓存用例 0 真实网络请求)
|
||||
|
||||
| 项 | 结果 |
|
||||
|---|---|
|
||||
| 新增 `bench/apicache_sim.c`(真实 core + ncm_http 计数桩,0 网络) | **ALL PASS**:TTL 内不重复请求 / 过期重拉 / 手动刷新绕过 / cloudsearch 按键区分 / 清空重拉 / 盘缓存写入+clear |
|
||||
| `stream_sim` / `player_flow_sim` / `window_sim` / `search_sim` | ALL PASS |
|
||||
| `cache_evict_sim`(1-9)/ `pagination_sim` / `playlist_race_sim` | PASS |
|
||||
| `test_ncm_core_host` + `qemu test_ncm_core_mipsel` | host + mipsel **PASS** |
|
||||
| `build_ncm.sh`(-Wall -Wextra) | **0 warning**;`text 1026914 / data 1664 / bss 1363460` |
|
||||
| `build_ncm_host.sh` | 0 warning(仅 SDK `meow_ui_vol.c` 存量 `system()` 告警,非本批) |
|
||||
| UI 渲染 `NCM_PAGE=home MEOW_UI_DUMP` | exit=0,dump 正常 |
|
||||
|
||||
改动文件(本批,仅这些;未动 sdk/、devdocs/、其它 App):
|
||||
```
|
||||
修改:
|
||||
core/ncm_api.c # api_post 拆分 + api_post_cached + 四接口接线 + 刷新路径 + 移除 track_all 网络版 + 解析器注释
|
||||
core/ncm_api.h # 移除 ncm_api_playlist_track_all 声明 + parse_track_all 注释 + ncm_api_cache_refresh_path
|
||||
core/ncm_req.c # weapi/eapi 游客 MUSIC_A 注入
|
||||
core/ncm.h # 伞头加 ncm_apicache.h
|
||||
app/logic/appstate.c # init/logout 接 ncm_apicache
|
||||
app/ui/home.c # 手动刷新标记 /api/user/playlist
|
||||
app/ui/playlist.c # 手动刷新标记 /api/v6/playlist/detail
|
||||
build_core.sh / build_ncm.sh / build_ncm_sims.sh # 加 ncm_apicache.c;window/search sim 链 ncm_apicache.o
|
||||
ncm / ncm_host / test/test_ncm_core_host # 产物重链
|
||||
新增:
|
||||
core/ncm_apicache.c / core/ncm_apicache.h # 接口级响应短 TTL 缓存(内存+盘)
|
||||
bench/apicache_sim.c # 缓存用例(0 网络)
|
||||
REPORT.md # 本批记录(§36)
|
||||
```
|
||||
|
||||
### 36.5 遗留 / 诚实出入
|
||||
|
||||
- **缓存 TTL=120s 的内存槽上限 4×128KB**:大歌单 `playlist_detail`(trackIds >128KB)不入内存、仅盘缓存(内存瘦身口径 REPORT §32);命中读盘+重解析,避免把上千首 trackIds 常驻内存。
|
||||
- **手刷只标详情接口**:歌单手动刷新只绕过 `v6/playlist/detail`(列表结构),`song_detail` 批 2 分钟内走缓存(改动歌曲为新键自然 miss,元数据 ≤2min 旧可接受);home 刷新绕过 `user/playlist`。
|
||||
- **eapi 分支未注入 MUSIC_U**(登录态 eapi 播放接口仍走原有的非-cookie 鉴权路径)——本次仅按任务补游客 MUSIC_A;MUSIC_U 头注入留后续(超范围)。
|
||||
- **盘缓存读路径未在真机/宿主整链实测**(内存命中优先,盘仅在内存 miss/大体时兜底)——代码审查 + 文件存在性断言验证;真机可观察 `ncm_api_cache/` 落盘与热更后命中。
|
||||
Reference in new issue
Block a user