126 lines
5.2 KiB
Markdown
126 lines
5.2 KiB
Markdown
# TNG Money Packet 领取台说明
|
||
|
||
> 更新:2026-08-04
|
||
> 相关代码:`TngMoneyPacketHook.java`、`debug-server/server.py`、`AppConfig.DEBUG_SERVER_URLS`
|
||
|
||
## 目标
|
||
|
||
抓取 TNG eWallet **Money Packet(红包)** 的领取排行:谁领了、领了多少,并在 PC 调试台按**单个红包**展示。
|
||
|
||
## 页面与地址
|
||
|
||
| 入口 | 地址 |
|
||
|------|------|
|
||
| 本机(USB + `adb reverse`) | http://127.0.0.1:8765/mmp |
|
||
| 局域网 / 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` 约每 **45 秒**主动调一次 `moneyPacketHistoryList`(主线程)
|
||
3. 历史返回后自动按 `activityId` 在主线程串行拉详情(间隔约 200ms),推送到领取台
|
||
4. 仅打开 **Money Packet 历史页**时,App 自己的列表响应也会立刻触发步骤 3
|
||
5. 打开 http://127.0.0.1:8765/mmp 刷新查看
|
||
|
||
日志期望:
|
||
|
||
- `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`。
|
||
|
||
## 去重与刷新行为
|
||
|
||
| 规则 | 说明 |
|
||
|------|------|
|
||
| 标识 | 以 `activityId` 区分红包 |
|
||
| sessionId | 自动:`ILoginStorage` / Repository.loginStorage;有真实请求时也会缓存 |
|
||
| 自动历史 | 前台 `onResume` 触发,约 **45 秒**冷却;也可由首次缓存到 RpcTask 触发 |
|
||
| 短时去重 | 同一 `activityId` + **相同领取名单**,约 **20 秒内**不重复推送 |
|
||
| 自动拉冷却 | 同一 `activityId` 自动拉详情成功后约 **60 秒**内不重复自动拉 |
|
||
| 包间间隔 | 自动拉详情串行,约 **150ms**/条 |
|
||
| 调试台 | 同一 `activityId` 只保留最新完整快照;双通道短时内容去重 |
|
||
|
||
日志里若出现 `skip dup activityId=...`,表示短时去重生效,不是没抓到。
|
||
|
||
## 排障
|
||
|
||
```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 监听列表勾选了 TNG(Hook 转发依赖主 App 接收广播)
|
||
5. 电脑 USB 共享 IP 变化后更新 `AppConfig.DEBUG_SERVER_URLS` 并重装主 App
|
||
|
||
## 相关文件
|
||
|
||
| 文件 | 作用 |
|
||
|------|------|
|
||
| `xposed-module/.../hook/TngMoneyPacketHook.java` | Quake RPC Hook、自动拉详情、金额/`activityId` 解析 |
|
||
| `debug-server/server.py` | `/mmp` 领取台、`/api/mmp` |
|
||
| `app/.../AppConfig.java` | `DEBUG_SERVER_URLS` 双地址 |
|
||
| `app/.../network/DebugForwarder.java` | 向多个调试地址推送 |
|
||
| `scripts/start-debug-server.ps1` | 启动调试台 + adb reverse |
|