From ff59840c8ed57f9886b8d0ee9ae49f370600ce16 Mon Sep 17 00:00:00 2001 From: zijunchiang Date: Thu, 8 Oct 2026 03:57:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3:=20=E8=A1=A5=20AGENTS=20?= =?UTF-8?q?=E7=9A=84=E5=8E=9F=E7=89=88=E5=8D=8F=E8=AE=AE=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=EF=BC=88HAR=20=E5=AE=9E=E6=B5=8B:=20api.php?= =?UTF-8?q?=20=E5=8F=96=E9=85=8D=E7=BD=AE/=E4=B8=9A=E5=8A=A1=E7=A0=81=2040?= =?UTF-8?q?3/=E8=AF=95=E7=94=A8=E9=85=8D=E9=A2=9D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) 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 时表现为