fix(ncm): weapi挂死根因修复 (agent-207, 6缺陷叠加) — ①超时改CLOCK_MONOTONIC(墙钟NTP回拨致poll超长阻塞) ②响应头解析隔行跳行漏Content-Length ③请求头缓冲1KB→8KB ④cookie值截断192B致MUSIC_U不完整被当游客(改ptr+len不截断+按名去重) ⑤split处NUL覆盖body首字节 ⑥Content-Length:0直接DONE; status_check硬上限6s; 803后worker线程取uid/nick落盘(修uid恒空)

ncm→bf6d2a79 已部署; 真机1次验证(风控合规): status_check 721ms rc=0 uid=408996274; user_playlist 2.5s rc=0 count=64
This commit is contained in:
MeowOS committed 2026-08-31 09:00:23 +08:00
1 parent 4ff8c8baa3
commit a651df0e9b
19 files changed
+466 -71

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
/* verify_home.c — 最终确认:复刻 App home 的完整链路(status_check 取 uid → user_playlist 拉歌单)。
* 用与 App 完全相同的固定 core 库。真机只跑一次(风控:真实 cookie 请求严格受限)。
* 用法: ./verify_home [data_dir] [cacert]
*/
#include "ncm.h"
#include "ncm_http.h"
#include "ncm_common.h"
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
const char *data_dir = argc > 1 ? argv[1] : "/usr/data/mnt/sd_0/MeowData/os.meow.ncm/data";
const char *cacert = argc > 2 ? argv[2] : "/usr/data/mnt/sd_0/MeowAPPs/os.meow.ncm/cacert.pem";
ncm_ctx_t ctx;
ncm_ctx_init(&ctx, data_dir);
printf("device_id=%s cookie_len=%zu\n", ctx.device_id, strlen(ctx.cookie));
ncm_http_set_verify_default(1, cacert);
/* 1) status_check 取 uid/nickname */
char uid[32], nick[128];
long t0 = (long)ncm_now_ms();
int rc = ncm_login_status_check(ctx.device_id, ctx.cookie, uid, sizeof uid, nick, sizeof nick);
long dt = (long)ncm_now_ms() - t0;
printf("status_check rc=%d elapsed_ms=%ld uid=%s nick=%s\n", rc, dt, uid, nick);
if (rc != NCM_OK) { printf("VERIFY FAIL: status_check not OK\n"); return 1; }
/* 2) user_playlist 拉歌单 */
ncm_playlist_t pls[64];
int n = 0;
t0 = (long)ncm_now_ms();
rc = ncm_api_user_playlist(ctx.device_id, ctx.cookie, uid, 30, 0, pls, 64, &n);
dt = (long)ncm_now_ms() - t0;
printf("user_playlist rc=%d elapsed_ms=%ld count=%d\n", rc, dt, n);
if (rc != NCM_OK) { printf("VERIFY FAIL: user_playlist not OK\n"); return 1; }
for (int i = 0; i < n && i < 8; i++)
printf(" [%d] %s (%d tracks)\n", i, pls[i].name, pls[i].track_count);
printf("VERIFY OK: user=%s playlists=%d\n", uid, n);
return 0;
}