148 lines
6.7 KiB
Markdown
148 lines
6.7 KiB
Markdown
# huya-go
|
||
|
||
虎牙活动积分兑换/抢购的 Go 复刻版。支持两种传输层,CLI 与 GUI 默认都走 `wss`:
|
||
|
||
- `wss`(默认):浏览器实际使用的通道。先调用 `launch.queryHttpDns` 解析可用 host,再走 TAF `WebSocketCommand` 外层与 WSS 初始化流程(`launch.wsLaunch` → `mobileui.getConfig`)。host 留空即自动解析,解析失败会回退内置默认 host。
|
||
- `http`:走 `https://cdnws.api.huya.com/`,作为可回退通道;CLI 用 `-transport http`,GUI 在设置里切换。
|
||
|
||
## 构建
|
||
|
||
CLI:
|
||
|
||
```bash
|
||
go test ./...
|
||
go build -o huya-go ./cmd/huya-go
|
||
```
|
||
|
||
GUI:
|
||
|
||
```bash
|
||
cd frontend
|
||
npm install
|
||
npm run typecheck
|
||
cd ..
|
||
wails build -debug -nopackage
|
||
```
|
||
|
||
GUI 二进制输出到 `build/bin/huya-gui`。开发时可以使用 `wails dev` 启动 Wails + React + Ant Design 界面。
|
||
|
||
Windows exe(文件名带版本号):
|
||
|
||
```bash
|
||
./scripts/build-windows.sh # 默认 windows/amd64
|
||
./scripts/build-windows.sh arm64 # 如需 windows/arm64
|
||
```
|
||
|
||
产物为 `build/bin/huya-gui-v<版本>.exe`(PE32+ GUI)。版本号的单一来源是 `internal/version/version.go`:脚本从这里读取版本号,既拼进 exe 文件名,也通过 `-ldflags "-X huya-go/internal/version.Version=..."` 编译进程序,界面左下角的版本标签来自同一个值。发布新版本时改这一处,并同步 `wails.json` 的 `info.productVersion`(只影响 exe 文件属性)。在 macOS 上交叉编译不会生成 NSIS 安装包(`-nopackage`),只产出 exe。
|
||
|
||
## Cookie
|
||
|
||
推荐把账号 Cookie 放到本地文件,一行一个账号:
|
||
|
||
```text
|
||
yyuid=...; udb_uid=...; guid=...; ...
|
||
```
|
||
|
||
不要把 Cookie、token、JWT 提交到仓库或写进文档。
|
||
|
||
## 常用命令
|
||
|
||
GUI 界面提供账号预览、奖品列表、积分查询、兑换记录、直接兑换、监控抢购、实时日志。
|
||
|
||
CLI 示例:
|
||
|
||
查询奖品列表:
|
||
|
||
```bash
|
||
./huya-go -cmd list -sid 2203 -cookie-file cookie.txt
|
||
```
|
||
|
||
查询积分:
|
||
|
||
```bash
|
||
./huya-go -cmd score -sid 2203 -cookie-file cookie.txt
|
||
```
|
||
|
||
直接兑换指定 PID:
|
||
|
||
```bash
|
||
./huya-go -cmd exchange -sid 2203 -pid 12889 -cookie-file cookie.txt
|
||
```
|
||
|
||
按奖品名轮询并抢购:
|
||
|
||
```bash
|
||
./huya-go -cmd monitor -sid 2203 -name 小黄鸭 -cookie-file cookie.txt -loops 20 -delay 120 -concurrency 5
|
||
```
|
||
|
||
定时开始:
|
||
|
||
```bash
|
||
./huya-go -cmd monitor -sid 2203 -pid 12889 -cookie-file cookie.txt -at "2026-07-06 20:00:00"
|
||
```
|
||
|
||
以上默认都走 `wss`。需要回退到 http 传输时,给任意命令加上 `-transport http`。
|
||
|
||
## 多开(多实例)
|
||
|
||
同一台机器可以同时启动多个实例,互不干扰:
|
||
|
||
- 启动时按顺序占用「实例槽位」并加独占锁:第 1 个进程是**默认实例**(沿用历史数据目录),第 2 个及以后分别是 `实例 2`、`实例 3`…,数据目录为 `<数据目录>/instances/instance-N`。
|
||
- 每个实例独占自己的日志目录与 WebView2 用户数据目录,所以多开时日志不会交错,Windows 上也不会出现「第二个窗口开不出来」。
|
||
- 界面本地存储(账号、设置、商品缓存)按实例分片,每个实例各存各的账号;标题栏会显示当前实例名。
|
||
- 槽位锁在进程退出时自动释放;若锁目录不可写,会退回到「进程唯一」的临时实例目录(日志降级为仅内存),**绝不退回默认目录**,以免两个进程互相覆盖。
|
||
- 环境变量:`HUYA_DATA_DIR` 覆盖数据根目录,`HUYA_LOG_DIR` 覆盖日志目录,`HUYA_LOG_LEVEL` 覆盖默认日志等级。
|
||
|
||
## 日志
|
||
|
||
GUI 与 CLI 共用同一套结构化日志(分类 + 等级 + 账号标签),同时输出到界面与磁盘:
|
||
|
||
- 路径:`<数据目录>/logs/huya-go_<实例标识>_<时间戳>.log`。macOS 数据目录为 `~/Library/Application Support/huya-go`,Windows 为 `%AppData%\huya-go`。
|
||
- 每次启动创建独立文件(`O_EXCL` 抢占,重名自动加 `-2` 后缀),所以多开或同秒重启都不会写进同一个文件;文件开头写明实例名、数据目录与格式说明。
|
||
- 单文件上限 5MB,超出后滚动为 `.1` ~ `.5`,最旧的被丢弃。
|
||
- 每行格式:`时间 [分类][等级][账号] 正文`。逐条网络请求是 `debug` 级,默认不记录,可在界面「日志」页签打开「调试」开关,或 CLI 使用 `-log-level debug`。
|
||
- 写盘是异步且队列有界:队列满时丢弃日志并在文件尾部与界面提示丢弃条数,避免磁盘 I/O 拖慢抢购链路。
|
||
- 界面「日志」页签支持按等级筛选、按 ID 增量拉取、一键打开日志目录或复制路径。
|
||
- GUI 启动失败(例如 WebView2 建不出环境)时,`<用户缓存目录>/huya-go/startup.log` 会记录原因。
|
||
|
||
## 参数说明
|
||
|
||
- `-cmd`:`list`、`score`、`records`、`exchange`、`monitor`。
|
||
- `-sid`:活动 SID,必填。
|
||
- `-pid`:奖品 PID。`exchange` 必填,`monitor` 可用 `-pid` 或 `-name`。
|
||
- `-max-price`:目标奖品最高积分,`0` 表示不限制(CLI 与 GUI 设置都支持)。
|
||
- `-min-left`:目标奖品最少剩余库存,`0` 表示不限制(CLI 与 GUI 设置都支持)。
|
||
- `-cookie`:单账号 Cookie。
|
||
- `-cookie-file`:多账号 Cookie 文件。
|
||
- `-transport`:`wss` 或 `http`,默认 `wss`。
|
||
- `-wss-host`:WebSocket host。默认留空,自动调用 `launch.queryHttpDns` 解析(带 TTL 缓存、多 host 轮询),解析失败时回退内置默认 host;需要固定时可显式指定。
|
||
- `-timeout`:单次调用超时秒数。
|
||
- `-loops`、`-delay`、`-concurrency`:轮询次数、轮询间隔、并发账号数。
|
||
- `-stop-after-success`:`monitor` 中任一账号成功后是否停止。
|
||
- `-log-dir`:日志目录,默认使用应用数据目录下的 `logs`。
|
||
- `-log-level`:日志最低等级,`debug`/`info`/`warn`/`error`,默认 `info`。
|
||
- `-v`:输出调试日志(等价于 `-log-level debug`,并把网络日志同时打到 stderr)。
|
||
|
||
## 已确认的小黄鸭参数
|
||
|
||
2026-07-06 浏览器手动抢购抓包确认:
|
||
|
||
- `sid=2203`
|
||
- `pid=12889`
|
||
- 奖品名:`套装-潮萌小黄鸭`
|
||
- 消耗积分:`988`
|
||
|
||
远端配置里的子奖品代码不能直接当兑换 PID,实际兑换以 `scoreExchangePrize` 请求里的 `pid` 为准。
|
||
|
||
## 精英宝典/幸运币(2026-10-13 抓包)
|
||
|
||
`m-shop.huya.com` 积分中心的兑换记录里确认到:
|
||
|
||
- `sid=2277`
|
||
- `pid=13409`
|
||
- 奖品名:`幸运币礼包(小)`
|
||
- 消耗积分:`20`
|
||
- 订单号格式:`sOrderId_2277_13409_<uid>_<时间戳>_<随机>`
|
||
|
||
该活动的列表/积分/兑换接口与 `sid=2203` 走同一套 `webActUI`,可直接用 `-cmd list -sid 2277` 验证;同一次抓包里「开通精英宝典 / 购买精英币」属于商城付费链路(`shopMiddleUI.*` + 支付宝),本项目未实现,详见 `WSS_NOTES.md`。
|