# wn28.vip(蜗牛28)全协议文档

> 2026-10-07 逆向自官方前端 bundle 并全部实测通过。API 同源:`https://www.wn28.vip/api`
> 注意:主域 `wn28.vip` 无 A 记录,必须用 `www.wn28.vip`。

## 1. 加密体系(所有 POST 请求 / 所有响应)

| 方向 | 算法 | 密钥 |
|---|---|---|
| 请求体 | RSA-1024 PKCS#1 v1.5;>110字节(UTF-8)按37字符分块,每块独立加密,base64块用 `,` 拼接 | 硬编码公钥(见 lib/wn28.js `RSA_PUB`) |
| 响应体 | AES-128-CBC,PKCS7,base64,外层可能包 JSON 引号 | key = iv = `I1HE9SHUxho5hjOO` |

GET 请求参数明文,响应同样 AES 加密。请求头 `Content-Type: application/json;charset=utf-8`。

## 2. 登录(短信验证码制)

```
POST /common/getMsgLogin   {account, password}            → 触发短信,180秒有效
POST /common/login         {account, password, smsCode}   → code=200, data.access_token=JWT
```
失败码:2012 账号不存在 / 2007 验证码有误或缺失。
JWT 有效期 24h。后续请求带:`token: <JWT>` + `Authorization: Bearer <JWT>`。
其他:`/common/checkAccount`(GET)、`/common/register2`、`/common/forgotPassword`、
`/common/getMsgForgot`、`/logout`、`/common/trialPlay`(免账号试玩会话)。

## 3. 数据接口(加拿大28 = gamePath `jnd28`, id 19)

| 接口 | 鉴权 | 内容 |
|---|---|---|
| `GET /common/game/gameNewAndNextTime/jnd28` | 不需要 | **完整开奖**:peroids期号、num总和、results三组和、nums原始20号、datas三组各6号、nextTime |
| `GET /common/game/yc/jnd28` | 不需要 | 站方预测记录(danshuang/daxiao/data/sum/number) |
| `GET /game/result?type=jnd28` | 需要 | 注单统计(betCount/betDouSum),无号码,499条,每页锁10条 |
| `GET /common/game/gameTypeAndConfig` | 需要 | 全彩种表(jnd28/jndjn28/jnc28/bg28/...族谱) |
| `GET /getMember` | 需要 | 本人资料/余额 |

## 4. WebSocket(STOMP 1.2 over WS)

```
wss://www.wn28.vip/api/common/ws_app
CONNECT 帧头: Authorization: <JWT>, accept-version: 1.2, heart-beat: 10000,10000
```
订阅 topic(body 同样 AES 加密,官方前端共 16 个主题):
- `/queue/gameNewAndNextTime/{gamePath}` — 开奖/下期推送(核心)
- `/queue/game/result/{gamePath}` — 投注量实时推送(无号码)
- `/queue/game/yc/{gamePath}` — 预测推送
- `/queue/gameResultMySelf/{memberId}`、`/queue/betResult/{gamePath}/{memberId}`、`/queue/memberData/{memberId}` — 个人开奖/结算/余额(试玩账号实测未收到推送,疑仅真实账号)
- `/queue/member/cj`(彩金)、`/queue/game/cjcDataChange`(彩金池变化)、`/queue/member/bet/data/{gamePath}`、`/queue/gameAutoBet/...`(自动投注)、`/queue/memberHby`(红包雨)、`/queue/member/message/...`(站内信)
- `/topic/chat/msg`(群聊)、`/topic/gameBet/qun/{gamePath}`(群投注留言)、`/topic/phb/today`(排行榜)、`/queue/customer/chat/...`(客服)

STOMP SEND(发言/状态走 SEND 不走 REST):`/api/gameBet/{memberId}/{gamePath}`(群聊发言)、`/api/message/computer/to/admin/{memberId}`(在线状态)。

## 5. 投注协议(2026-10-07 逆向+试玩实测,jnd28)

### 5.1 玩法与赔率

`GET /game/gameRate/{gamePath}`(需 token)→ **jnd28 只有数字 0–27 共 28 个玩法**(无大小单双/对子豹子,那些属于其他彩种)。每项:

```json
{"bySort":13,"code":"14","gamePath":"jnd28","highRate":"13.33","id":393,
 "maxInvestment":"5000000","maxRate":13.1,"minRate":13.06,"name":"14"}
```

- `id` 379–406 对应 0–27;`highRate`=赔率(0/27=1000,13/14=13.33 最低);`maxInvestment`=单项限额
- 快照已存 `data/wn28_gameRate_jnd28.json`

### 5.2 下注

```
GET  /checkDou?num=<总金豆>&type=1          前端下注前的余额校验
POST /game/gameBet/{gamePath}/{期号}          body = 注单项数组
```

- 期号 = `gameNewAndNextTime` 的 `peroids + 1`(下一期;当期已封盘返回 **2033**)
- **最小注单项**:`{"code":"14","name":"14","touzhu":110,"id":393}`(服务端原样存入 vals;id 取自 gameRate)
- 最低投注 >100(100 拒,110 过);单项受 maxInvestment 限制;封盘在每期开奖前约几十秒
- 错误码:**2033 该期已封盘 / 2051 低于最低投注**

### 5.3 注单记录与结算

| 接口 | 说明 |
|---|---|
| `GET /game/gameMyBet/{gamePath}/{期号}` | 本人当期注单(无注时仅 code/message) |
| `GET /game/gameBetPage?gamePath=&page=&limit=` | 注单历史分页,`data={count,list[]}` |
| `GET /game/lastBet` | 上期注单(参数待确认) |

注单字段:`dou` 总额、`num` 注数、`vals` JSON 串(注单项)、`status` **1=未结算 2=赢 3=输**、`winDou` 赢取金豆、`wins`"4+4+3=11"、`settleTime` 结算时间、`killStatus`。中奖项在 vals 内附加 `winDou/winLose:1`。
实测:下注后约 **55 秒**结算;`wins` 记录开奖算式;押 13/14 开 10(2+4+4)→ status 3, winDou 0。`GET /game/lastBet` 参数用 `{gamePath}` 即可。

### 5.4 预设模式与自动投注

| 接口 | 说明 |
|---|---|
| `POST /saveMode/{gamePath}` | 保存预设模式,body `{name, gameRateParams:<注单列表>}` |
| `GET /myModeList/{gamePath}` / `GET /myModePage` | 模式列表/分页 |
| `GET /delBetMode?...` | 删除模式 |
| `GET /getBetInfo/{gamePath}` | 当前自动投注配置(`data.vals` 为 JSON 串) |
| `POST /saveBetAuto` | 保存自动投注:body `{vals:JSON串, type:gamePath, lists:[{winId,loseId,winName,loseName}...]}` |
| `POST /stopBetAuto` | 停止,body=saveBetAuto 返回对象(含 id) |

相关 WS 推送:`/queue/gameAutoBet/...`(自动投注)、`/topic/gameBet/qun/{gamePath}`(群投注)、`/queue/memberData/{memberId}`(余额变化)、`/queue/betResult/{gamePath}/{memberId}`(注单结算)。

### 5.5 游戏配套接口(2026-10-07 补漏实测)

| 接口 | 说明 |
|---|---|
| `GET /common/game/getNextTime/{gamePath}/{类型?}` | **封盘/倒计时**:`{next:剩余秒, peroids, stop:false未封盘, time:下期开奖}`——下注前判断可投窗口 |
| `GET /common/game/config/{gamePath}` | 游戏配置:bettingInterva、dayPeriod 期数、killMoney/killStatus、introduce |
| `GET /common/game/rules/{gamePath}`(免token) | 玩法规则+当期开奖同构数据 |
| `GET /game/info/{gamePath}` | 本人当日游戏统计 {bet,win,lose,winDou,pn,rate} |
| `GET /game/result?type={gamePath}&page=&limit=` | **全站开奖历史分页**+每期投注统计(count 锁 499);`/game/result/noBetInfo` 同构无统计 |
| `GET /common/game/getCj` | 全站彩金池总额(实测 1.41 亿豆) |
| `GET /game/cj/list` | 彩金档位 {count:10期, rate:0.01~0.08, times:10~20倍} |
| `GET /game/cjc/list {page,limit}` / `GET /game/cjc/list/hi` | 本人彩金记录 / 全站彩金中奖记录 |
| `GET /game/getMyCj` | 待领彩金;`POST /member/cj/exchange` 领取(未执行) |

注意:最低投注**按期浮动**(实测同日 110 可过、500 被拒 2051、1000 稳过);`GET /getBetInfo/{gamePath}` 返回自动投注任务状态 {status, startPeroids, endPeroids, minDou, maxDou}。

### 5.6 试玩验证

`POST /common/trialPlay` 游客会话(500 万金豆)即可完整走通 gameRate→checkDou→gameBet→gameMyBet,验证协议不动真钱。见 `trial-bet.js`、`verify-settle.js`、`verify-ws-push.js`。

## 6. 个人中心全功能协议(2026-10-07,GET 类实测✓,写操作仅 bundle 逆向未执行)

> 全量端点表:`data/wn28_all_endpoints.txt`(191个);函数名映射:`data/wn28_fnmap.txt`(128个)。
> 以下 POST 均未实际调用——字段来自前端 bundle 调用处逆向。

### 6.1 账户概览与资料

| 接口 | 说明 |
|---|---|
| `GET /getMember` ✓ | 完整资料+各钱包余额:memberData{game游戏金豆,bank银行卡余额,buyu捕鱼,dianjing电竞,qipai棋牌,tiyu体育,zhenren1-4真人},tgData,parent/parentUuid(上级),uuid(对外ID),level(VIP),role |
| `GET /getInfo` ✓ | 汇总:effectiveFlow有效流水(今日/历史Ls)、todayBet今日投注、todayProLoss今日盈亏、inviteCount、exp |
| `POST /updateInfo` | 修改资料,body=getMember对象编辑(nick/des/qq/wx/name/email);**qq/wx/name 仅可修改一次** |
| `POST /forgotPassword` / `POST /forgotSafe` | 改登录密码 / 资金密码 |
| `GET /log {page,limit}` ✓ | 登录日志:ip/addr地址/device/browser/os/loginType(0成功1失败)/comments("密码错误") |
| `GET /myVip?uuid=` ✓ | 按uuid查会员公开信息 |

### 6.2 资金流水与操作

| 接口 | 说明 |
|---|---|
| `GET /douPage {page,limit}` ✓ | **金豆明细**:`{mode:1支出/2收入, type:3投注/4中奖, num:变动额, dou:余额快照, des:"加拿大28,第x期,共8注"/"签到 1588豆"}` |
| `POST /withdraw` | 提现 body `{smsCode?, dou:金额×汇率}`;前端先 `GET /checkDou?num=` 校验再提交 |
| `POST /recharge` | 代充 body `{uuid:对方uuid, num:金额, memberId, smsCode?}`(前端先验证会员ID回填memberId);`POST /rechargeBack` 撤销 |
| `GET /withdrawPage` / `GET /rechargePage` ✓ | 提现/充值记录 |
| `POST /transferToAgent` | 转给代理 body `{uuid, toAgentUuid, dou, smsCode?}`;`POST /transferToNext` 转给下级;`GET /transferToAgentPage` ✓ 记录 |
| `POST /wallet/transfer` | 第三方钱包划转 body `{number:金额, smsCode?, ...钱包目标}`;`GET /wallet/walletLog {page,limit}` ✓ |
| `GET /third/party/balanceAll` ✓ | 各平台钱包余额(同 memberData);`GET /third/party/collect` ✓ 一键回收预览(db1/bg/ag/pg/cq9/ky/crown);`POST /third/party/transfer` 转入/转出;`POST /third/party/gameUrl` 获取游戏地址;`GET /third/party/page` ✓ 记录;`GET /third/party/config` ✓ {rate:0, lowDou:1000, maxDou:50000000} |
| `GET /checkDou?num=&type=1` | 余额校验(下注/提现前) |

**短信验证码开关**:`GET /common/high/sms{Withdraw,Recharge,Transfer,Wallet,Recycle,Shops}`(免token)→ data="Y"/"N";当前 shops=Y 其余 N。发码:`POST /getSmsCode2SelfFor{Withdraw,Recharge,Transfer,Wallet,Shops}`(无body)、`POST /getSmsCode2MemberForRecycle {km}`。

### 6.3 卡密体系(商城兑换=出金机制)

| 接口 | 说明 |
|---|---|
| `GET /common/cardRate` ✓(免token) | CARD_TIMES=3(流水倍数)、CARD_LS_RATE_0..3=5/3/…、CARD_LS_TIMES_RATE=2、CARD_LS_RATE_FREE=3 + 游戏开关list |
| `POST /createCardBefore {num,...}` | 兑换预检 → 返回订单信息 |
| `POST /createCard {num, smsCode?}` | 生成卡密(金豆→卡密,卡密对应人民币) |
| `GET /myCardPage {page,limit}` ✓ | 我的卡密 |
| `GET /checkCard {km:"卡密,卡密"}` | 检测卡密有效性(实测参数为km,传uuid报2093) |
| `POST /recycle {km, smsCode?}` | 回收卡密入金豆 |
| `GET /agentCard {uuid?}` / `GET /checkCreateCard` ✓ | 代理卡 / 可否创建检测 |

### 6.4 签到·VIP·经验·红包·福利

| 接口 | 说明 |
|---|---|
| `POST /sign` 无body | 签到→金豆;`GET /signList {page,limit}` ✓ 记录{num,vip};`GET /common/high/signConfig` ✓ VIP1-8奖励=188/388/588/688/888/1288/1588/1888 |
| `GET /myVip` ✓ | VIP信息;`GET /upgradePage` ✓;`POST /upgrade {memberUuid, memberId, vip:等级}` 升级VIP |
| `GET /common/high/expConfig` ✓ | {UP_EXP:100,UP_EXP_DOU:100,DOWN_EXP:100,DOWN_EXP_DOU:100}(100经验=100豆);`POST /expExchange` 无body 兑换;`GET /expExchangePage` ✓ 记录 |
| `POST /exchangeHongbao` body=红包码串 | 领红包;`GET /hongbaoPage {page,limit}` ✓;红包雨 `GET/POST /member/hby` + WS `/queue/memberHby` |
| `GET /memberHdfl/hd` ✓ | 活动福利类型[{type:1-4,day:领取状态}];领取 `POST /memberHdfl/get/hd` body=type;记录 `GET /memberHdfl/hd/page` ✓ |
| `GET /memberHdfl/xjyd` ✓ | 邀请返利/损失补助月度[{month,ksDou损失,dou补助,rate,status:1进行/2可领}];`POST /memberHdfl/xjyd` 领取;`GET /memberHdfl/xjyd/detail {month,page,limit}` |

### 6.5 代理·团队·推广

| 接口 | 说明 |
|---|---|
| `GET /myTeam {page,limit}` ✓ | 团队列表 {memberPageResult, count} |
| `GET /agent/day/mydata` ✓ | 代理日报(按日):charge充值/chargeNum/exchange提现/rateSum佣金/xjtzSum下级投注/edzySum |
| `GET /common/tg/config` ✓ | 推广返佣 TGFY_LIST(下级流水档位→返佣10%)、TGFY_HY_CZ/HY_LS/XZF |
| `GET /tg/statistics` | 推广统计(实测code 100,可能仅代理角色);`GET /tg/detail` ✓(空);`GET /tg/tgfl/page {page,limit,mode}`;`POST /tg/get` 领取返利 |
| `GET /common/agentList` ✓ | 代理列表;`POST /revokeAgent` 撤销代理关系 |
| `GET /memberFcApply/list` ✓ | 分成产品(productPrice/ls流水要求/lsMultiple/dou);`POST /memberFcApply/join {产品id}` 参与;`POST /memberFcApply/save {img1,img2}` 申请(需上传充值/游戏截图);`GET /memberFcApply/apply/my` ✓ |
| `GET /common/memberRgApply/list` ✓ | 认购产品(day/firstPrice/givePrice);`POST /memberRgApply/save` 无body 参与 |

### 6.6 月卡·商城·担保交易

| 接口 | 说明 |
|---|---|
| `GET /common/monthCard/list` ✓ | 月卡商品(青铜/白银/黄金/钻石:productPrice/discountPrice/dou每日/ls流水要求/counts天数);`POST /monthCard/plan/create` body=月卡id 购买;`GET /monthCard/member/list` ✓;`POST /monthCard/member/plan/pick` body=planid 领取当日;`GET /monthCard/member/log/page` ✓ |
| `GET /common/high/goods` ✓ | 积分商城实物(iPhone 7999000豆等);`GET /common/high/exchangeGoodTime` ✓ →"5"兑换时段 |
| `/memberOrderBuy/*` `GET page/buy` ✓ | 担保挂单:{money人民币, dou金豆, type, status, buy/sellNick...};`/memberOrderSell/*` 卖单(sellOne-Four 多种支付方式);`POST /memberBuySellBaseinfo/{bank/info,wx/img,zfb/img,up/deposit,status}` 绑定收款方式/挂售;`GET /memberBuySellBaseinfo/{getInfo,config}` ✓ {BS_DEPOSIT_RATE:2, MIN_DOU:100, MAX_DEAL_DOU:1000...} |

### 6.7 客服·聊天·内容

| 接口 | 说明 |
|---|---|
| `GET /customer/config` ✓ + `GET /customer/msg/page {page,limit}` ✓ + `POST /customer/sendChat` | 一对一客服 |
| `GET /chat/config` ✓ + `GET /chat/msg/page {page,limit}` ✓(count=201) + `POST /chat/sendChat` | 群聊大厅(WS 推送) |
| `GET /common/high/shops` ✓ | 客服/投诉渠道列表(含 cUrl 客服链接、tgUrl、微信号) |
| `GET /common/high/comNews` ✓ | 公告(HTML);`GET /common/high/help {type}` ✓ 帮助文档;`GET /common/high/carousel` 轮播;`GET /common/high/rankNames` ✓ 称号表(按余额:农民工5000→万元户1万→包租婆2万→地主爷5万→大富豪10万);`GET /common/high/phb {type}` ✓ 排行榜{week/day?:[{nick,win}]} |

### 6.8 文件上传

图片上传(fcApply截图、收款码)走独立 file 接口(响应 `{url:"/api/file/2023..../xx.jpg"}`,前端拼 OSS 前缀 `https://sdlm-p-west.oss-cn-chengdu.aliyuncs.com`)。

## 7. 本项目工具链(D:\28.nizhan.cc\pcdd-scraper)

| 文件 | 说明 |
|---|---|
| `lib/wn28.js` | 登录/发码/试玩/加解密 + GET/POST 封装;CLI: `node lib/wn28.js 账号 密码 验证码` |
| `lib/stomp.js` | 最小 STOMP 客户端(零依赖) |
| `wn28-poll.js` | REST 轮询采集 → `wn28_jnd28` 明细表 + 统一并入 `draws` 表 |
| `wn28-live.js` | WS 实时监听(支持试玩/真实 token) |
| `probe-bet.js` | 投注接口只读探测(gameRate/gameBetPage/myModeList 等) |
| `probe-member.js` | 个人中心只读探测(40+ GET) |
| `trial-bet.js` | 试玩会话下注验证(最小 body、错误码、最低投注) |
| `verify-settle.js` | 下注→等开奖→结算语义端到端验证 |
| `extract-apis.js` / `extract-fnmap.js` | 从 bundle 提取全部端点/函数名映射(输出 data/wn28_*.txt) |
| `scrape.js` / `report.js` | yuce01 历史抓取 / 统计报表 |
| `data/canada28.sqlite` | `draws`(统一期号库,双源去重)、`wn28_jnd28`(完整明细)、`wn28_raw`(WS日志) |

token 存于 `data/wn28_token.json`(24h 过期,过期重跑登录)。
