# 开发进度（实时更新，防换会话丢失）

> 规则:每次有阶段性发现立即写入本文件。新会话接手时先读本文件 + PROTOCOL.md。

## 当前任务:逆向 wn28.vip(蜗牛28) 投注协议 (2026-10-07 进行中)

前端 bundle 已下载:`C:\Users\Administrator\AppData\Local\Temp\wn28_index.js`(4.4MB,来源 https://sdlm-p-west.oss-cn-chengdu.aliyuncs.com/wn/web/20260808/assets/index.aa33cece.js)

### 已确认的投注相关接口(均走 lib/wn28.js 的加解密封装)

| 接口 | 方法 | 参数 | 说明 |
|---|---|---|---|
| `/game/gameBet/{gamePath}/{期号}` | POST | body=注单数组 | **下注**。如 `POST /game/gameBet/jnd28/20261007xxx` |
| `/checkDou?num=<总额>&type=1` | GET | | 下注前余额校验(前端流程:先 checkDou 再 gameBet) |
| `/game/gameRate/{gamePath}` | GET | | **玩法赔率表**(code/highRate/maxInvestment/bySort) |
| `/game/gameMyBet/{gamePath}/{期号}` | GET | | 我的注单(按期) |
| `/game/gameBetPage` | GET | params | 注单分页 |
| `/game/lastBet` | GET | params | 上一注 |
| `/getBetInfo/{gamePath}` | GET | | 投注信息(待验证字段) |
| `/saveBetAuto` | POST | body | 自动投注/追号保存 |
| `/stopBetAuto` | POST | body | 停止自动投注 |
| `/myModePage` | GET | params | 预设模式分页 |
| `/myModeList/{gamePath}` | GET | | 预设模式列表 |
| `/delBetMode` | GET | params | 删除预设模式 |
| WS `/queue/gameAutoBet/...` | | | 自动投注推送 |
| WS `/topic/gameBet/qun/{gamePath}` | | | 群投注推送 |
| WS `/queue/memberData/{memberId}` | | | 余额实时变化 |

### 下注请求体结构(核心)

前端把勾选的玩法项数组**原样 POST**,每项结构:

```json
{
  "name": "大",            // 显示名
  "code": "da",            // 玩法编码(服务端 gameRate 返回的 code)
  "remark": "",            // 子选择:对子"66"、单豹"666"等
  "checked": true,
  "sum": [],
  "touzhu": 100,           // 本项投注金豆
  "highRate": 1.96,        // 赔率(来自 gameRate)
  "maxInvestment": "500000", // 单项限额
  "bySort": 10,
  "myBetNum": null,
  "multiple": [0.5, 2, 10]
}
```

前端流程(函数 u0/T,约 bundle offset 3839000):
1. 用户勾选玩法 → `列表.filter(item => item.checked)` → 每项 `touzhu = 单注金豆 × 倍数`
2. `GET /checkDou?num=总金豆&type=1` 校验
3. `POST /game/gameBet/{gamePath}/{nextPeroid}` body=勾选项数组
4. 成功提示"投注成功"

### 玩法分区(jnd28 前端 UI)

- `slice(0,10)` 组合玩法(最多勾3个) — 大/小/单/双/组合
- `slice(10,38)` 数字0-27(最多勾10个)
- `slice(38+)` 特殊玩法(最多3个) — 对子(code `d,456`/`d,123`,remark 66/55/44/33/22/11)、全豹(`q,b`)、单豹(`d,b`,remark 666-222)
- bsdbz 分类:`bao/shun/dui/ban/za`
- **完整 code 表以服务端 `/game/gameRate/jnd28` 返回为准(待实测拉取)**

### 实测确认(2026-10-07 10:15, 真实 token 只读 + 赔率表落盘)

- **`GET /game/gameRate/jnd28` → 只有 28 个数字玩法 0-27,没有大小单双/对子豹子**(那些属于其他彩种组件)。id 379-406,highRate: 0/27=1000倍,1=333,2=166,3=100,13/14=13.33(最低)。完整表已存 `data/wn28_gameRate_jnd28.json`
- `GET /game/gameMyBet/jnd28/{期号}`:当期没投注时只返回 `{code:200,message}`,有注时结构见 gameBetPage.list
- `GET /game/gameBetPage {gamePath,page,limit}`:**注单历史**,data={count,list[]},每条:
  - `peroids/type/typeName/algType:"28"/category:"jnd"`
  - `dou`=总金豆, `num`=注数, `vals`=JSON字符串,**服务端存储的最小注单项 `{code,name,touzhu,id}`**(id=gameRate表id)
  - `status`: 2=赢(winDou>0) 3=输; 中奖项在 vals 里附加 `winDou,winLose:1`
  - `settleTime/createTime/lastBetTime/mode:1/ls:1/killStatus/uuid/nick/memberId`, `wins`="4+4+3=11"
- `GET /game/lastBet {gamePath,peroids}` → 2037 未查询到(参数可能要用 type,待确认,非关键)
- `GET /myModeList/jnd28`:预设模式 [{id,name,num,sum,vals(最小注单项),type,ls,createTime}]
- 保存模式实际接口:**`POST /saveMode/{gamePath}`** body `{name, gameRateParams:<当前注单列表>}`(Q$ 函数,bundle 里不是 gameMyBet)
- 自动投注:`POST /saveBetAuto` body `{vals:JSON.stringify(选号行), type:gamePath, lists:[{winId,loseId,winName,loseName,...}]}`;`POST /stopBetAuto` body=保存后返回的对象(含id);`GET /getBetInfo/{gamePath}` 返回 `{data:{vals,...}}` 当前自动投注配置

### 下注实测(2026-10-07 10:20-10:26,试玩会话,全程未动真钱)

**`POST /game/gameBet/jnd28/{期号}` body=`[{"code":"14","name":"14","touzhu":1000,"id":393}]` → code 200**

- 期号 = `gameNewAndNextTime` 返回的 `peroids + 1`(下一期;当期已封盘会报 2033)
- 最小 body 只需 `{code,name,touzhu,id}` 四字段(id=gameRate 表 id)——服务端原样存入 vals
- 成功返回注单对象:`{category:"jnd", dou:总额, id:注单id, peroids, status:1(未结算), vals, mode:1, ls:1, num:注数, ...}`
- 结算后 gameBetPage/gameMyBet 里:status 2=赢(winDou>0) 3=输,中奖项在 vals 内附加 `{winDou, winLose:1}`
- 错误码:**2033 该期已封盘 / 2051 单期投注小于最低投注**
- **最低投注:100 拒、110 过**(101 恰逢封盘未测成,精确值 101~110 之间);封盘发生在每期开奖前约几十秒
- 试玩会话(trialPlay)有 500 万金豆,可直接下注验证协议

### 端到端结算验证 ✅(2026-10-07 10:25,verify-settle.js)

- 押 13/14 各 500(期 3491019),开奖 `2+4+4=10` 未中 → **`status:3, winDou:0, wins:"2+4+4=10"`,下注后约 55 秒结算**(settleTime-createTime≈55s)
- status 语义闭环:1=未结算(实测) / 2=赢(真实历史注单 winDou>0) / 3=输(实测)
- `GET /game/lastBet {gamePath:'jnd28'}` → 200(之前 2037 只是账号无历史注单;传 peroids 反而不对)
- 试玩会话固定复用同一游客账号(memberId 87302,"游客试玩4282")
- **多注单项 body 验证通过**:`[{code:'13',...,touzhu:500,id:392},{code:'14',...,touzhu:500,id:393}]` → 200,`num:2, dou:1000`

### 待办

- [x] 试玩 token 实测 POST gameBet ✅ 2026-10-07
- [x] 更新 PROTOCOL.md 增加投注章节 ✅(PROTOCOL.md §5 投注协议,含 5.1 赔率/5.2 下注/5.3 记录/5.4 模式与自动投注/5.5 试玩验证)
- [x] lastBet 参数:{gamePath} 即可 ✅
- [x] 结算语义验证 ✅(status 1/2/3、winDou、wins、结算时长~55s)
- [ ] **不要用真实账号下真钱注单**——下注接口只做协议文档不做实际调用(除非用户明确要求)

**投注协议逆向任务全部完成。** 如需接续:读 PROTOCOL.md §5 + 本文件即可。工具:probe-bet.js(只读探测)、trial-bet.js(试玩下注)、verify-settle.js(结算验证)。

## 当前任务:站内游戏 jnd28 协议补漏 (2026-10-07 10:50 进行中)

个人中心完成后,用户问"站内游戏加拿大28协议是否拿全"→ 补漏实测:

- `/game/info/jnd28` ✓ 当日个人游戏统计 {bet,win,lose,winDou,pn,rate,time:"20261007"}
- `/common/game/config/jnd28` ✓ 游戏配置:algType/bettingInterva:30秒/dayPeriod:411期/killMoney/killStatus/chat/center/introduce(BCLC 3.5分钟一期)
- `/common/game/rules/jnd28` ✓(免token) 玩法规则+当期开奖数据(同 gameNewAndNextTime 结构+betCount/memberBetSum)
- **`/common/game/getNextTime/jnd28/1` ✓ 封盘/倒计时**: {next:剩余秒数, now, peroids, stop:false未封盘, time:下期开奖时间}——下注前判断可投窗口用这个
- **彩金体系(cj=彩金)**:
  - `/common/game/getCj` ✓ → 141260776(全站彩金池总额)
  - `/game/cj/list` ✓ 档位配置 [{algType:"28", count:10, rate:0.01→times:10, rate:0.02→13, 0.05→16, 0.08→20}](连续 count 期每期投注≥余额×rate?→中奖按 times 倍派彩金,规则细节待验证)
  - `/game/cjc/list {page,limit}` ✓ 本人彩金记录(空);`/game/cjc/list/hi` ✓ 全站中奖记录(含 slfk28 等,该站还有斯洛伐克28等多个28彩种)
  - `/game/getMyCj` ✓ 待领彩金(空);`POST /member/cj/exchange` 领取(写操作,未执行)
- `/game/result {type:jnd28,page,limit}` ✓ 全站开奖历史+每期投注统计(betCount/betDouSum,count锁499);`/game/result/noBetInfo` ✓ 同结构无投注统计——**开奖历史分页就是这个,不是 gameNewAndNextTime**
- **`/getBetInfo/jnd28` ✓ 自动投注任务状态**: {status:1运行中, startPeroids:3491023, endPeroids:3492023, minDou:1000, maxDou:200000000}——该账号有个已保存的自动投注任务;minDou/maxDou 是单期限额
- **试玩下注 500 报 2051(此前 500/200/110 能过)→ 最低投注按期浮动**,不是固定值;1000 稳过
- WS 个人推送验证(verify-ws-push.js):试玩下注 1000 @3491024 成功,5分钟窗口(覆盖下注+扣款+结算)**gameResultMySelf/betResult/memberData 三个个人队列均未收到推送**。官方前端确实订阅这些主题(extract-topics.js 确认16个主题),个人推送在试玩账号上不复现——可能仅真实账号推送,标记待真实账号验证。REST 轮询可完全替代,不阻塞
- 订阅封装 zt() = 普通 SUBSCRIBE 无特殊头;JK0 解密 Uu=aesDecrypt
- **群聊发言走 STOMP SEND 而非 REST**: `o$("/api/gameBet/{memberId}/{gamePath}", 内容)`;在线状态 `o$("/api/message/computer/to/admin/{memberId}", 状态)`;REST /chat/sendChat、/customer/sendChat 也在

### 待办

- [x] jnd28 协议补漏完成 → PROTOCOL.md §4 WS主题清单更新 + §5.5 游戏配套接口
- [ ] (可选,需真实账号)个人队列推送 gameResultMySelf/betResult 复现验证

**jnd28 站内游戏协议已拿全**:开奖(config/rules/getNextTime/result历史) / 下注(gameRate/checkDou/gameBet) / 注单(gameMyBet/gameBetPage/lastBet) / 结算(status/winDou) / 模式(saveMode/myModeList) / 自动投注(getBetInfo/saveBetAuto) / 彩金(getCj/cj/list/cjc) / WS(16主题+SEND) / 统计(game/info)。

## 任务:100万期历史数据可行性 (2026-10-07 11:30 完成)

**结论:yuce01 可以,wn28 不行。**

- wn28:`/game/result` 历史 count 锁 499、每页 10 条 → 最多 ~500 期。死路。
- yuce01:`myOpens` 分页窗口锁 ~5000 期(pz 锁 50,page 锁 ~100,page>100 钳回第 100 页)——但发现**点查接口**:
  - **`POST /index.php/Mobile/Indexs/open/type/2` body `section=<期号>`**(form-urlencoded,响应同 AES 加密)→ 返回 `{section, code:"n1,n2,n3", openTime, openTime_s, nextPredict,...}`
  - type=2 走 `open`(openFast 只用于开奖瞬间轮询,查历史返回空壳)
  - **二分定位数据起点:section 2464497 = 2019-08-21 04:00:30**(再往前 openTime=0 空)
  - 当前 section ~3491023 → **可用总量 ≈ 1,026,500 期,刚好够 100 万**(回到 2019-08-21)
  - 验证样例:2500000→"1,5,1" @2019-11-19;2464497→"2,8,2";本地 DB 3485997→"9,8,6" 与库一致
- 抓取方式:逐期点查,~1.03M 次请求;按 3-5 req/s 估算需 2.5~6 天连续跑,需断点续传(按 section 递增写入 draws 表即可)
- 注意:抓 1M 期前先和用户确认(请求量大);openFast 对 type=2 查历史无效

待办:如用户确认,写 backfill.js(点查+并发2+失败重试+断点续传,存 draws 表,注意 section 间隔 210s 可校验连续性)

## 任务:最近100万期回填 (2026-10-07 11:10 启动,运行中)

- `backfill.js` 已启动后台运行:范围 **2491031..3491031 共 1,000,001 期**(点查 POST open/type/2)
- 并发 3,**实测 14 期/秒,ETA ~20 小时**(预计 2026-10-08 早上跑完)
- 前 2000 期:0 失败、0 空期;失败会记 data/backfill-failures.log,断点可续传(重跑 `node backfill.js --conc 3` 即可)
- 跑完后统计 [2491031, 3491031] 内 draws 表缺失期数 = 丢失期数;中途随时可查:
  `SELECT COUNT(*) FROM draws WHERE section BETWEEN 2491031 AND 3491031`

## 任务:服务器部署 28.nizhan.cc (2026-10-07 11:30 完成)

- 服务器:**82.156.15.151**(root SSH,Debian 13,Node v22.23.2,nginx 1.20.2,宝塔面板管理,已有 cc/game/admin/dsh/ii.nizhan.cc 等站点)
- **28.nizhan.cc 已上线**(宝塔惯例 vhost:`/www/server/panel/vhost/nginx/28.nizhan.cc.conf` → 反代 127.0.0.1:3088):
  - `/www/nizhan28/server.js` web服务(零依赖 node:sqlite 只读库;systemd `nizhan28.service`,开机自启)
  - API:`/api/stats`(60s缓存:已抓/缺失/缺口段/失败数)、`/api/missing`、`/api/draws?limit&before`、`/api/query?section=|sum=`
  - 首页仪表盘 public/index.html:进度条、缺失统计、缺口明细 Top30、最新开奖、期号查询、文档链接
  - `/docs/PROTOCOL.md`、`/docs/PROGRESS.md`、`/docs/wn28_all_endpoints.txt` 协议文档在线可读
  - 全套程序已部署:`backfill.js`(新增 `--topup` 增量模式:从库内最大期号补到最新)、lib/pcdd.js、lib/wn28.js、wn28-poll/live、探测脚本
- **抓取策略:留在本机跑**(实测服务器→yuce01 延迟 709ms vs 本机 196ms,慢 3.6 倍);本机 40+/s 进行中,完成后 `VACUUM INTO` 快照整库上传;服务器日常增量用 `node /www/nizhan28/backfill.js --conc 5 --topup`(每天 411 期,轻松)
- **DNS 未生效**:阿里DNS查 28.nizhan.cc 仍 NXDOMAIN(父域 nizhan.cc→82.156.15.151 正常)。生效前预览:`curl -H "Host: 28.nizhan.cc" http://82.156.15.151/api/stats`。生效后建议 acme.sh 签 HTTPS(服务器已有 ~/.acme.sh 体系,参考 ii.nizhan.cc.conf 注释;宝塔自带续期是坏的)
- 本地 deploy/ 目录:ssh.js(ssh2 部署辅助,含凭据——注意不要提交/泄露)、nizhan28.service、28.nizhan.cc.conf

## 变更:抓取必须留在本机 + HTTPS 已上线 (2026-10-07 11:45)

- **DNS 已生效,https://28.nizhan.cc 上线**(acme.sh/Let's Encrypt,证书 /www/server/panel/vhost/cert/28.nizhan.cc/,自动续期下一次 2026-12-06;acme 验证走 /www/nizhan28/public webroot)
- **yuce01 封锁大陆机房 IP**:服务器(Tencent 82.156.15.151)请求 open/type/2 直接 403 Forbidden;且高频率会触发**软封锁**——返回加密的"空壳"响应(openTime=0),本机跑了 ~3 万次 40/s 后也短暂中招,**冷却 ~1-2 分钟自动恢复**(已实测:停手后单发请求正常返回数据)
- **服务器抓取已停用**(`systemctl disable --now nizhan28-backfill`,unit 文件保留仅供参考);抓取只能在用户本机(香港网络)跑
- backfill.js 升级**自适应限速**:`--delay`(每 worker 请求间隔)+ 连续 10 次空响应或 403 → 全 worker 冷却 90s 并重排该期号;当前参数 `--conc 4 --delay 80` 后台运行中
- 数据一致性:软封锁期间的空响应**不会入库**,后续验证 pass 会对库内缺失期号重查一遍再定"真缺失"
- 完整流程:本机抓完(~20h)→ 验证 pass → VACUUM INTO 快照上传服务器 → 服务器日常增量**无法自动跑**(yuce01 封机房 IP),需在用户本机定期跑 `node backfill.js --conc 4 --delay 80 --topup` 后再同步上站

## 深入:软封锁与源站空洞的区分 (2026-10-07 11:50)

- yuce01 两种反爬表现:**403 Forbidden**(硬封锁)和 **200+加密空壳 openTime=0**(软封锁/真空期同型),空壳在停止请求 1-2 分钟后解除
- **源站存在真实空洞**:已入库范围 [2491031,~2518938] 内实测 1,218 期缺失/5 段——[2494065-67]、[2496957-59]、[2497267-68]、[2500675-81]、[2512934-2514136](最后一段 1203 期连续缺失,应为源站故障/停开);礼貌单查这些期号反复确认 EMPTY-SHELL,而相邻期号有数据 → 真空期,不是封锁
- backfill.js 相应重构:空响应**不再触发冷却**(否则会在大洞上死循环),照常推进;仅 403/429 触发 90s 全局冷却+重排;所有空响应留给 **`--verify` 验证 pass**(1.5s/期慢速重查全部缺失,修复瞬时空响应,仍空的记入 data/genuine-holes.txt)
- 当前:主 pass `node backfill.js --conc 4 --delay 80` 后台运行(~20h);完成后人工起 `node backfill.js --verify`,然后出最终缺失报告+整库上站
- 预计最终形态:缺失 = 源站真空期(每 100 万期约 500-1500 期,占比 ~0.1%,符合停开/取消规律) + 0 抓取失败

### 已完成

- **全量端点表已存 `data/wn28_all_endpoints.txt`(191 个)**,提取脚本 `extract-apis.js`
- 只读实测 40+ 个 GET 全部通过(probe-member.js,输出 /tmp/probe-member.out),关键确认:
  - `/getInfo` 汇总:有效流水 effectiveFlow、今日投注 todayBet、今日盈亏 todayProLoss(+Ls=历史)
  - `/douPage` 金豆流水:`{mode:1支出/2收入, type:3投注/4中奖, dou:余额快照, num:变动额, des}`;签到=des"签到 1588豆"
  - `/log` 登录日志:ip/addr/device/browser/os/loginType(0成功/1失败)+comments"密码错误"
  - `/myVip` 需要 uuid 参数(2156 请输入UUID,待补参数)
  - `/signList` 签到记录 {num,vip};`/common/high/signConfig` 各VIP等级签到奖励(VIP1=188…VIP8=1888)
  - `/expExchangePage` 经验兑换记录;`/common/high/expConfig` {UP_EXP:100,UP_EXP_DOU:100,...} 100经验=100豆
  - `/myTeam` 团队(空);`/agent/day/mydata` 代理日报(charge/exchange/rateSum/xjtzSum 按日)
  - `/common/tg/config` 推广返佣配置 TGFY_LIST(金额档位→返佣10%)
  - `/memberHdfl/hd` 活动福利类型[{type:1-4,day}];`/memberHdfl/xjyd` 月度损失补助(月/ksDou损失/dou补助/rate/status)
  - `/memberFcApply/list` 分成产品(产品价/ dou / 流水要求 ls / lsMultiple);`/common/memberRgApply/list` 认购产品(day/firstPrice/givePrice)
  - `/monthCard/*` 月卡(青铜/白银/黄金/钻石,discountPrice 折扣价)
  - `/myCardPage` 我的卡;`withdrawPage/rechargePage` 空记录
  - `/third/party/*` 第三方游戏:balanceAll 各钱包余额(game/bank/buyu/dianjing/qipai/tiyu/zhenren1-4),collect 一键回收预览(db1/bg/ag/pg/cq9/ky/crown),config 转账限额
  - `/customer/config`+`/customer/msg/page`+`/customer/sendChat` 客服;`/chat/*` 群聊;`/common/high/shops` 客服列表(含 cUrl 客服链接/tgUrl)
  - `/common/high/goods` 积分商城实物(苹果15=7999000豆等)
  - `/memberBuySellBaseinfo/*` 担保交易配置(BS_DEPOSIT_*);`/memberOrderBuy/page/buy` 挂单列表
  - `/common/high/phb` 排行榜 {week:[{nick,win}]};`/memberPhb/last` 自己上榜记录

### 第二轮实测+写操作结构(bundle 调用处逆向,未执行)

- `myVip` 参数 `{uuid}`(自己的 uuid,来自 getMember.uuid=971442)→ 返回完整会员对象
- **短信开关配置**(`/common/high/sms*`,免token,返回 "Y"/"N"):withdraw=N recharge=N transfer=N wallet=N recycle=N **shops=Y**;`/common/open/way` → SMS_OPEN_PAGE/SMS_OPEN_EMAIL_PAGE
- **提现** `POST /withdraw` body `{smsCode, dou: 金额×汇率a}`(流程:getMember→checkDou→sms开关判断→提交);`GET /withdrawPage {page,limit}` 记录
- **代充** `POST /recharge` body `{uuid(对方会员uuid), num(金额), memberId(检测后回填), smsCode}`;先 checkCard 类检测会员ID(前端校验后 h.memberId=C.memberId);`POST /rechargeBack` 撤销
- **转给代理** `POST /transferToAgent` body `{uuid, toAgentUuid, dou(×汇率), smsCode}`;**转给下级** `POST /transferToNext` body=下级条目对象(含 type/status/dou);`GET /transferToAgentPage` 记录
- **VIP升级** `POST /upgrade` body `{memberUuid, memberId, vip:目标等级}`;`GET /upgradePage {page,limit}`
- **经验兑换** `POST /expExchange` 无body,可兑换金豆 = exp × (DOWN_EXP_DOU/DOWN_EXP) = exp×1
- **月卡** `POST /monthCard/plan/create` body=**月卡id(数字)**;领取 `POST /monthCard/member/plan/pick` body=**plan id**;`GET /monthCard/member/list`、`/monthCard/member/log/page {page,limit}`
- **新人首充** `POST /memberFcApply/join` body=**产品id**;申请返利 `POST /memberFcApply/save` body `{img1, img2}`(充值/游戏记录截图,先传图)
- **注册赠送** `POST /memberRgApply/save` 无body
- **活动福利领取** `POST /memberHdfl/get/hd` body=**type(1-4)**;`/memberHdfl/xjyd POST` 领取损失补助(无body);`/memberHdfl/xjyd/detail {month,page,limit}`;`/memberHdfl/hd/page {page,limit}` 记录
- **卡密回收** `POST /recycle` body `{km:"卡1,卡2"(空格转逗号), smsCode}`;检测 `GET /checkCard {km}`(实测传uuid报2093"请至少录入1张卡密"→参数是km);发码 `POST /getSmsCode2MemberForRecycle {km}`
- **商城兑换(买卡密=提现机制)** `POST /createCardBefore {num, ...}` → 预检返回订单;`POST /createCard {num, smsCode}` → "兑换成功,请前往[卡密页]";卡配置 `GET /common/cardRate`(免token):CARD_TIMES=3(流水倍数),CARD_LS_RATE_0..3=5/3/?,CARD_LS_TIMES_RATE=2,CARD_LS_RATE_FREE=3;`GET /myCardPage {page,limit}` 我的卡密
- **钱包划转(第三方游戏)** `POST /wallet/transfer` body `{number:Number(金额), smsCode, ...目标钱包}`;`GET /wallet/walletLog {page,limit}`;`POST /third/party/gameUrl` 进游戏;`POST /third/party/transfer` 转账
- **签到** `POST /sign` 无body → 返回金豆(VIP1-8: 188/388/588/688/888/1288/1588/1888)
- **红包** `POST /exchangeHongbao` body=红包码字符串;`GET /hongbaoPage {page,limit}`;红包雨 `GET/POST /member/hby` + WS `/queue/memberHby`
- **改资料** `POST /updateInfo` body=getMember对象整体编辑(nick/des/qq/wx/name/email),**qq/wx/name 只能改一次**(flag字段);改密 `POST /forgotPassword`、资金密码 `POST /forgotSafe`
- **客服** `POST /customer/sendChat`;**群聊** `POST /chat/sendChat`;`GET /chat/msg/page {page,limit}` 实测count=201
- `GET /common/high/comNews` 公告(HTML)、`GET /common/high/help {type?}` 帮助、`GET /common/high/rankNames` 称号(农民工5000豆→大富豪10万豆)、`GET /common/high/exchangeGoodTime`→"5"(兑换时段)
- `tg/statistics` 实测 code 100(可能仅代理角色可用);`tg/detail` 返回 null(无记录);`tg/tgfl/page {page,limit,mode}` null

### 待办

- [x] 全部完成 → PROTOCOL.md §6 个人中心全功能协议(6.1账户/6.2资金/6.3卡密/6.4福利/6.5代理/6.6月卡商城/6.7客服/6.8上传)

**个人中心协议抓取任务完成。** 端点总表 data/wn28_all_endpoints.txt(191) + fnmap(128);GET 类 60+ 实测通过;写操作(充值/提现/转账/升级/买卡等)仅文档化未执行。工具:probe-member.js、extract-apis.js、extract-fnmap.js。

### 分析脚本(临时,在 %TEMP%)

- analyze2.js~analyze4.js:bundle 搜索脚本,读 wn28_index.js 输出上下文
- 注意:bash 里 `\\u` 转义会被吃,搜中文需用 `String.fromCharCode(92)+'uXXXX'` 方式(见 analyze2.js)

## 历史进度

- 2026-10-07 上午:完成 wn28 登录/加密/开奖数据/WS 协议(见 PROTOCOL.md),pcdd(yuce01) 抓取、draws 统一库
- 2026-10-07 上午:某会话因上下文过长 compact 失败卡死,投注协议逆向在本会话重启
