Skip to content

fix: 全面强化运行可靠性与安全边界 - #158

Open
652036 wants to merge 3 commits into
hangone:mainfrom
652036:fix/comprehensive-hardening
Open

fix: 全面强化运行可靠性与安全边界#158
652036 wants to merge 3 commits into
hangone:mainfrom
652036:fix/comprehensive-hardening

Conversation

@652036

@652036 652036 commented Sep 2, 2026

Copy link
Copy Markdown

变更目的

修复账号任务失败后仍可能显示成功、并发同步覆盖题库,以及验证码流程结束后未正确恢复共享浏览器状态等问题。同时统一配置解析、数据目录和错误处理,方便定位失败原因并重跑未完成的任务。

主要改动

  • 配置与启动:集中解析 CLI、环境变量和 TOML,统一配置、日志、题库及验证码调试文件的路径。启动时校验参数,无交互环境不等待输入;多账号结果汇总为明确的退出码,嵌入调用结束后恢复相关环境变量并关闭日志。
  • 请求与响应处理:只对显式标记的只读请求自动重试;区分网络错误、协议错误、登录失效和账号锁定。补充空值、畸形数据及非有限分数校验,并对请求日志和响应摘要做脱敏、截断。
  • 题库存储与匹配:通过线程锁、文件锁和原子替换保护完整读改写事务,保留有效备份。远程题库在最终事务中合并,避免覆盖并发更新;题目匹配保留正负号和比较符,要求答案能唯一映射到当前试卷选项。
  • 学习与考试结果:完课后有界轮询服务端进度,未确认完成的项目返回 incomplete。考试流程校验试卷和答案记录,保留匹配率及最后一次机会的提交限制。同步阶段的网络错误、空对象和无效数据计为不完整,每次失败只计数一次,登录失效和锁号继续向上传播。
  • 验证码与浏览器:首次需要验证码时再探测浏览器,完整 CDP 配置优先于本地浏览器路径。为浏览器操作设置超时,并串行执行同一 CDP 端点上的验证码流程。localStorage 与其实际 origin 在同一次页面求值中保存,恢复前重新核对 origin,覆盖默认端口、域名大小写及首次 HTTPS 跳转的情况。
  • 打包与文档:同步更新 PyInstaller、Docker 入口、配置示例和 README;CI 增加质量检查及打包、容器冒烟测试。

使用上的变化

  • Python 仍要求 3.12,现有 TOML 字段继续支持;配置优先级为 CLI > 环境变量 > 账号配置 > 全局配置 > 默认值
  • 完课接口返回成功后,还需观察到服务端进度更新;部分任务失败会反映在账号结果及进程退出码中。
  • 记录答案、交卷等写请求不会自动重试。题库匹配存在歧义或响应不完整时,任务可能停止并要求重跑。

验证

在 Windows、Python 3.12 的项目虚拟环境中完成:

  • 全量测试:208 passed
  • Ruff check、Ruff format check、Pyright、git diff --check:通过。
  • 回归覆盖原子题库写入、错误降级、分数校验、交卷限制、浏览器状态恢复、多账号汇总及配置解析。
  • 本次补充的 12 个用例覆盖 origin 规范化与跳转、缺失 origin,以及模块/实验室接口空响应和请求异常的失败计数。

浏览器相关测试使用离线替身;尚未进行真实 CDP、线上账号流程或本地跨平台打包联调。GitHub CI 结果以 PR 检查状态为准。

652036 and others added 3 commits August 31, 2026 09:43
统一配置、工作流状态、请求重试与题库存储,防止误报完成、重复提交和数据损坏。补充协议契约与安全回归测试,并完善验证码、日志、打包和 CI 防护。
- main: 删除从未调用的 _prepare_browsers/_discover_cdp,浏览器探测统一由
  CaptchaHandler 懒执行;main() 退出时恢复 WB_DATA_DIR/WB_NON_INTERACTIVE
- runtime_config: atomic_write_text 移交描述符后不再重复 close;非法 UTF-8
  配置报 ConfigError;完整 CDP 配置优先于失效的 browser_path
- client: 辅助阶段(题库同步、历史满分读取)网络/协议错误降级为 incomplete
  而非整账号失败;finished/分数字段拒收 null、inf/nan、越界值,考试计划
  分数非法时 fail-closed;完课后进度按有界退避轮询;远程题库在同一事务
  内合并;学校列表错误日志不再回显响应正文
- captcha: WB_CAPTCHA_ROUNDS/ATTEMPTS 非法值安全回退;关闭前校验 origin
  后再恢复 localStorage
- api: 脱敏正则预编译
- errors: combine() 消息跟随最终状态
- tests: 新增 48 个回归用例(196 passed)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant