diff --git a/AGENTS.md b/AGENTS.md index de7024c..c135a4b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -195,8 +195,8 @@ $BT/apksigner verify 目标名.apk ### 版本号 -- `app/build.gradle`:`versionName "1.5.8"` / `versionCode 40` - (`1.5.5`/`37` 已发布;`1.5.6` = 更新源加 Gitee、`1.5.7` = 删除「歌曲源临时受限」弹窗、`1.5.8` = 精简远程日志,均尚未发布。18~21 曾被本机临时诊断包占用) +- `app/build.gradle`:`versionName "1.5.9"` / `versionCode 41` + (`1.5.5`/`37` 已发布;`1.5.6` = 更新源加 Gitee、`1.5.7` = 删除「歌曲源临时受限」弹窗、`1.5.8` = 精简远程日志、`1.5.9` = 按 HAR 对齐原版协议,均尚未发布。18~21 曾被本机临时诊断包占用) - App 内显示统一用纯版本号(不加 `(versionCode)` 括号) - ⚠️ **发布构建已开启 NewApi 闸门**(`lint { checkReleaseBuilds true; fatal += ['NewApi'] }`): 任何「调用了高于 `minSdk 21` 且未做版本守卫的 API」都会让 `assembleRelease` 直接失败。 @@ -309,6 +309,25 @@ $BT/apksigner verify 目标名.apk ⚠️ 其 `do.php` 取址行为**尚未定性**(测试时本机出口 IP 配额已被消耗殆尽), 因此置于次位、由运行时自动升降序。 - 该条改动把 `KTV_BRIDGE_API` 由 10 提升到 **11**(同样四处)。 +- **⚠️ 原版协议对齐(2026-10-08,依据 HAR 抓包实测)**:抓包(Reqable,`e.ac19.cn`)显示原版客户端是**三步**: + 1. **`POST /api.php`**:`Content-Type: application/x-www-form-urlencoded`, + body `action=get_config&device_id=`,UA + `Dalvik/2.1.0 (Linux; U; Android <版本>; <型号> Build/)` → + 返回 `{"status":"success","config":{…}}`,字段含 + `network_verification`、`dialog_title`(**"请输入商家提供的正确卡密"**)、 + `trial_enabled`、**`trial_times`**、**`trial_duration`**、`heartbeat_interval`、`server_time`; + 2. `GET /i.php`(参数与我们**完全一致**); + 3. `GET /music/do.php`(参数与我们**完全一致**)。 + - 我们原先**完全没调 `api.php`** ✗ —— 现由 `SongUrlResolver.ensureConfig()` 补上 + (走 `KtvJsBridge.rawCleanPost()`,缓存 30 分钟;桥不可用则跳过)。 + - **`trial_times` 用于限制一次取址尝试的源数量**:实测额度 **2 次 / 5 分钟**, + 原来 9 个源全扫会把额度瞬间打光,紧接着就一直被风控拒绝。 + - ⚠️ **风控拒绝的真实形态是「HTTP 200 + 业务码 403」**: + `{"code":403,"msg":"请求被拒绝:检测到异常行为"}` —— **不是 HTTP 403**。 + 以前只按 HTTP 状态判断,这类响应被当成"没有地址",日志里看不出真因; + 现在 `code == 403` 也置 `sawForbidden`(i.php 与 do.php 两处)。 + - 日志分工照旧:远程一条 `SOURCE-CONFIG trial_enabled=… trial_times=… …`; + 原始 JSON 与"要求卡密"提示只写本地。 - **⚠️ 取址有两条实现,改协议必须同时改**:JS 主路径(`ktv_api.js`)+ 原生兜底 (`SongUrlResolver.kt`,供 **WebView 不可用**的老盒子使用 —— 实测极米 H1S/GMUI2.0 上 WebView 导不出 `window.KtvApi`,桥永远 not ready,只靠 JS 时表现为