检测到上海财经大学统一认证登录页(login.sufe.edu.cn)时,自动识别字符验证码并登录,成功后自动跳回原业务系统。原「上财自动滑块」(v1–v5)——服务端已改用字符验证码,滑块能力保留为兜底。
仅供本人账号的个人自动化使用。请控制请求频率,遵守学校相关规定;请勿用于他人账号或任何高频、批量场景。
- 自动检测上财登录页(SPA 渲染完成后触发),右上角浮窗倒计时 3 秒后自动登录;同时适配 WebVPN 镜像站
login-sufe-edu-cn-s.webvpn.sufe.edu.cn(API 自动改走当前源,校外 WebVPN 环境同样可用);在表单里点击/打字即取消(只认 pointerdown/input,关闭浏览器翻译弹窗等只会引起 focusin 的场景不会误取消) - 秒登录:倒计时期间后台并行「拉验证码图 → CRNN 预识别 → 预取登录配置」(无感进行,浮窗不显示技术提示),倒计时结束即刻提交
- 字符验证码 CRNN 离线识别:7 层 Conv + 2 层 BiGRU + CTC,纯 JS 前向(无 WASM、不受页面 CSP 影响),80×34 输入,浏览器内约 1s
- 识别失败无间隔自动重试:识别未通过/置信度不足 → 立即换图再识别(不等待),连试 10 次仍失败才转人工输入浮窗;重试页为像素大数字特效(与倒计时同款切换动画)
- 像素风 UI:英文/数字/字符为 Press Start 2P 像素体,中文为粗体思源黑;内容脚本内字体经 FontFace +
chrome.runtime.getURL注入(内容脚本 CSS 的相对url()在页面上下文解析不到扩展资源,这是 v5 及之前像素字体不生效的根因) - 流动 ASCII 装饰背景:
sufe-fx.js用 canvas 以 60fps 渲染——全面板极暗字符雨(@!%#等缓慢下落、边落边变字),右下角为由流动字符组成的 SUFE 字样(加粗、无眩光、低明度,纯装饰不抢前景),prefers-reduced-motion时降级为静态帧;浮窗与扩展弹窗共用 - 蓝色像素锁图标:16/48/128 全尺寸重绘(深蓝渐变底 · 亮蓝锁梁 · 蓝色锁体 · 浅蓝钥匙孔)
- 蓝金互补配色:暖调灰金玻璃面板 + 蓝色霓虹(文字/按钮/光效/扫描线/图标),对比度按可读性校准
- 密码使用服务端下发的 RSA 公钥(PKCS#1 v1.5)加密后传输——浏览器 WebCrypto 不支持 v1.5 填充,扩展内置了一个无依赖的 BigInt 实现(
sufe-crypto.js) - 滑块兜底(服务端切回滑块时自动启用):经典分割严格优先(~2ms、误差 0px),CNN 整图定位兜底(4.9 万参数,回归可通过窗口中心),盲试候选保底;同一 token 连续校验
- 浮窗滚动显示每轮识别/登录结果;弹窗提供「登录」(当前页直接执行,免刷新注入)与「测试验证码」「测试滑块」(不提交账号)、密码显隐、历史统计
- 闭环自检:
login.sufe.edu.cn/login/#sufe-test-vcode/#sufe-test-slider只跑识别/定位并在浮窗显示结果,不触碰账号密码 - 密码仅保存在本机
chrome.storage.local,不上传、不进浏览器同步;扩展只向login.sufe.edu.cn(及其 WebVPN 镜像源)提交数据 - 登录成功后 20 秒内不重复触发(防跳转异常导致自动登录死循环)
- 打开 Chrome,地址栏输入
chrome://extensions/ - 右上角打开「开发者模式」
- 点左上角「加载已解压的扩展程序」,选择本仓库克隆下来的
sufe-auto-auth文件夹(或从 Releases 下载最新sufe-auto-auth-vX.Y.Z.zip解压后选择该文件夹) - 点击工具栏扩展图标,填写学号、密码,勾选自动登录,点「保存」
日常无需任何操作:被业务系统跳到登录页时会自动处理并跳回。从 v5 升级:扩展 ID/存储键不变,覆盖加载后学号密码仍在。
页面加载 → 3s 倒计时 ‖ 后台并行:GET getRandcode → CRNN 预识别(~1s)→ GET queryAllValid(RSA 公钥 + ticket)
倒计时结束 → queryUserValid 确定验证类型
├─ vcode:预识别结果直接 doLogin;未通过 → 换图再识别(无间隔,×10)→ 仍失败转人工
├─ slidercaptcha:分割/CNN 定位 → sliderCaptcha check → doLogin
└─ 无验证:直接 doLogin
POST /api/v3/auth/doLogin → 学号 + RSA 加密密码 + vcode → 会话 Cookie → 跳转业务系统
字符验证码识别模型:输入 80×34×3(v/127.5-1 归一化)→ 7×[Conv3×3+ReLU(BN 已折叠),第 2/4/6 层后池化] → 高度均值 → 2 层 BiGRU(hidden 192) → CTC greedy 解码;model.bin(8.7MB)由后台 Service Worker 懒加载,页面进入时即预热(WARMUP)。
滑块坐标约定来自登录页前端源码:X = 拖动左偏移 × imgScale(背景图自然像素坐标);可通过窗口实测恒为 缺口左缘−5 … 左缘−1(中心 = 左缘−3,±2 余量)。
- 采集:
harvest2.py拉取真实验证码并用「缺口 = 平坦纯白连通块」给出精确标签(样本不入库,可重新采集) - 训练:
train2.py/train2_torch.py(numpy 手写反向 / torch,上财匡时一号算力平台 A40);cnn.py层实现,resize.py与 JS 等价的 area 缩放 - 校验:
gradcheck.py数值梯度校验;parity*.py/jsJS↔numpy 前向一致性;live_eval2.py在线闭环评测 - 打包发布:
build_dist.py生成 zip+crx;release.py建 GitHub Release 并传附件
常量集中在 content.js 顶部(AUTO_DELAY_MS 倒计时 / VCODE_MAX_AUTO_TRIES 自动重试上限 / VCODE_CONF_MIN 置信度阈值 / MAX_ROUNDS 等)。修改后在 chrome://extensions 中点扩展的「重新加载」即可生效。
| 现象 | 处理 |
|---|---|
| 浮窗没出现 | 确认地址栏是 login.sufe.edu.cn 且页面已渲染出登录框(SPA 最长等待 20 秒) |
| 「学号或密码错误(SSO10002)」 | 在扩展弹窗中更正账号信息 |
| 反复进入重试页后转人工 | 多为验证码难度突变或风控收紧期;用 #sufe-test-vcode 自检识别置信度 |
| 滑块兜底显示方式=blind/多轮未通过 | 多为缺口样式变化或风控收紧期;用 #sufe-test-slider 自检 CNN/分割坐标 |
| 登录成功但页面没跳走 | 浮窗会提示,手动刷新或重新进入业务系统即可 |
- 更名:上财自动滑块 → 上财自动认证(仓库
sufe-auto-slider→sufe-auto-auth);服务端已改用字符验证码,滑块保留为兜底 - SUFE 流动 ASCII 背景重写:旧版为
<span>逐字符 65ms 定时器(≈15fps、整体透明度 0.2,SUFE 字样昏暗且卡顿);新版sufe-fx.jscanvas 60fps——全面板极暗字符雨(@!%#缓慢下落、边落边变字)+ 右上角流动字符组成的低明度 SUFE 装饰字样 - 图标重绘:蓝色像素风挂锁(深蓝渐变底 · 亮蓝锁梁 · 浅蓝钥匙孔),16/48/128 全尺寸
- 像素字体修复:内容脚本 CSS 中的相对
url("fonts/…")在页面上下文解析不到扩展资源,像素字体从未生效;现于content.js用FontFace + chrome.runtime.getURL()注入(fonts/* 已在 web_accessible_resources),英文/数字为 Press Start 2P,中文维持粗体思源黑 - 倒计时 2s → 3s,倒计时期间后台并行预拉图 + CRNN 预识别 + 预取配置,倒计时结束即提交——秒登录;预识别失败自动重试一次(浮窗保持简洁,不显示后台过程提示)
- 验证码识别自动重试:识别未通过或置信度不足 → 立即换图重试(无等待),连试 10 次仍失败才转人工输入(旧版连续 2 次即转人工);人工输入错误自动换图重输
- 重试页像素化:重试序号以像素大数字显示(44px,与倒计时同款 digit-in/out 切换特效 + 脉冲辉光 + 不确定态流光进度条)
- 配色改版:绿色 → 蓝色霓虹(
#79b8ff / #4d8dff / #d0e6ff),面板底色采用互补的暖调灰金(rgba(52,46,33)→rgba(30,26,18)渐变 + 淡金描边),去除深蓝黑的脏灰感 lab/build_dist.py补齐 v5 起缺失的打包文件(sufe-crnn.js、model.json/bin、fonts/),并随仓库更名更新产物名
- 服务端改用字符验证码:新增 CRNN 离线识别(7 层 Conv + 2 层 BiGRU + CTC,纯 JS,
model.bin8.7MB Service Worker 懒加载);低置信度浮窗人工输入;滑块流程保留为兜底 - 倒计时期间后台预取验证码图与登录配置;浮窗/弹窗像素风改版(Press Start 2P + 思源黑子集)
- 架构反转:分割优先、CNN 兜底。实测(留出集 76 张)经典分割严格版 75/76 可信、误差 0.000px、耗时 2ms,而 CNN 是 0.46px / 1.76s(慢 515×)——改为「严格分割 → 宽松分割 → CNN → 盲试」懒执行候选流
- 严格分割判据来自数据:缺口 bbox 恒为 96×93、面积 ~5590(382 张中 99% 一致),要求「形状/面积合规且全场唯一」
- 模型换代:整图输入。背景图整体 area-resize 到 256×128(4×[Conv3×3+ReLU → 高度 MaxPool] → 1×1 → 256 列 softmax → soft-argmax),直接回归「可通过窗口中心」;训练在上财匡时一号算力平台(A40)完成;留出集 MAE 0.47px、≤2px 99%
- 交互改进:只认 pointerdown/input 取消倒计时、弹窗「登录」免刷新注入(
scripting权限)、密码显隐、成功统计、SSO10001提示 - 致谢:整图输入与部分交互改进的思路来自 Yanzhe Lu(上财人工智能专业)的社区 v2.1.0 分支
- 缺口识别换用轻量全卷积 CNN(缺口横带输入,约 4.4k 参数,纯 JS 前向);候选梯队 + 同 token 连续校验;闭环自检入口
#sufe-test-slider;开源训练管线lab/
- 首个版本:检测登录页后自动完成滑块验证并登录(RSA 加密密码;候选 X 盲试 + 多轮重试)
- Yanzhe Lu(上海财经大学,人工智能专业):提出并实现了「卷积 + 池化 CNN 定位缺口」的整图输入方案(其社区 v2.1.0 分支:整图 resize → 4×[Conv3×3+ReLU → MaxPool] → 1×1 头 → 列热图 → soft-argmax,并配套网格探测、免刷新注入等交互改进)。本仓库 v3 的整图 CNN 即在这一思路基础上重新实现并重训,该模型在 v4+ 中继续作为滑块兜底存在,特此致谢。
- 提交 Issue/PR 前请先在
chrome://extensions中点「重新加载」复现问题 - 请勿在 Issue、截图或日志中粘贴学号、密码、会话 Cookie 等凭据
- 登录页接口若改版(字段/路径变化),欢迎带上报错信息提 PR