Repository navigation
v0.1.11
通过 CPA 插件商店安装(推荐)
本插件已收录进 CPA 官方插件源,无需额外配置三方源。
在管理面板的插件商店里直接搜 FreeTier 2API 一键安装即可。
手动安装
下载对应平台的 freetier2api_<版本>_<goos>_<goarch>.zip,解压后把其中的
freetier2api 动态库放进 CPA 的 plugins/ 目录。
归档里已经用的是宿主要求的 freetier2api{ext} 文件名,解压后无需改名。
| 平台 | 下载归档 |
|---|---|
| Linux x86_64 | freetier2api_<版本>_linux_amd64.zip |
| Linux arm64 | freetier2api_<版本>_linux_arm64.zip |
| macOS Apple Silicon | freetier2api_<版本>_darwin_arm64.zip |
| macOS Intel | freetier2api_<版本>_darwin_amd64.zip |
| Windows x64 | freetier2api_<版本>_windows_amd64.zip |
checksums.txt 可用于核对归档完整性;配置与账号导入见仓库 README。
本版要点
fix: 整修合并 #14/#15 后的删除、额度与管理接口,修复 Qoder 余额显示 0/0
两个社区 PR(#14 相对路径删除、#15 管理接口与上游响应加固)已合入,但对
合并结果做完整审查后,发现若干处在既有结构上叠补丁而不是修到根因,本次
统一收敛。另修复 #14 引入的 Qoder 剩余/总额恒为 0/0 的回归。
额度折算(用户可见回归)
- #14 的 presence 标志把「第一个出现的额度族」永久锁定。Qoder 同时输出
user_quota_(套餐)与 addon_quota_(拓展包),Free 计划的套餐是合法的
{used:0,total:0,remaining:0},于是拓展包额度永远覆盖不上,页面恒为 0/0。
改为按族分组、选「真有容量」的族;所有族都无容量时才回落到第一族
(此时 0/0 是真实语义)。「只报 used」的反推保留,显式 total=0 不反推。 - 三份必须手工同步的键白名单(remaining/total/used 各一个 switch)合并成
一张 quotaKeyRoles 表:族与角色收敛成一处知识,避免同类静默 0/0。 - 新增回归用例:Qoder Free+拓展包让位、全 0/0 保留第一族、显式 total=0
不反推。
凭证路径与删除(#14 的根因修复)
- 相对路径归一化上移到宿主边界 hostbridge.ResolveAuthPath,在
ListAuths / AuthJSONAndPath 出口统一处理;删除、stat 取修改时间、读文件
兜底、续期写回四条路径共用同一份绝对路径。删除入口不再各自换算。 - 删除校验收敛为 safeAuthFileForDelete:归属校验 → 运行时凭证 → 必须绝对
路径 → 必须存在 → .json / 符号链接 / 目录 → 目标文件身份比对。 - 修掉 #14 的两个行为问题:
- 文件不存在时原先 Lstat 返回 nil、Remove 命中 IsNotExist 也返回 nil,
页面会显示「已删除」而账号其实还在;现在如实报错。 - 路径基准不一致时同名文件可能属于另一个账号;删除前比对目标文件的
vendor 与 UID(只比身份字段,不涉及 token)。
- 文件不存在时原先 Lstat 返回 nil、Remove 命中 IsNotExist 也返回 nil,
- deleteAuthFile 精简为「取凭证 → 校验 → 删除」。
管理接口请求体
- 泛型 decodeRequest[T] / decodeRequestInto 取代逐 handler 的解码样板,
覆盖 11 个管理入口;models 两处重复的错误文案统一。 - /tasks/run 原先在 tasks 包内用
_ = json.Unmarshal吞掉畸形 JSON,
#15 声称覆盖任务入口但实际漏掉;解析上移到 admin,tasks 只接收
QueueRequest,缺省值由 DefaultQueueRequest 提供。 - login/callback 保留 {ok,status,message} 契约:页面按 AuthLoginStatus
读字段,#15 改成 {ok,error} 会丢掉「请刷新页面后重试」这句提示。
供应商
- WorkBuddy 领奖:#15 修好了解析但调用方仍吞错并返回 (0,0),用户看到的
仍是「任务已达标」。claimGrowthReward 改为返回 error 并上抛到
AutoTaskResult;parseClaimResult 改用指针字段一次解码(原实现解两遍)。 - Qoder 短响应上限:三个重复的 1<<20 合并为 shortResponseMaxBytes,并把
仍在无界读的 FetchUserInfoWithToken 纳入;签到读失败不再静默当成空正文。
宿主流读取
- 空分片退避去掉 time.NewTimer 与
if !timer.Stop() { <-timer.C }排空写法
(Go 1.23+ 的 unbuffered timer 下会阻塞),改用仓库既有的 time.After;
保留 32 次上限与指数退避。
测试与守卫
- 删除集成用例改用 t.TempDir 构造 core/oauth 平级布局,真正传
../oauth/<name>.json形态;新增绝对路径(标准 CPI 部署)与文件不存在
两条用例。 - 合并重复的 managementCall / managementCallWithBody helper。
- 架构守卫补反向检查:layerRules 里的非 vendor 包必须同时出现在
internalPackages。
验证(容器 golang:1.24,与 CI 一致)
gofmt / go vet ./... 通过
go test ./... -count=1 全部包通过
go test -race <core,state,auth,tasks,admin> 通过
go test -tags live ./tests/live -run '^$' 通过
go build -buildmode=c-shared(linux/amd64) 通过
版本保持 0.1.11:本次修复与 Qoder 设备身份改动一起发布。
Co-Authored-By: Claude Code noreply@anthropic.com
What's Changed
- fix: 宿主返回相对凭证路径时账号删除失效(EasyCLIProxyAPI 默认 ../oauth) by @ArmedHelicopter in #14
- fix: 加固管理请求与上游响应处理(stacked on #14) by @ArmedHelicopter in #15
New Contributors
- @ArmedHelicopter made their first contribution in #14
Full Changelog: v0.1.10...v0.1.11