兑换成功会扣积分,所以"余额确实少了多少"是一个独立于接口返回的确认证据—— 2026-09-30 出现过订单实际已支付、程序却报成失败的情况,只看接口返回不够。 基线的获取时机刻意放在抢购链路之外:轮次/预热期间任何额外请求都会挤占锁单, 账号越多越明显。基线只在三个时机更新: - 导入账号后自动查一次(后台执行,不阻塞导入返回) - 用户手动点"查询积分"时 - 每次抢购核对之后把最新余额存回,下一次抢购的基线就是上一次的终值,差值才准 账号被编辑(改名/换 Cookie)时清掉旧基线,删除账号时一并清理。 - 新增 ScoreBaselineStore(scores.json,与账号库同目录,原子写盘): 记录每个账号上次已知的积分余额与时间;账号库路径为空时退化为纯内存,不写工作目录 - 核对输出示例: "积分已扣减,兑换确认: 账号=a 抢购前=1000 抢购后=800 扣减=200" 并把"|积分-200"附到结果集,账号表里也能直接看到确认信息 - 没有基线时只记录余额并提示"下次抢购即可比对",不会误报"未扣分"; 积分接口失败只记警告,不改变"抢到"这个结论 - 抢购进行中调用导入不会去查询积分(避免与锁单抢连接),提示稍后手动查询 - 预热日志措辞修正:"开始预热: N 个请求" → "N 个账号"(每账号实际不止一个请求) - 新增测试:TestVerifyRunResultsConfirmsScoreDeduction、TestVerifyRunResultsWithoutBaseline、 TestVerifyRunResultsIgnoresScoreFailure、TestScoreBaselineStorePersists、 TestFetchScoreBaselinesRecordsValues
36 lines
1.3 KiB
Go
36 lines
1.3 KiB
Go
package constants
|
|
|
|
import "time"
|
|
|
|
// Version 应用版本号,与 wails.json version 同步。
|
|
const Version = "0.3.5"
|
|
|
|
// BuildTime 构建时间,由编译时 ldflags 注入。
|
|
var BuildTime = "unknown"
|
|
|
|
const (
|
|
BaseURL = "https://www.douyu.com"
|
|
UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36"
|
|
DefaultAttempts = 2
|
|
DefaultConcurrency = 150
|
|
ProductCacheTTL = 30 * time.Second
|
|
|
|
DefaultAppDataDirName = "douyu-go"
|
|
DefaultConfigFile = "config.json"
|
|
DefaultAccountFile = "accounts.txt"
|
|
DefaultLogDir = "logs"
|
|
DefaultSuccessDir = "success_images"
|
|
|
|
// LegacyDefault* 是旧版本相对工作目录存储的位置,仅用于首次迁移。
|
|
LegacyDefaultConfigFile = "config.json"
|
|
LegacyDefaultAccountFile = "data/user.txt"
|
|
|
|
// DefaultTimeAPI 服务端时间校准接口。
|
|
// 斗鱼服务器时间与活动无关,统一用精英手册的 storedetail(能稳定返回
|
|
// data.preExchange.currentTime),所有活动共用。
|
|
DefaultTimeAPI = BaseURL + "/wgapi/ordnc/activity/peace/storedetail?manualID=G4KA4Qnz4LDp7&commodityID=20260120QYOOB_bag274&rid=9263298"
|
|
)
|
|
|
|
// CST 中国标准时间 UTC+8。
|
|
var CST = time.FixedZone("CST", 8*3600)
|