Commit Graph
96 Commits
Author SHA1 Message Date
yml2213 46c06180a5 重构锁单支付重试内核并修复多实例启动,发布0.3.0
- 抢购内核改为"每账号独立重试循环",移除轮次屏障:旧实现在 3 个中签账号卡住
  60 秒支付退避时,另外 31 个账号空转 39 秒,还出现过"某一轮只跑 1 个账号、其余整轮没被尝试"
- 锁单退避改为读取配置的"重试间隔策略"(同一账号连续失败成倍放大,封顶 5 秒),
  删掉硬编码 30 秒退避与"只重试一次"
- 锁单失败不再提前停止:限流(活动火爆/网络繁忙)继续重试;售罄也继续降频探测
  (别人锁单后支付失败或锁单过期,库存会回流),只在窗口结束时按售罄/限流/普通失败分类上报
- 支付重试按斗鱼错误码决策:1644430001/1644400002/1644400014 视为"订单已受理、结果未定"
  并快重试(300ms 起),取代按文案把"订单操作进行中"误判成频控的 60 秒退避;
  不再设次数上限,只受 120 秒预算与锁单过期约束,超出预算如实报"支付结果未知"
- 已锁订单在 75 秒窗口结束后仍会支付完,不再受窗口约束
- 多实例:为每个实例分配独占的 WebView2 用户数据目录。Wails 默认所有实例共用
  %APPDATA%\<可执行文件名>,而一个数据目录只能有一个浏览器进程,导致偶发开不出新实例、
  必须全部关掉重开;实例占位因此提前到 wails.Run 之前完成
- 多实例:占位失败不再静默退回默认目录(会让两个进程共享 accounts.txt/config.json、
  同秒启动还会写同一个日志文件),改为进程唯一的临时实例目录并记录降级原因
- 多实例:单个槽位锁被瞬时占用(杀软/索引器)时短暂重试,仍失败则继续试下一个槽位
  而不是整个分配失败;日志文件改为独占创建,同秒启动自动追加 -2/-3 后缀
- 新增 %LOCALAPPDATA%\douyu-go\startup.log,记录每次启动与失败原因,
  便于排查"窗口起不来"这类连应用日志都不会生成的问题
- 修复预热缓存日志每个账号打两遍、"账号尝试"计数误导(改为真实锁单/支付/直接兑换次数)
- 修复前端把含"成功"字样的失败文案显示成抢到(改为只认"成功|"前缀)
- 修复 jitterDuration 在基准小于 10ms 时 rand.Int63n(0) 会 panic 的隐患
- 设置页文案与作用域同步:重试间隔策略明确作用于锁单重试、"尝试包数"明确仅用于和平小店
2026-10-03 19:09:19 +08:00
yml2213 1f76c12b48 精英手册改为锁单支付并发布0.2.2
- 精英手册兑换改为 createExchangeOrder 锁单后 payExchangeOrder 支付,不再查询商品状态与预兑
- 电竞手册保留直接兑换,标准模式重新取鉴权,激进模式复用鉴权
- csrfToken 优先复用 Cookie,校验失败自动刷新后重试一次
- 锁单支付按频控/通用退避表重试,临近过期不再重试
- 定时复校发现抢购已开始则不再改写触发时刻
- 升级 wails 至 v2.15.0
2026-09-30 20:35:44 +08:00
yml2213 911f967463 优化账号商品选择并发布0.2.1 2026-08-09 20:04:55 +08:00
yml2213 266f4a3da1 修复库存监控提前停止并发布0.2.0 2026-08-09 19:37:30 +08:00
yml2213 02d38d9ede 支持按账号商品监控库存抢购 2026-08-09 18:46:39 +08:00
yml2213 a9ad969b64 支持多开实例隔离并默认打开小店 2026-08-09 17:25:18 +08:00
yml2213 6c881e9182 修正发布包版本元数据 2026-08-09 16:11:20 +08:00
yml2213 fde6b00780 优化小店报告订单状态展示 2026-08-09 16:09:50 +08:00
yml2213 0c55da1e97 新增小店抢购报告导出并优化停止条件 2026-08-09 16:06:46 +08:00
yml2213 8b867709b2 修复账号删除确认弹窗 2026-08-09 15:20:00 +08:00
yml2213 2e9847e15d 抢购完成后自动刷新小店资产 2026-08-09 15:08:10 +08:00
yml2213 754e3f1ca8 优化和平小店抢购重试策略 2026-08-09 14:48:20 +08:00
yml2213 87cb1dc3f0 新增库存监控并优化开发日志 2026-08-09 14:06:55 +08:00
yml2213 8cf29598a5 升级版本并改用内部账号存储 2026-08-09 13:04:54 +08:00
yml2213 1cd94c0179 优化和平小店兑换记录查询 2026-08-09 12:54:37 +08:00
yml2213 8919d020c5 修复和平小店商品图片和库存展示 2026-08-09 12:38:08 +08:00
yml2213 1b697ced09 合并远程main并保留和平小店功能 2026-08-09 10:52:56 +08:00
yml2213 cd1c3db691 停止重复兑换已拥有道具账号 2026-08-09 10:35:30 +08:00
yml2213 c41fd48b1c fix: preserve xiaodian ios platform in asset queries 2026-08-09 10:10:49 +08:00
yml2213 feb72196c1 优化和平小店碎片兑换链路 2026-08-09 10:07:36 +08:00
yml2213 c6f16dfbee 增强和平小店账号管理 2026-08-09 09:18:41 +08:00
yml2213 dde2b43d82 feat: improve xiaodian seckill flow 2026-08-08 23:04:40 +08:00
yml2213 16972b41cd 升级版本并完善双平台打包 2026-08-08 19:52:00 +08:00
yml2213 424fb33e05 移除兑换记录账号表格 2026-08-08 19:47:06 +08:00
yml2213 c84940a5dc 新增和平小店兑换记录查询 2026-08-08 19:44:39 +08:00
yml2213 57344c7874 完善CK管理增删改导入 2026-08-08 19:30:23 +08:00
yml2213 04ffbafc1c 紧凑排列和平小店抢购控件 2026-08-08 19:02:51 +08:00
yml2213 9c5fe39d76 调整和平小店抢购控制布局 2026-08-08 19:00:59 +08:00
yml2213 68bdd6b42c 提高和平小店固定抢购次数上限 2026-08-08 18:57:09 +08:00
yml2213 9d95417e24 优化和平小店关键词监控配置 2026-08-08 18:53:22 +08:00
yml2213 089f992dfa 完善固定抢购校验提示 2026-08-08 18:41:55 +08:00
yml2213 a4fed8befb 增加和平小店关键词固定抢购 2026-08-08 18:40:53 +08:00
yml2213 51e91b0483 增加和平小店商品分类展示 2026-08-08 18:29:31 +08:00
yml2213 06ad1498da 优化和平小店商品列表界面 2026-08-08 18:01:10 +08:00
yml2213 395096e229 查询扭蛋碎片+点券 2026-08-08 17:50:00 +08:00
yml2213 379a9d58d3 小店商品列表shujuok 2026-08-08 17:40:16 +08:00
yml2213 22dc50196f 增加版本号 2026-07-29 14:49:37 +08:00
yml2213 c052a589d1 完善电竞手册鉴权与诊断日志 2026-07-29 14:24:26 +08:00
yml2213 f64838f8db 优化一些功能 2026-07-29 14:02:56 +08:00
yml2213 2c88edb741 重构: 应用代码移入 internal/app 包,根目录只留入口
根目录原 7 个 app*.go 平铺,现收进 internal/app/ 子包:
- package main → package app
- NewApp → New(导出)
- startup/shutdown → Startup/Shutdown(导出,供 main.go 引用)
- main.go 改为薄入口,仅导入 internal/app 并装配 Wails

前端同步更新(Wails 绑定路径 go/main → go/app):
- window.go.main.App → window.go.app.App(10 处)
- env.d.ts 类型声明路径 wailsjs/go/main/App → wailsjs/go/app/App

根目录 Go 文件从 7 个减至 1 个(main.go),元文件更清晰
2026-07-29 13:27:08 +08:00
yml2213 5631f579ea 重构: 按领域拆分大文件,清理死代码和空目录
app.go (768行) 拆分为 6 个文件:
- app.go: App struct/辅助方法/NewApp/startup/shutdown/GetVersion
- app_products.go: 商品加载/账号查询
- app_seckill.go: 抢购控制/日志/时间
- app_verify.go: 积分查询/兑换记录复验
- app_export.go: 账号导出/整理
- app_activity.go: 活动切换/配置保存

scheduler.go (1141行) 拆分为 4 个文件:
- scheduler.go: struct/常量/设置/RunNow主循环/executeRound/辅助函数
- attempt.go: runAttempt/runAttemptFast/激进模式缓存
- warmup.go: 预热管理/warmupAttempts
- schedule_timer.go: 定时抢购/时间校准/定时器管理

其他清理:
- CollectFontCandidates 从 config 包移到 image 包(职责归属)
- 删除 logger 死代码: ParseLogLine/ParseLogMeta/DetectLogLevel/
  IsLogLevel/LogMeta/LogDebug/cutBracket 等反解析函数及对应测试
  (日志结构化后不再有生产调用方)
- 删除 static/ 空目录残留
2026-07-29 13:19:43 +08:00
yml2213 b72a58fd57 重构: 日志系统结构化,消除字符串反解析
旧链路:LogEvent→log.Print→logFileWriter→MemoryLogStore.Write
再用 ParseLogLine 字符串切割把分类/级别/账号反解析回来,格式一调就崩。

新链路:LogEvent 直构 LogEntry(Time/Level/Category/Account 直接填值),
经 sink 分发到内存(同步)/文件(异步)/终端。Message 仍用 formatLogLine
渲染保持文件文本格式与前端清理逻辑兼容。

- MemoryLogStore 新增 Append(entry) 替代 Write 的字符串解析路径
- 删除 logFileWriter,新增 sink 统一管理三路输出
- 删除 log.SetOutput/log.Print 依赖
- 保留 ParseLogLine/DetectLogLevel/formatLogLine(AsyncLogWriter 丢弃
  统计与测试仍用),但 log_store 不再调用
- 新增 TestStructuredLogging 覆盖 LogEvent→sink→Append 链路与 minLevel 过滤
2026-07-29 12:52:26 +08:00
yml2213 7c2c5a61a6 重构: 账号管理抽离、强类型返回、消除反射、删除死字段
- 抽离账号管理为独立 AccountStore,Scheduler 只持有引用,
  职责单一化(scheduler.go 减少 ~110 行)
- Wails 绑定方法返回结构体替代 map[string]any(新增 responses.go),
  前端获得强类型,字段名保持兼容无需改前端
- ExchangeRecord 移至 types 包,消除 types↔client 循环依赖
- extractAPIStatus 用 apiResponder 接口替代 reflect 逐字段查找,
  types.APIResponse 与 ExchangeListResponse 实现 APIStatus 方法
- 删除 types.Account.Password 死字段(鉴权仅用 Cookie)
- 重新生成 Wails 绑定,前端 vue-tsc 类型检查通过
2026-07-29 12:47:01 +08:00
yml2213 3ae9cb4a42 重构: 活动热切换并发安全 + 代码清理优化
- 活动切换并发安全:App/Scheduler 增加 client/cfg 读写锁与快照访问,
  支持运行中热替换客户端,切换活动不再静默覆盖用户自定义 timeApiUrl
- 启动失败时写入崩溃日志文件便于事后排查
- 前端类型声明从 Wails 自动生成的绑定派生,避免手写契约漂移
- 提取 parseAccountFile 消除 ExportAccounts/OrganizeAccounts 重复解析逻辑
- 删除 utils 中未使用的 ReadJSON/WriteJSON/WriteError 及空目录 internal/app
- gofmt 统一格式化(activity/types/scheduler 字段对齐)
- 新增 logger/seckill/utils 单元测试
- 清理 git 中遗留产物(frontend/app.js、yml.txt、其他日志/)并补全 .gitignore
2026-07-29 12:33:16 +08:00
yml2213 ed3fd5f09e fix: peacematch 兑换用 multipart/form-data(与抓包一致)
根据实际兑换抓包修正:
- Content-Type 从 urlencoded 改回 multipart/form-data(浏览器实际用 multipart)
- postMultipart 支持组合 token csrf\x00ctn,自动拆分并合并 cvl_csrf_token+acf_ccn 到 Cookie
- 移除不再需要的 postForm 方法和 net/url 导入
- 验证:表单字段(manualID/commodityID/num/rid/ctn)与抓包完全一致,
  storedetail 确认无 preExchange 字段(时间校准修复正确)

抓包来源:/Users/yml/Desktop/抓包/douyu/7.29/电竞手册-兑换并查询信息与积分.har
2026-07-29 11:08:49 +08:00
yml2213 599f9d71f0 fix: 电竞手册用 ctn(acf_ccn) 鉴权替代 csrfToken
peacematch 与 peace 的兑换接口鉴权机制完全不同:
- peace: 表单发 csrfToken 字段,multipart 格式
- peacematch: 表单发 ctn 字段(值=acf_ccn),urlencoded 格式,
  cvl_csrf_token 只放 Cookie,不需要 batchExchangeLimit/preExchange

改动:
- Activity 加 UseCTN/CTNURL 字段
- GenerateCSRF 对 UseCTN 活动额外 FetchCTN 获取 acf_ccn,组合返回
- 新增 postForm(urlencoded) 方法用于 peacematch 兑换
- Exchange 按 UseCTN 分流:peacematch 发 ctn 字段,peace 发 csrfToken
- BatchExchangeLimit/PreExchange 对 UseCTN 活动跳过(返回默认值)
- 参考 /Users/yml/codes/douyu_login_py 中 Python 实现
2026-07-29 11:05:46 +08:00
yml2213 8e52e12005 fix: 时间校准接口全局复用旧 peace/storedetail,修正活动名称
- 从 Activity 结构体移除 TimeAPIURL 字段,时间校准与活动无关,
  统一用 constants.DefaultTimeAPI(peace/storedetail 能稳定返回 currentTime)
- 旧活动 peace DisplayName 从"和平手册"修正为"精英手册"
- 更改项目默认端口避免冲突:Vite 5173→15173,Wails dev 34115→34215
2026-07-29 10:48:42 +08:00
yml2213 f4d33d19c0 增加电竞手册 2026-07-29 10:36:44 +08:00
yml2213 c61be33d77 版本号 0.1.2 → 0.1.3 2026-06-28 15:30:23 +08:00
yml2213 1996b3a3fc 优化时间校准:避免预热重复、平滑偏移生效
- 复校时跳过预热定时器,初始调用已完成预热
- calibrateDouyuTime 返回平滑后的偏移值,定时器调度使用中位数过滤跳变
2026-06-28 15:28:59 +08:00