Files
notiMessage/docs/TNG_MoneyPacket领取台.md
mars c8cbfdff82 feat(mmp): 独立红包领取台(手机+PC)、同步、筛选与功能说明
隔离通用消息台;支持设置/手气摘要/电脑同步;忽略临时逆向脚本与运行时 JSON。
2026-08-04 17:39:29 +08:00

157 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TNG Money Packet 领取台说明
> 更新2026-08-04
> 相关代码:`TngMoneyPacketHook.java`、`debug-server/server.py`、`AppConfig.DEBUG_SERVER_URLS`
## 目标
抓取 TNG eWallet **Money Packet红包** 的领取排行:谁领了、领了多少,并在 PC 调试台按**单个红包**展示。
## 手机端领取台
主 App 首页有 **红包领取台(独立)** 入口(`MmpClaimActivity`
- Hook 收到 `[MMP统计]` 后写入本地 `MmpPacketStore`**不进入**通用「情况」监听台、也不走正式上传
- 手机数据可同步到 PC打开领取台会自动同步也可点「同步电脑」PC 打开 http://127.0.0.1:8765/mmp 即可看(落盘 `mmp_packets.json`,重启调试台不丢)
- PC 调试台红包数据走独立队列,与 `/` 通用消息台隔离
- 列表支持筛选(全部/领取中/已领完 + 关键词)、详情/卡片显示手气(领完)或目前最高/最低(领取中)
- 点进看领取排行;支持清空(仅红包)
- 需监听列表勾选 TNG且 Xposed 模块生效
- **功能说明页**:手机顶栏「说明」→ `MmpHelpActivity`;电脑 http://127.0.0.1:8765/mmp/help
PC 页 http://127.0.0.1:8765/mmp 手机浏览器也可访问USB reverse 或局域网 IP
---
## 页面与地址
| 入口 | 地址 |
|------|------|
| 本机USB + `adb reverse` | http://127.0.0.1:8765/mmp |
| 功能说明 | http://127.0.0.1:8765/mmp/help |
| 局域网 / USB 共享网 | http://<电脑IP>:8765/mmp (当前常见:`http://10.151.104.25:8765/mmp` |
| 通用消息台 | http://127.0.0.1:8765/ |
手机推送会同时尝试:
- `http://127.0.0.1:8765`(需 `adb reverse tcp:8765 tcp:8765`
- `http://10.151.104.25:8765`USB 共享网段;若电脑 IP 变了,改 `AppConfig.DEBUG_SERVER_URLS`
启动调试台:
```powershell
powershell -ExecutionPolicy Bypass -File scripts/start-debug-server.ps1
```
## 红包唯一标识
正式字段是 **`activityId`**UUID例如
- `b8c37a58-bb2c-4aa2-83ef-f15466b9211e`
- `e5dcf293-4062-4df4-a692-e3bf194d9a37`
领取台左侧按 `activityId` 分条;详情页会显示完整 ID。
转发正文格式示例:
```text
[MMP统计] packet=<activityId> | sender=... | total=1.00 | via=rpc | src=moneyPacketDetail
昵称A -> 0.71
昵称B -> 0.29
```
金额在 App 内多为 Money 对象 `{"amount":"0.71","cent":"71",...}`Hook / 调试台会规范成数字再展示。
## 数据从哪来
| 来源 | Quake op / 方法 | 内容 |
|------|-----------------|------|
| 历史列表 | `moneyPacketHistoryList` / `ap.tngdwallet.moneyPacket.list.retrieve` | 仅摘要:`activityId`、总额、时间等,**无领取排行** |
| 红包详情 | `moneyPacketDetail` / `ap.tngdwallet.moneyPacket.retrieve` | 含 `activityPoolInfos`(领取人 + 金额) |
外部 mitm 因证书 pinning **解不开** TNG API 正文;必须用进程内 Xposed`TngMoneyPacketHook`)。
消费端详情领取列表字段主要是 **`activityPoolInfos`**`receiverName` + `amount`),不是商户版的 `receiverList`
## 推荐操作流程(自动拉历史 + 详情)
登录后**无需再手动点详情灌模板**,也**不必反复进历史页**
1. 打开 TNG 并完成登录 / PIN任意前台页面即可
2. Hook 从 `ILoginStorage` / 历史请求自动取 `sessionId``Activity.onResume` 按设置冷却主动调 `moneyPacketHistoryList`
3. 历史返回后自动按 `activityId` 串行拉详情(间隔见设置),推送到领取台
4. 仅打开 **Money Packet 历史页**时App 自己的列表响应也会立刻触发步骤 3
5. 打开 http://127.0.0.1:8765/mmp ;点 **设置** 可调刷新速度,保存后约 10 秒内生效
日志期望:
- `hooked ILoginStorage getters` / `login from storage session=…` / `cached history request template`
- `history hit → schedule auto detail``auto-history ok → schedule details`
- `auto-detail ok activityId=… claims=N`
若仍无数据:确认已安装最新 Xposed 模块并强停重启 TNG看是否出现 `auto-detail empty claims` / `no sessionId`
## 去重与刷新行为
冷却时间可在领取台 **设置** 面板调整(`/mmp` → 设置),保存后约 **10 秒内**手机 Hook 生效。默认偏快(历史/详情约 8 秒)。
| 规则 | 说明 |
|------|------|
| 标识 | 以 `activityId` 区分红包 |
| sessionId | 自动:`ILoginStorage` / Repository.loginStorage有真实请求时也会缓存 |
| 自动历史 | 前台 `onResume` 触发;冷却见设置「历史列表冷却」 |
| 短时去重 | 同一 `activityId` + **相同领取名单**,「相同名单去重」秒内不重复推送 |
| 自动拉冷却 | 同一 `activityId` 自动拉详情成功后,「详情刷新冷却」内不重复自动拉 |
| 包间间隔 | 自动拉详情串行,「详情请求间隔」毫秒/条 |
| 无模板 | 「无模板时自动打开历史页」可关,避免突然跳转 |
| 调试台 | 同一 `activityId` 只保留最新完整快照;双通道短时内容去重 |
预设:**极速**(约 5s/ **标准**(约 8s/ **省流**(约 3045s
日志里若出现 `skip dup activityId=...`,表示短时去重生效,不是没抓到。
`settings applied hist=…` 表示 Hook 已拉到新配置。
| 已领完停刷 | `remainingCount<=0` / `claimed>=total` / status FINISH·COMPLETE·EXPIRE / 金额凑齐,且**已有领取名单**后不再自动拉该包详情 |
| 断线重连 | session 丢失或 RPC 鉴权/网络失败 → 标记断开session 恢复或 Activity resume 时**强制**重拉历史 |
日志:`packet DONE stop-refresh``session lost``session recovered → force re-fetch`
---
## 排障
```text
adb logcat | findstr TngMmp
```
常见日志:
| 日志 | 含义 |
|------|------|
| `TngMmp installed` | Hook 已加载 |
| `cached RPC task MoneyPacketRpcTask` | 已缓存 RPC 代理 |
| `cached detail request template` | 已缓存手动详情请求(可选加速) |
| `login from storage session=…` | 已从 ILoginStorage 自动取到 session |
| `auto-history ok → schedule details` | 已自动拉历史列表 |
| `auto-detail empty claims ... totalCount:0` | 请求缺登录态或服务端空结果 |
| `auto-detail ok activityId=... claims=N` | 自动拉详情成功 |
| `captured activityId=... claims=N` | 已转发到 notiMessage / 调试台 |
其它检查:
1. LSPosed 作用域包含 `my.com.tngdigital.ewallet`,模块为最新 APK
2. 强停后再开 TNG使新 Hook 生效
3. 调试台进程在跑USB 时执行过 `adb reverse`
4. notiMessage 监听列表勾选了 TNGHook 转发依赖主 App 接收广播)
5. 电脑 USB 共享 IP 变化后更新 `AppConfig.DEBUG_SERVER_URLS` 并重装主 App
## 相关文件
| 文件 | 作用 |
|------|------|
| `xposed-module/.../hook/TngMoneyPacketHook.java` | Quake RPC Hook、自动拉详情、轮询领取台设置 |
| `debug-server/server.py` | `/mmp` 领取台、`/api/mmp``/api/mmp/settings` |
| `debug-server/mmp_settings.json` | 领取台刷新设置(自动生成) |
| `app/.../AppConfig.java` | `DEBUG_SERVER_URLS` 双地址 |
| `app/.../network/DebugForwarder.java` | 向多个调试地址推送 |
| `scripts/start-debug-server.ps1` | 启动调试台 + adb reverse |