Skip to content

About

校园网认证 / 校园网自动登录 / 校园网自动认证 / WiFi自动认证登录 / WiFi 自动认证:Windows 开机自动连校园无线网并完成 Portal 认证,托盘常驻、掉线重连、24 小时自检、多账号。内置 Dr.COM、天翼校园网、深澜 Srun、锐捷 ePortal 门户,支持自定义;附一键采集诊断包,可远程适配别人的学校。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

38 Commits

Folders and files

Repository files navigation

校园网自动登录(托盘 + 开机自启 + 多账号 + WiFi + 校时 + 网速 + 一键诊断 + 通知中心 + 唤醒重认证 + 自动修复 + 内存清理)

version edition

校园网自动认证登录 / WiFi 自动认证登录 —— Windows 装一次,之后开机自动连校园无线网、自动完成 Portal 认证、掉线自动重连。宿舍 WiFi(ChinaNet / CMCC-EDU / 沃 WiFi)、教学楼认证页都适用。

针对你学校这套 中国电信 Dr.COM 校园网认证门户(http://1.1.1.4);同一套脚本也内置了广东电信天翼校园网(enet.10000.gd.cn)和通用表单门户,换个学校不用改代码,详见 通用版:换所学校也能用。

设置一次,之后开机自动在后台跑,右下角有「网」图标,掉线自动重连,系统时间偏了会自动校准。


最快上手

  1. 双击 connect.bat → 弹菜单(会自动用 Windows Terminal 打开,所以背景图才生效)
  2. 第一次运行会自动进「新手向导」:问一句「这个 WiFi 是校园网吗」→ 不是就换名字 → 顺便填账号 → 自动认门户并生成配置
  3. 想再跑一次向导:菜单里按 G(或 -Mode wizard)
  4. 最后选 9 安装开机自启(向导最后也会问)

之后每次登录 Windows,右下角出现「网」图标就说明它在工作了。

向导到底做了什么

步骤 说明
① 问 WiFi 当前连的 WiFi 是不是要认证的那个?不是就让你填名字,同时写好「目标 WiFi + 自动连接」
② 问账号 一个账号都没有时,顺便填(DPAPI 加密保存)
③ 认门户 复刻"浏览器弹认证页":HTTP 302 → 网关 → HTTPS 劫持页,三路都试
④ 出配置 命中内置预设直接套用;没命中就抓门户页,从表单现场生成配置(见下)
⑤ 收尾 可选试登录一次、可选装开机自启

没命中时是怎么现场生成的:抓门户 HTML → 找含 password 的 <form> → 抠出 action 当登录接口、method 当提交方式、账号/密码字段名,把隐藏字段(如 wlanuserip、service)原样带上,拼成

wlanuserip=10.1.2.3&service=internet&username={user}&password={pwd}

再按页面里有没有 md5( / rc4 / base64 猜加密方式。生成结果存成 id=custom,成功判定留空(以真实连通性为准)。实测:用这套自动生成的配置去登录一个"隐藏字段 + md5 密码"的假门户,一次通过。

菜单

==================================================
                校园网自动登录
==================================================
  当前账号: 138xxxxxxxx   [已保存 2 个]
  开机自启: 已安装
  WiFi 自动连接: 开   目标: CIT-Chinanet
  当前 WiFi: CIT-Chinanet   可见 9 个网络
  实时网速: ↓ 327 KB/s   ↑ 1 KB/s   峰值 ↓ 2.10 MB/s
  最近状态: 在线  (2026-10-17 15:51:41)
--------------------------------------------------
  1) WiFi 自动连接: 开/关切换(最高优先级)
  2) 修改目标 WiFi 名称
  3) 添加账号 / 更换密码
  4) 切换当前账号
  5) 删除账号
  6) 查看已保存的账号
  7) 立刻登录一次
  8) 校正系统时间
  9) 安装开机自启
  10) 卸载开机自启
  B) 修改窗口背景图
  D) 一键诊断(出报告)
  R) 一键修复(重置网卡 / 刷 DNS / 清 Cookie)
  G) 新手向导(问一句是不是校园网 + 认门户)
  C) 采集诊断包(远程排查用,自动复制到剪贴板)
  L) 查看日志
  0) 退出(可选:完全退出 / 最小化)
==================================================

「可见 N 个网络」和「实时网速」都是常驻的,没有开关 —— 不需要配置,打开就有。

0) 退出 会先弹一个二选一:完全退出程序 / 最小化程序(「取消」留在菜单里)。


功能详解(① ~ ⑭)

① 托盘图标

右下角一个圆形「网」图标,颜色就是状态:

颜色 含义
🟢 绿 在线
🟠 橙 正在登录中
🔴 红 离线(会自动重连)
⚪ 灰 守护未运行 / 状态过期 / 未设置账号

右键菜单:状态 / 账号(只读) · WiFi 自动连接开关 · 立即登录 · 切换到下一个账号 · 校正系统时间 · 连接 WiFi · 查看日志 · 一键诊断 · 打开设置菜单 · 退出托盘(同时停止守护)。

两个顺手的操作:

  • 双击托盘 = 立即登录(不用翻右键菜单)
  • 气泡提示:登录成功 / 掉线 / 恢复时右下角弹气泡,不用去翻日志

托盘同时看管守护进程:发现守护没在跑,它会自动拉起来;你退出托盘时守护一起停。

② 自动校正系统时间

为什么要做这个:门户的登录参数里有个 auth_tag,就是当前毫秒时间戳;服务器一般会校验时间窗口。电脑时间偏得多(比如主板电池没电、虚拟机休眠后),登录就会被拒,而且报错只会说"用户名或密码错误",非常难查。

做法:门户在未认证时也能访问,脚本读它响应头里的 Date 得到服务器时间,再和本机对比。

  • 偏差 ≤ 1 秒:记一条"正常"
  • 偏差大且有管理员权限:直接 Set-Date 校正
  • 偏差大但没有管理员权限:先试 w32tm /resync(校园网常屏蔽 NTP),不行就打一条醒目的警告告诉你去开"自动设置时间"

守护模式启动时会校一次,之后每 30 分钟复核一次;菜单 7 / -Mode synctime 可以随时手动校。

想让任务也能自动改时间:用管理员运行一次 -Mode install -Elevated。否则任务只有普通权限,时间偏了只会提醒不会改。

③ 多账号保存与切换

accounts.json 里可以存多个账号,每个带备注(主号 / 备用…),任何时候有一个"当前账号"。

  • 菜单 1 添加(同名账号 = 更新密码)、2 切换、3 删除、4 列表
  • 托盘右键「切换到下一个账号」:切换后会自动重启守护让它用新账号连
  • 每个密码都是独立 DPAPI 加密的

④ 自动连接指定 WiFi

默认目标是 CIT-Chinanet,程序一启动就以最高优先级先连它,连上之后才做门户登录、校时等其它事。守护每轮发现掉线时也会重新确认 WiFi,不是目标网络就自动 netsh wlan connect 连上去。

「是否自动连接」是一个可保存的开关(存在 settings.json),三个地方都能改:

位置 说明
菜单第 1 项 放在最上面,优先级最高;点一下就切换 开/关
托盘右键第一项 同样一眼可见
命令行 -NoWifi 本次强制不碰 WiFi(不改变设置)

关掉之后,启动时就不会去连 WiFi,但门户登录照旧。

三个前提(缺一个就连不上,脚本会在日志里说清楚):

  1. Windows 里必须先存过这个 SSID 的配置 —— 手动连过一次就行。没有配置时脚本会明确报"请先手动连接一次"。
  2. CIT-Chinanet 是 Open(无密码) 网络,所以不需要密码、也不需要管理员权限,一条 netsh 就够。
  3. 无线服务 WlanSvc 必须在跑(停了脚本会尝试拉起,但拉起需要管理员)。

每次启动都会打一行 WiFi 状态,方便排查:

[INFO] WiFi 当前: CIT-Chinanet ,目标: CIT-Chinanet

换目标网络:菜单第 2 项,或 -WifiSsid "另一个SSID"(会写进设置,之后一律以设置为准)。

⑤ 一键诊断(-Mode doctor)

把"为什么不工作"变成"报告里第几项不正常"。11 项依次检查:无线网卡与 SSID、IP/网关、门户可达、DNS、系统时间偏差、凭据能否解密、认证状态(含劫持判定)、计划任务(还会核对是否指向本目录)、托盘与守护进程、设置、日志里的 ERROR。

===== 校园网自动认证 · 诊断报告 =====
 1. [OK] 无线网卡  已连接 CIT-Chinanet
 2. [OK] IP / 网关  10.8.49.25 / 10.8.48.1
 ...
 7. [OK] 认证状态  已通过认证 — 微软探测通过
11. [OK] 日志  最近 200 行没有 ERROR

汇总: 11 项正常,0 项需注意,0 项异常
报告已保存: D:\campus-net\doctor-report.txt

退出码:全部正常 0,有异常 1。报告会存成 doctor-report.txt,托盘点「一键诊断」还会自动用记事本打开 —— 要问人时直接把这份发出去。

⑥ 劫持检测(能认出"连着 WiFi 但没认证")

校园网最常见的情况不是"没网",而是 HTTP 被重定向到门户 甚至 透明劫持返回 200。以前只能判"不通",现在会看内容和重定向目标:

  • 微软探测要求正文就是 Microsoft Connect Test
  • 备选探测要求 204 或空响应;返回 200 带内容 = 透明劫持
  • 重定向目标命中 ac_portal / 1.1.1.4 → 判定"未认证"

日志会写明原因,而不是笼统的"掉线":

[WARN] 检测到未认证/被劫持(被重定向到门户: http://1.1.1.4/ac_portal/proxy.html?...),开始重连…

⑦ 门户改版自检(全自动,无需操作)

这套脚本最脆弱的地方就是逆向出来的接口 —— 学校一升级门户,登录就会莫名其妙失败。所以自检做成了后台自动任务,不占菜单项、也没有开关,平时你完全不用管。

守护每 24 小时自动跑一次(零副作用,只抓页面和脚本,不发登录请求),结果写进日志和 portal-check.txt:

===== 门户改版自检 =====
 1. [OK] 门户页可访问  HTTP 200,页面 91705 字符,最终地址在门户内
 2. [OK] 前端脚本  已抓取 193938 字符
 3. [OK] 登录接口 login.php  存在
 4. [OK] 密码登录参数 pwdLogin  存在
 5. [OK] RC4 加密 do_encrypt_rc4  存在
 6. [OK] 时间戳参数 auth_tag  存在

结论: 指纹全部匹配,门户未改版
  • 通过时:日志一行 门户自检通过: 登录接口 / 参数 / RC4 / auth_tag 四处指纹都在
  • 发现问题时:日志 [WARN] 门户自检: 检测到 N 处变化,门户可能改版,报告里写明"需要重新逆向"
  • 手动触发(仅命令行,调试用):-Mode check;想连接口一起验:-Mode check -Deep(会发一次假账号请求)

反向测试过:故意把模板 ID 改成不存在的值,它准确报 HTTP 404,页面打不开 并判定"检测到 1 处变化"。

⑧ 修改窗口背景图(Windows Terminal)

菜单 B 可以直接给菜单窗口换背景图。注意:这个功能依赖 Windows Terminal —— 老式控制台(conhost)本身不支持图片背景,脚本会检测并告诉你。

操作:选 B → 把图片直接拖进窗口(路径会自动带引号,脚本会去掉)→ 回车。想恢复就输入 clear。

细节:

  • 改的是 Windows Terminal 默认 profile(双击 connect.bat 打开的就是它)的 backgroundImage,附带 backgroundImageOpacity(默认 0.35)和 backgroundImageStretchMode=uniformToFill
  • 改之前自动备份成 settings.json.bak-<时间戳>,写回前还会校验新内容是不是合法 JSON
  • 写文件用的是无 BOM 的 UTF-8 —— 带 BOM 会让 Windows Terminal 读不懂配置
  • 支持 png / jpg / bmp / gif
  • 改完要新开一个标签页或窗口才生效(已开着的窗口不会变)

命令行等价写法:

.\Connect-CampusNet.ps1 -Mode background -BackgroundImage "D:\图片\bg.jpg"
.\Connect-CampusNet.ps1 -Mode background -BackgroundImage "D:\图片\bg.jpg" -BackgroundOpacity 0.2
.\Connect-CampusNet.ps1 -Mode background -ClearBackground

⑨ 网速监控(常驻,没有开关)

托盘右键菜单、悬停提示、菜单顶部都能看到实时下行 / 上行速度,外加峰值和本次累计。

网速: ↓ 327 KB/s   ↑ 1 KB/s          ← 托盘右键菜单
峰值 ↓ 2.10 MB/s  ↑ 340 KB/s   累计 ↓1.2 GB  ↑3 MB
校园网:在线  ↓327K ↑1K               ← 鼠标悬停提示(只在线时带速度)
  • 读数来源:直接读 .NET 的网卡字节计数(NetworkInterface.GetIPv4Statistics()),不起进程、不查 WMI,2 秒一次,长期挂着也不费资源
  • 第一次只打基线(显示 —),第二次开始才有速度值 —— 故意的,不拿"开机以来的平均值"糊弄人
  • 网卡重连导致计数归零时,负增量按 0 处理,不会算出天文数字
  • 离线时不显示速度(免得看起来像在跑流量)

⑩ WiFi 列表自动刷新(常驻,没有开关)

Windows 的 WiFi 列表是缓存的:刚开机、刚唤醒、刚从别的网络切回来时,列表经常还是空的 / 过期的 —— 结果就是"明明有信号,却报没有配置 / 连不上"。所以每次连接前都会自动刷新一遍,不需要你操作,也没有开关。

具体会自动做这几件事:

  1. 连接前强制刷新:先跑 netsh wlan show networks(让无线服务重新扫描),再读 profiles / interfaces,三份数据一起判断
  2. 列表变化写日志:目标 SSID 消失 / 重新可见时记一行,事后好排错
  3. 超时自动重试一轮:第一次连接超时后再刷新一次列表,如果这时能看到目标(刚开机扫描慢的典型情况)就再试一次,看不到就不白等
  4. 开放网络缺配置自动补:目标 SSID 可见、是开放网络、但 Windows 里没有它的配置时,用 netsh wlan add profile 自动补一份再连(仅开放网络;带密码的网络不猜)
  5. 连不上时告诉你搜到了什么:日志里列出当前可见的 SSID,不用再开别的工具看

菜单顶部显示可见网络数量;诊断报告第 12 项会报目标 SSID 是否可见、信号多少、Windows 里有没有配置。

⑪ 通知中心(替代会消失的气泡)

以前用的是托盘气泡(ShowBalloonTip)—— Win10/11 上它经常被系统吞掉,而且留不在通知中心里,错过就没了。现在改成 WinRT 的 Toast:

  • 进通知中心:断了/恢复了,按 Win+N 还能翻回来看
  • 点了能干活:通知自带按钮「打开菜单」「立即登录」「查看日志」,点一下直接执行(走 campusnet: 协议)
  • 设置里能单独关:设置 > 通知 里会出现一条「校园网自动登录」,不想看就关掉它,不影响登录
  • 不刷屏:同类通知有去重(比如掉线 20 秒内只发一条);守护连续 3 次登录失败才会提醒一次"可能改密码了"

自检:-Mode notify 会发一条测试通知,并打印通知身份、快捷方式路径、通知中心里的历史条数。托盘右键也有「发送测试通知」。

第一次运行会自动建一个开始菜单快捷方式「校园网自动登录」,这是让系统认识本应用的必要条件(AppUserModelID)。删掉它通知就会退回气泡。

⑫ 休眠 / 唤醒自动重认证

合盖睡一晚再打开,以前要等守护下一轮(最多 30 秒)才会重连。现在两条路一起走:

  1. 托盘挂 PowerModeChanged:一唤醒立刻起一个隐藏进程补一次认证(抢在守护前面)
  2. 守护看"睡过头":每轮记录睡觉时长,远超检测间隔就说明刚从休眠回来,马上重新认证

重认证不是无脑重发密码:先测连通性 → 通了就什么都不做 → 不通才连 WiFi、再登录。刚唤醒网卡可能还没起来,所以最多试 3 轮、每轮隔 3 秒。成功了发通知「唤醒后已自动重新认证」,失败发「唤醒后连不上,已开始自动修复」。

⑬ 自动修复(DNS / Cookie / 网卡)

诊断发现常见毛病时不再只告诉你"哪里不对",而是先动手试一遍。修的顺序是从轻到重:

步骤 做什么 什么时候做
1 ipconfig /flushdns 清 DNS 缓存 总是
2 删掉 cookies.txt(门户 Cookie 残留会导致登录被判重放) 总是
3 重新刷新 WiFi 列表并按配置重连 自动连 WiFi 开着时
4 与门户对时(Set-Date,偏差大才动手) 总是
5 重置网卡(Restart-NetAdapter,断网十几秒) 只有"连续失败"或手动修复时

每步做完就测一次连通性,通了立刻停手——不会把能用的网络再折腾断。

触发的三个地方:

  • 诊断:发现「无线网卡 / 门户可达 / DNS 解析 / 认证状态」异常时自动跑 1~4,报告里多一行「14. 自动修复 → 已尝试… → 现在已在线」。想只看不动手,加 -NoRepair
  • 守护:连续失败 2 次做轻量修复,4 次才把网卡也重置(重置网卡 30 分钟内只做一次)
  • 手动:菜单 R) 或 -Mode repair,直接做全套

第 5 步要管理员权限。守护任务默认是普通权限,所以安装时会额外注册一个提权助手任务 CampusNet-Repair(平时不跑,只有需要重置网卡时才被唤起,不弹 UAC)。安装时不是管理员的话这个助手任务不会注册,自动修复就跳过重置网卡、只做前 4 步。

⑭ 内存清理(精简版 Mem Reduct)

托盘右键 →「内存」子菜单,不装任何第三方软件:

项 说明
轻清(免管理员) 把自家托盘/守护进程的工作集清一遍(EmptyWorkingSet),瞬间完成;实测工作集 100 → 16 MB
系统清理 清 standby list(NtSetSystemInformation MemoryPurgeStandbyList)+ 文件缓存(SystemFileCacheInformation);实测一次可用内存 +363 MB
全部清理 上面两样一起
内存紧张时自动清理 可用内存低于阈值才触发,触发后冷却时间内不重复;阈值/冷却就在同一菜单里 ± 调
自动清理时也清系统缓存 默认关;开了每次自动清理都顺带清 standby(要提权,没注册任务时自动跳过)
  • 状态行直接显示 可用 xxxx MB / xxxx MB (xx%),清完立刻刷新
  • 自动清理触发时发通知,带清理前后的可用内存
  • 默认阈值 12%、冷却 10 分钟;菜单里可调(升/降/重置)
  • 免 UAC 提权任务:-Mode install 会注册计划任务 CampusNet-MemClean(最高权限);托盘点「系统清理」时如果当前权限被拒,自动改由它执行,不弹 UAC
  • 命令行也能用:Connect-CampusNet.ps1 -Mode memclean -Scope light|system|all

通用版:换所学校也能用

原来的认证逻辑是写死 Dr.COM 的(1.1.1.4 + /ac_portal/login.php + RC4)。现在把这部分抽成了配置驱动的认证引擎,门户差异都放进 portal.json:

{
  "id": "drcom",
  "name": "中国电信 Dr.COM(RC4 + auth_tag)",
  "host": "1.1.1.4",
  "page": "/ac_portal/20250303113805/pc.html?...",
  "loginUrl": "http://{host}/ac_portal/login.php",
  "method": "POST",
  "contentType": "application/x-www-form-urlencoded",
  "encrypt": "rc4_ms",
  "template": "opr=pwdLogin&userName={user}&pwd={pwd}&auth_tag={tag}&rememberPwd=0",
  "successMatch": "\"success\"\\s*:\\s*true",
  "msgMatch": "\"msg\"\\s*:\\s*\"([^\"]*)\""
}

模板占位符:{user} 账号、{pwd} 加密后的密码、{plain} 明文密码、{tag} 毫秒时间戳、{host} 主机。

加密方式 encrypt:

值 算法 典型场景
none 明文 自建门户、很多开源认证页
rc4_ms RC4,密钥 = 毫秒时间戳 中国电信 Dr.COM(本机现用)
md5 MD5 小写 hex 深澜/锐捷的常见变体
sha1 SHA1 小写 hex 少数自建门户
base64 Base64 个别老门户

成功判定:successMatch 是正则,命中算成功;留空则以真实连通性为准(Test-Online),适合返回体不标准的门户。msgMatch 用来取错误信息。

怎么用

.\Connect-CampusNet.ps1 -Mode portal                  # 看当前配置 + 内置预设
.\Connect-CampusNet.ps1 -Mode portal -DetectPortal    # 抓门户页猜是哪家
.\Connect-CampusNet.ps1 -Mode portal -PortalId form   # 切到"通用表单"预设

菜单里也有 O) 门户类型 / 通用认证配置。切换后直接 -Mode login 就能用新配置。

内置预设

id 门户 状态
drcom 中国电信 Dr.COM(RC4 + auth_tag) ✅ 真实门户实测
esurfing 广东电信 天翼校园网(enet.10000.gd.cn 客户端协议) ✅ 假服务器验证
form 通用表单(明文 / md5 / sha1 / base64) ✅ 假服务器验证
jsonform 通用 JSON 表单(可带 token 两步) ✅ 假服务器验证
srun2 深澜 Srun v2(token 两步 + hmd5) 🔧 骨架(token 那步已验证)
srun 深澜 Srun(老式单次表单) 🔧 骨架
ruijie 锐捷 ePortal 🔧 骨架

✅ = 三条链路真的跑通过;🔧 = 请求形状对、字段留好,但密码算法/参数名各校不同,得按抓包改两三个字段。

引擎能力(换学校基本就这四件事)

能力 怎么配
一次表单 POST / GET loginUrl + method + template + encrypt
先取 token 再登录 tokenUrl + tokenMethod + tokenRegex,登录模板里用 {token}
JSON 体 contentType 里带 json 即可,模板直接写 {"username":"{user}"},值自动做 JSON 转义
自定义头 / Referer headers(多条用 ;; 隔开)、referer

占位符:{user} {pwd}(加密后){plain} {tag}(毫秒时间戳){host} {token} {clientip}。

自动识别门户(就靠"连上就弹认证页"那一下)

连上校园网后浏览器会自动弹认证页,本质是你的外网请求被 302 到了门户。脚本直接复刻这个动作:

GET http://www.msftconnecttest.com/connecttest.txt   → 302  Location: <门户地址>

拿到 Location 之后看地址就能认出是哪家:

门户地址里出现 判定 处理
ac_portal / 1.1.1.4 / drcom 中国电信 Dr.COM 切 drcom,顺便把新的 page(模板 ID)写进配置
enet.10000.gd.cn / :10001 广东电信 天翼校园网 切 esurfing
srun / get_challenge 深澜 Srun 只提示(骨架),要手工适配
eportal / 锐捷 / wlan_user_ip 锐捷 ePortal 只提示(骨架)
sangfor / h3c / huawei 深信服 / H3C / 华为 只报厂商

自动切换只对实测过的 drcom / esurfing / form 生效;骨架预设不替你瞎改,只提示。

三个触发点:

.\Connect-CampusNet.ps1 -Mode portal -AutoPortal      # 手动识别一次并写回 portal.json
.\Connect-CampusNet.ps1 -Mode portal -DetectPortal    # 只看不改(顺带打印现场参数)
# 菜单 O) 里输入 auto

另外登录失败会自动试一次:密码没错却登不上,脚本会去抓门户地址,发现门户变了(换校区、门户改版、模板 ID 变了)就自动换配置再重试一次,并把改动写进日志。

说明:这套自动识别解决的是"门户地址 / 厂商 / 页面路径"。真正发登录请求还得知道对方的参数格式和密码算法 —— 已知的那几家(Dr.COM、天翼、通用表单)内置好了;遇到没见过的厂商,-DetectPortal 会把地址和现场参数打出来,照着填 portal.json 即可。

WiFi 名字不影响识别。 脚本不靠 SSID 判断厂商 —— 同一所学校换名字(young、wo、CIT-Chinanet、GDGM-S……)、或者一个宿舍区两个 SSID 都很常见。SSID 只是一串要连的名字,填在菜单 2) 设置目标 WiFi 里(或 -WifiSsid 'wo');真正的判断依据永远是连上之后被 302 到哪个门户。

注意区分:名字像"沃/wo"的 SSID 有两种可能 —— 只是借了个名字的天翼网络(门户还是 enet.10000.gd.cn),或者真是联通自己的认证平台。跑一次 -DetectPortal 看跳转地址就知道了,后者目前没有现成预设,把地址发出来就能照着加一套。

移动 / 联通 / 电信:运营商不是认证系统

这一点最容易误会,先说清楚:

电信、移动、联通只负责出口线路;宿舍楼里那套"连上就弹认证页"的系统,是学校另外采购的。

所以不存在"移动版认证""联通版认证"——同一所学校,学生接电信还是移动宽带,弹出来的很可能是同一个门户;反过来,两所都用电信的学校,门户可能一个是 Dr.COM、一个是深澜。

现实中常见的组合:

学校买的认证系统 门户特征 本脚本
Dr.COM(城市热点) 1.1.1.4、ac_portal/login.php、RC4 ✅ 实测
广东电信 天翼校园网 enet.10000.gd.cn:10001、wlanuserip= ✅ 假服务器验证
深澜 Srun srun_portal、get_challenge、/cgi-bin/srun_portal 🔧 骨架
锐捷 ePortal(RG) eportal/portal/login、wlan_user_ip 🔧 骨架
深信服 Sangfor sangfor、ac_logout ❌ 只认得出
H3C / 华为 portal.cgi、hwportal ❌ 只认得出
移动 / 联通自有平台 CMCC-EDU、wo、10086/10010 域名 ❌ 只认得出

至于运营商线索(-DetectPortal 会打出来):CMCC / 10086 / 和校园 → 移动;unicom / 10010 / wo → 联通;esurfing / 189.cn / ChinaNet → 电信。它只说明"这条线路是谁的",不决定用哪个预设。

账号形态也跟着学校走:用 Dr.COM/深澜的学校常常直接填手机号 + 服务密码;天翼那套填学号/手机号 + 校园网密码。填错了报的是"密码错误",别误判成协议不对。

天翼校园网(广东电信)

esurfing 预设走的是天翼客户端协议,不是网页表单。四个请求,全部 JSON,每个都带 timestamp 和大写 MD5 签名(密钥固定串 Eshore!@#):

步骤 请求 签名用的串
1 学校 ID POST /client/queryschool clientip+nasip+mac+timestamp+secret
2 会话 Cookie GET /advertisement.do?<schoolid> —
3 取 challenge POST /client/vchallenge version+clientip+nasip+mac+timestamp+secret
4 登录 POST /client/login clientip+nasip+mac+timestamp+challenge+secret

两个关键点:

  • 不需要识别验证码。网页版(qs/index_gz.jsp + image_code.jsp)那套是给人敲的 4 位图形码;客户端协议的 challenge 是服务端下发的,原样回填进签名和请求体就行 —— 这也是它能全自动的原因。
  • clientip / nasip 不用手填。未认证时跳转地址形如 http://enet.10000.gd.cn:10001/?wlanuserip=100.2.49.240&wlanacip=119.146.175.80,脚本从里面抠。MAC 按 clientip 反查网卡;如果这个 IP 不是本机的(前面还有路由器 / 经过 NAT),退回用默认路由出口网卡的 MAC。

先用这个看现场(输出里不含密码):

.\Connect-CampusNet.ps1 -Mode portal -PortalId esurfing
.\Connect-CampusNet.ps1 -Mode portal -DetectPortal

正常会看到 clientip / nasip / mac / queryschool / vchallenge 五行,rescode 是 0 就说明协议对上了,接着 -Mode login 即可。返回码对照:

rescode 含义
0 成功
13002000 已经在线(重复登录)
13012000 / 13004000 密码错 / 账号认证失败
11064000 登录太频繁,等几分钟
13018000 服务器禁止第三方认证(只能用官方客户端)
13016000 账号没订购校园网产品
11063000 / 13005000 challenge 对不上 / 超时 —— 脚本会自动重拿 challenge 重试
13000000 签名或参数被拒(多半是 MAC / clientip / nasip 对不上)

参数都在 portal.json 里,可改: version(客户端版本号,默认 214)、iswifi(默认 4060)、macFormat(colon-lower / colon-upper / plain-lower / plain-upper)、schoolid(查到后填上可省一步)。

验证方式:除了本机真实门户(Dr.COM 全流程登录成功),还起了一个本地假门户(监听 127.0.0.1,返回 JSON),分别用 none / md5 / base64 三种加密跑通;rc4_ms 发给假门户时按预期被拒(它不认识 RC4),说明加密分支和失败判定都对。

天翼这条链路用假服务器验证过:mock 服务端独立按协议重算 MD5 签名,四步全部 sign=True,client/login 回 rescode 0,脚本判定登录成功;自动识别也测了(把探测地址指向一个返回假 302 的本地服务,脚本正确把配置从 drcom 切成 esurfing)。还没在真实的工贸/天翼网络里跑过 —— 需要在那个网络里跑一次 -DetectPortal 才能确认 version / iswifi / MAC 格式这几个参数对不对。

新引擎的两条路径也都用假门户验过:

用例 服务端怎么验的 结果
token 两步 + md5 表单 先 GET /tokenpage 拿 token,登录必须带 token=ABC123 且 password 等于 md5(test123) ✅ 三处全对,判定成功
JSON 体 Content-Type: application/json,body 必须是合法 JSON 且 password 为 32 位 md5 ✅ 解析通过,判定成功

srun2 / ruijie 是骨架,不是"能用":token 那一步的形状(先 GET 拿 token、再拼进登录参数)是照真实门户的结构搭的,但各校的密码算法(hmd5(md5(pwd)+token)、chksum 拼法)和参数名不一样,必须按你学校的抓包改两三个字段。谁把这两家真跑通了,欢迎直接提 PR 或把抓包发出来。

做不到的部分(先说清楚)

  • 带图形验证码 / 短信验证码 / 滑块的门户:需要识别验证码,不在本脚本能力范围(天翼走的是客户端协议,没有图形码;但如果你们学校只开了网页认证入口,那套 4 位图形码脚本不处理)
  • Portal 协议加密(如锐捷的 wlan_user_ip + JS 混淆、深澜的 hmd5 带 token):encrypt 只能覆盖常见几种,复杂的还得按你学校改模板或加算法分支
  • 802.1X / 客户端认证(锐捷、华为的 supplicant,以及很多学校教学区用的 PEAP 企业级 WiFi):那是完全不同的协议,不是 HTTP 表单。像广东工贸教学区的 GDGM-T / GDGM-S 就是 802.1X,Windows 自己就能连(输工号/学号 + 密码),脚本不掺和;脚本负责的是宿舍区那种连上要弹认证页的(young、360 之类)
  • 服务器明令禁止第三方认证(天翼 rescode 13018000):协议对也没用,只能改用官方客户端

命令行用法

.\Connect-CampusNet.ps1                      # 菜单
.\Connect-CampusNet.ps1 -Mode setup          # 添加账号 / 改密码
.\Connect-CampusNet.ps1 -Mode list           # 列出已保存账号
.\Connect-CampusNet.ps1 -Mode switch         # 交互式切换账号
.\Connect-CampusNet.ps1 -Mode delete         # 删除账号
.\Connect-CampusNet.ps1 -Mode status         # 在线状态(退出码 0=在线 1=离线)
.\Connect-CampusNet.ps1 -Mode login          # 立刻登录一次
.\Connect-CampusNet.ps1 -Mode synctime       # 校正系统时间
.\Connect-CampusNet.ps1 -Mode wifi           # 连接指定 WiFi(默认 CIT-Chinanet)
.\Connect-CampusNet.ps1 -Mode doctor         # 一键诊断(出报告,退出码 0=全正常)
.\Connect-CampusNet.ps1 -Mode doctor -NoRepair  # 只诊断,不自动修
.\Connect-CampusNet.ps1 -Mode repair         # 一键修复(刷 DNS + 清 Cookie + 重连 WiFi + 对时)
.\Connect-CampusNet.ps1 -Mode repair -RepairLevel full   # 连网卡一起重置(要管理员)
.\Connect-CampusNet.ps1 -Mode notify         # 发一条测试通知(排查"没弹通知")
.\Connect-CampusNet.ps1 -Mode portal         # 看/切换门户配置(通用认证)
.\Connect-CampusNet.ps1 -Mode portal -DetectPortal   # 抓门户页猜是哪家
.\Connect-CampusNet.ps1 -Mode check          # 门户改版自检(只抓指纹,不发登录)
.\Connect-CampusNet.ps1 -Mode check -Deep    # 自检 + 发一次假账号请求验证接口
.\Connect-CampusNet.ps1 -Mode background -BackgroundImage "D:\bg.png"   # 换菜单窗口背景图
.\Connect-CampusNet.ps1 -Mode background -ClearBackground               # 恢复默认背景
.\Connect-CampusNet.ps1 -Mode wifi -WifiSsid "另一个SSID"
.\Connect-CampusNet.ps1 -Mode watch          # 前台守护(能看滚动日志)
.\Connect-CampusNet.ps1 -Mode tray           # 托盘
.\Connect-CampusNet.ps1 -Mode install        # 安装开机自启(带托盘)
.\Connect-CampusNet.ps1 -Mode install -NoTray  # 安装成纯后台(无图标)
.\Connect-CampusNet.ps1 -Mode install -Elevated # 以管理员身份运行任务(能自动改时间)
.\Connect-CampusNet.ps1 -Mode uninstall      # 卸载
.\Connect-CampusNet.ps1 -Mode collect        # 采集诊断包(远程排查)
.\Connect-CampusNet.ps1 -Mode wizard         # 新手向导

其他参数:-Background(绝不弹交互,任务用)、-NoVbs(不用 VBS,可能有极短黑框但任务托管更规范)、-MachineScope(机器级加密)、-IntervalSec 60、-Force、-RepairLevel safe|full、-NoRepair、-Resume(唤醒后补认证用)。


已验证 / 未验证

实测通过的:

项 证据
登录接口 / 参数 / 响应 假账号请求后服务器正常受理,回 用户名或密码错误
RC4 加密 与门户原始 do_encrypt_rc4 做 4 组交叉对比,输出逐字节一致
多账号读写 2 个账号存取、列表、当前账号标记、status 正确带出账号
托盘 启动后托盘进程 + 守护进程都在;state.json 写入 online:true 与账号;日志正常
自动校时 与门户 Date 头对比 0.3~0.7 秒,判定"正常";偏差大时能 Set-Date(管理员下已实测调用成功)
安装 / 启动 / 卸载 任务 Running;卸载后托盘和守护进程都被收干净(残留 0)
无窗口 经 wscript 隐藏拉起,无任何窗口
单实例 命名互斥体,托盘与守护都不会重复起
自动连 WiFi ✅ 启动即以最高优先级连接(日志先出现 WiFi 已连接);开关实测:关掉后启动不再连、打开后恢复;-Mode wifi 已连接时正确短路;未保存且不可见的 SSID 会明确提示并列出附近都能搜到啥
一键诊断 ✅ 13 项全跑通,满状态时 13/13 正常、退出码 0,报告落盘;发现常见毛病会多出一行「14. 自动修复」
劫持检测 ✅ 实测:调门户 opr=logout 注销后,诊断准确判为「未认证(被劫持: 被重定向到门户…)」,而不是笼统的"不通";随后登录恢复正常
托盘气泡 / 双击登录 ✅ 已换成通知中心 Toast;双击托盘仍=立即登录
门户改版自检 ✅ 指纹 7/7 通过、退出码 0;-Deep 假账号被正确拒绝;反向测试用坏模板 ID 时准确报 404 并判"检测到变化";守护每 24h 自动跑一次并写日志
天翼协议(esurfing) ✅ 假服务器实测:mock 端独立重算 MD5,queryschool / vchallenge / client/login 三步 sign=True,rescode 0 判定登录成功;未在真实天翼网络实测
自动识别门户 ✅ 假 302 实测:探测地址返回天翼式跳转 → 正确识别并自动把 portal.json 从 drcom 切成 esurfing(写回文件、日志留痕)
窗口背景图 ✅ 实测:写入默认 profile 的 3 个键、文件无 BOM、JSON 仍合法;-ClearBackground 能干净移除;测试完已把你的配置逐字节还原(哈希一致)
真实账号登录 ✅ 已实测:登录成功: logon success + 连通性复检通过(2026-10-17 15:54)
网速监控 ✅ 自测:先基线(—)→ 实时读数(622 B/s → 拉一次网页后 689 KB/s),峰值 / 累计同步更新;托盘提示 + 菜单两项三处都正常刷新
WiFi 列表自动刷新 ✅ 自测:解析出 可见 9 个 / 已保存 20 条配置(含中文 SSID),目标可见、信号 89%、有配置;40 秒内复用缓存;开放网络自动补配置已实测(建 ZZTEST-OPEN-9F → 成功入列 → 随即删除干净)
通知中心 ✅ 实测:托盘发现掉线 → 通知[通知中心]: 校园网已断开;恢复后 → 校园网已连接(都是通知中心通道,不是气泡);通知中心历史里能查回 4 条;系统已为本应用建立独立通知设置项 CampusNet.AutoLogin;campusnet: 协议实测可用(campusnet:login / campusnet:status 都真的执行了)
唤醒重认证 ✅ 托盘启动日志「已挂上休眠/唤醒监听」;Invoke-ResumeReauth 实测:在线时判定"网络正常"不重复登录,离线时按 3 轮 × 3 秒重试;settings.json 记下 lastResume
自动修复 ✅ -Mode repair 实测:刷 DNS → 复查已在线 → 停手,退出码 0 并发通知;Restart-NetAdapter 在空载网卡上实测可执行(拔线的网卡会正确报"还是 Disconnected");提权助手任务 CampusNet-Repair 已注册为 Highest 并由定时任务实测唤起成功

到这里,整条链路全部验证完毕:从账号密码加密保存 → RC4 加密上报 → 服务器放行 → 联网 → 托盘与守护常驻。


已知限制(重要)

Stop-ScheduledTask 不会连带杀掉子进程。 因为任务动作是 wscript → 它再隐藏启动 PowerShell,结束任务时 wscript 被杀了,但它拉起的托盘和守护会留下来。

→ 要停就请用菜单 9 / -Mode uninstall,它会先收托盘、再收守护(顺序很关键,先收托盘否则它的定时器会把守护又拉起来)。

网速与 WiFi 列表这两个新功能的取舍:

  • 网速只统计 IPv4。IPv6 流量不计入(校园网主要走 IPv4,影响很小);另外是把所有"已启用且非回环/非隧道"的网卡加在一起算,虚拟网卡空转不产生流量,所以不影响读数
  • 网速是"此刻速度",不是历史统计。想在掉线时看当时的网速,只能翻托盘(峰值和累计只在托盘进程存活期间累计,重启托盘会归零)
  • WiFi 刷新要花时间:每次强制刷新会跑 2 条 netsh(约 0.2~0.5 秒)。所以只在"该连的时候"才强制刷新,平时看菜单用的是 40 秒缓存 —— 不会一直刷
  • 自动补配置只对开放网络生效。带密码的网络脚本不去猜密码,配置丢了还是得手动连一次

通知 / 唤醒 / 自动修复这三个的取舍:

  • 通知能不能"弹横幅"由 Windows 说了算。应用只负责把 Toast 交给通知中心(实测已被收下),横幅是否弹出取决于 设置 > 通知 的总开关、本应用的开关、以及"勿扰/专注助手"。被拦了也仍能在 Win+N 里看到。想确认就直接 -Mode notify
  • 会多一个开始菜单快捷方式「校园网自动登录」。这是通知身份(AppUserModelID)的载体,删了通知就退回气泡模式(功能不受影响)
  • 唤醒检测有一点点延迟。托盘在的话是秒级;托盘没跑时靠守护的"睡过头"判断,最多等一个检测间隔(30 秒)
  • 自动修复不动需要重启的动作。不做 netsh winsock reset / netsh int ip reset(那俩必须重启才生效),也不改注册表网络栈
  • 重置网卡会断十几秒。所以自动模式下它是最后一招,且 30 分钟内只做一次;不想要这一招就用 -NoRepair,或让助手任务不存在(不用管理员安装)
  • 修复有节流:自动修复 5 分钟内只跑一次;手动 -Mode repair 不受限制

工作原理(门户改版后照这个维护)

POST http://1.1.1.4/ac_portal/login.php
Content-Type: application/x-www-form-urlencoded

opr=pwdLogin
userName=<账号>
pwd=<RC4 hex>
auth_tag=<当前毫秒时间戳>
rememberPwd=0
  • RC4 密钥就是 auth_tag 的十进制字符串,输出小写 hex(每字节两位,不足补 0)
  • 门户还有 3 秒心跳和 /out.htm 注销;脚本登录完就撒手,不需要心跳
  • 页面里的 tripledes.js 当前没被用到(密码登录走 RC4)

文件说明

文件 作用
Connect-CampusNet.ps1 主脚本
connect.bat 双击入口。优先用 wt.exe 显式启动 Windows Terminal(见下方"窗口还是老式的?"),没装 WT 才退回普通控制台
accounts.json 多账号,密码 DPAPI 加密
portal.json 门户配置(主机、登录接口、参数模板、加密方式、成功判定)。首次运行自动生成,删掉会恢复 Dr.COM 默认
settings.json 设置:autoWifi(是否自动连 WiFi)、wifiSsid(目标网络)、lastPortalCheck(上次自检)、lastRepair / lastNicReset / lastResume(修复节流与唤醒记录,自动维护,不用手改)
doctor-report.txt 一键诊断生成的报告(也是"问人时该贴什么"的答案)
portal-check.txt 门户改版自检生成的报告,守护每 24 小时自动刷新一次
state.json 守护写给托盘看的状态(在线/账号/时间/pid)
run-hidden.vbs 安装自启时生成的隐藏启动器
campusnet-uri.vbs campusnet: 协议的处理程序(通知上的按钮点下去由它转发)
campusnet.ico 通知 / 开始菜单快捷方式用的图标(首次运行自动生成)
campus-net.log 日志,512KB 滚动
reference/ 从门户抓下来的原始页面与 JS(第三方代码,只留在本地,未随仓库分发)

排错

现象 处理
用户名或密码错误 账号密码不对。学校提示:账号是新办的电信手机号,初始密码可能是 111111
时间偏差警告 用管理员运行 -Mode synctime,或打开 设置 > 时间和语言 > 自动设置时间
日志说"没有保存 xxx 的配置" 目标网络是带密码的且 Windows 里没有配置。先手动连一次让它记住,之后就能自动连(开放网络脚本会自己补配置)
日志说"连接 WiFi 超时" 信号太弱或不在范围内。netsh wlan show networks 看看能扫到哪些
托盘图标是灰的 守护没跑或没设账号。右键「打开设置菜单」检查;或看一眼日志
图标红色但网络其实通 连通性探测被校园网拦了。可以改脚本里 Test-Online 的探测地址
通知不弹 / 只在通知中心里 先 -Mode notify 看是否"已提交给通知中心"。能看到历史但没横幅 → 设置 > 通知 里打开「校园网自动登录」的横幅,或关掉勿扰
通知身份没注册上 看一眼有没有 %APPDATA%\Microsoft\Windows\Start Menu\Programs\校园网自动登录.lnk;没有就 -Mode notify 重建,仍不行就重装一次
自动修复里"重置网卡"总跳过 守护是普通权限,需要提权助手任务 CampusNet-Repair。用管理员运行一次 -Mode install -Elevated 就会注册
装了自启没反应 -Mode log 看日志;若是"没有可用的账号密码",说明凭据没保存成功
门户改版全挂 看 reference/ 里的原始 JS,重新核对 g_url 与 onPwdLogin 参数;若换成 3DES 需重写加密部分
想彻底删干净 -Mode uninstall → 再删 accounts.json、campus-net.log、state.json
窗口看起来是"老式的" 先看有没有标签页:有标签页就是 Windows Terminal(它托管控台时也会显示为自己的标签页)。本机实测委托是正常的 —— 用资源管理器启动 bat 后会新出现 OpenConsole.exe + WindowsTerminal.exe,conhost 数量不变。另外 connect.bat 还会显式调用 wt.exe,双重保证。若确实没有标签页,截个窗口图发我

关于"还没登录 Windows 就联网"

现在任务用"当前用户登录时"触发 + 普通权限。原因:凭据是当前用户级 DPAPI,系统账户解不开。 真要在登录前联网,需要改成 SYSTEM 运行 + -MachineScope 机器级加密 —— 需要就说一声。

更新日志

v1.2.4-lite(2026-10-20)· 精简版(无桌宠)

版本号还是 1.2.4,但内容与 v1.2.4 完整版 不同:从这一版起桌面宠物整体移除,只保留「校园网 + 内存清理」。

  • 移除桌面宠物:宠物窗口 / 宠物右键菜单 / 模型配色 / 帧率 / 大小 / 悬停天气面板 / 碎碎念 / 物理拖拽 全部删除
  • 移除桌面图标互动(吃掉 / 搬运 / 还回 / 恢复布局),连同 icon-layout.json、icon-state.json
  • 移除天气面板与穿衣提醒(彩云 token / Open-Meteo)以及 -Mode weather
  • 移除 pet/ 素材(3164 个文件,约 157 MB)和 tools/build-pet.py —— 仓库文件数 3174 → 7,zip 从 158 MB 降到几十 KB,克隆秒下
  • 退出窗口的「只保留桌宠」选项一并删除,现在是完全退出 / 最小化二选一
  • 删除 -Mode pet / -PetOff / -CaiyunToken 参数;-Mode 列表同步精简
  • 脚本本体 8355 → 4930 行,托盘 / 守护 / 多账号 / WiFi 自动连接 / 校时 / 网速 / 诊断 / 门户自检 / 通知中心 / 唤醒重认证 / 自动修复 / 内存清理 / 通用门户 / 采集 / 向导 全部保留

历史版本(v1.0.0 ~ v1.2.4)

点开看(含本版已移除的桌宠 / 图标互动 / 天气相关变更)

v1.2.4(2026-10-18)

  • 去掉「整理图标」:溜达/拖动触发的随机事件不再重排整个桌面,只保留吃掉和搬运,不动的图标一个都不碰
    • 菜单里的「整理图标」也删了;「桌面图标互动」现在是 吃掉 / 搬运 / 还回被吃掉的 / 恢复布局

v1.2.3(2026-10-18)

  • 内存清理(精简版 Mem Reduct):托盘右键新增「内存」子菜单
    • 轻清:清自家进程工作集,免管理员,实测 100 → 16 MB
    • 系统清理:清 standby list + 文件缓存,实测可用内存 +363 MB
    • 全部清理
    • 内存紧张时自动清理:可用 < 阈值(默认 12%)才触发,冷却 10 分钟内不重复;阈值/冷却菜单里可调
    • 自动清理可选顺带清系统缓存
    • 免 UAC 提权任务 CampusNet-MemClean:托盘权限不够时自动改用,不弹 UAC
    • 顺带加命令行入口 -Mode memclean -Scope light|system|all
  • 新增开关「启动时自动拉起桌宠」:托盘右键 →「启动时自动拉起桌宠」勾选;关掉后开机/托盘重启不会再自动弹出桌宠,需要时在「桌面宠物」里手动打开

v1.2.2(2026-10-18)

  • 桌宠 24fps 全帧率:13 个动作 × 241 帧 / 10.04 秒,按素材原生 24fps 播放,不再插帧

  • 桌面图标互动(右键宠物 →「桌面图标互动」,把宠物拖到图标上也会触发):

    • 吃掉:图标挪到屏幕外,180 秒后自动回原位;同一时间只吃一个
    • 搬运:自动关掉「自动排列图标」,把图标丢到随机网格位置
    • 触发是概率的:拖上去 45%、溜达上去 25%,外加 45 秒冷却;每次动手前记布局,可一键恢复
  • 动作切换不再生硬也不再「缩一下」:直接换帧(去掉了交叉淡入),动作和待机都是同一块画布,不缩放

  • 帧按需解码:点动作立即开始(不再先卡 1 秒解 241 帧),托盘内存 330 MB → 123 MB

  • 拖动/弹跳不再跳帧:高速移动时每帧都重画,移动中收起跟随的信息面板

  • 桌宠支持模型 / 配色切换(右键菜单最上面新增「模型」,托盘里也有「桌宠模型」):自带的这套素材有 4 套配色 —— 原色 / 夜色(压暗降饱和)/ 浓彩(加饱和)/ 墨白(灰阶),点一下当场换,位置、大小、设置都保留

    • 一个模型包 = pet/ 本身(内置)或 pet/models/<包名>/,各自带一份 pet.json;同一个包在 pet.json 的 variants 里写多套配色,配色只是颜色矩阵(hue / saturate / bright),在载入帧时一次性烘进去,不占磁盘、不影响帧率
    • 选择记在 settings.json 的 petModel / petVariant;换模型会清帧缓存并原地重启宠物
    • 实测四套配色解同一帧的平均色:原色 R60 G64 B84 / 夜色 R45 G48 B61 / 浓彩 R57 G64 B93 / 墨白 R68 G68 B68
    • 启动日志会带上模型:桌面宠物已启动(模型 dsh-pet/default,...)
  • 说明:这套桌宠现在也在独立仓库 fotlim/desktop-pet 里,那边加了 -Mode selftest 自检;两边渲染/物理/菜单行为一致

v1.2.1(2026-10-18)

  • 动作时长对齐原项目:dsh-pet 每段动作都是 10 秒(assets/preview/*.gif 全是 120 帧 × 83ms = 10.00 秒),之前只播 1.4 秒就回待机。现在按 pet.json 的 ms 循环播放 10 秒(往返播,接缝不硬跳):日志会写 宠物动作:撸猫 10 秒(往返循环) 和 宠物动作结束:撸猫 实际 10.2 秒。想改时长直接改 pet.json 的 ms,"pingpong": false 可改成普通循环

v1.2.0(2026-10-18)

  • 退出程序窗口时给三个选择(菜单 0)):完全退出程序 / 只保留桌宠 / 最小化程序,另加「取消」回到菜单
    • 完全退出:停托盘、停守护、停桌宠(开机自启还在,下次登录会自己起来)
    • 只保留桌宠:停托盘和守护,单独拉一个隐藏的桌宠进程,把窗口关掉它也不会跟着退
    • 最小化程序:窗口收进任务栏,托盘 / 守护 / 桌宠照常跑(Windows Terminal 里控制台窗口是隐藏的,这时最小化的是终端窗口)
  • 修:右键菜单里二级菜单的项点了没反应 —— 这才是「帧率改了没生效」的真凶。v1.1.7 加的「点菜单外自动关闭」守卫是按下就收,而二级菜单天生就在父菜单矩形之外,于是按下 48Hz 的那一瞬间菜单被关掉,Click 根本没跑到(日志里连一行 宠物帧率: 48Hz 都没有)
    • 现在改成松手之后再判断该不该收,并且判断「在不在菜单里」时把还开着的二级 / 三级菜单一起算(Test-PetMenuPoint)
    • 实测(合成鼠标点击打在真实菜单上):帧率 → 48Hz → petFps=48、日志打出 宠物帧率: 48Hz;动作 → 挥手、碎碎念 → 气泡时长 → 8 秒 也都点得动了
  • 修:帧率菜单的勾不跟着变。菜单只在宠物启动时建一次,勾选是建的时候算死的 —— 所以把帧率改成 48Hz 再打开菜单,勾还停在 60Hz 上。现在每一项都登记了「怎么判断该不该打勾」,每次弹出前按最新设置重算,帧率 / 大小 / 字号 / 透明度 / 信息框尺寸 / 手感 / 弹性 / 摩擦 / 各项开关 / 随机间隔 / 随机触发 / 气泡时长 全部一起修好了
  • 托盘右键的「退出托盘」也会顺手停掉单独跑的桌宠进程,不会留下一个孤儿宠物

v1.1.9(2026-10-18)

  • 「随机动作间隔」挪进「动作」二级菜单:顶层不再单列,改成 动作 → 随机间隔
  • 碎碎念拆成三项:
    • 自动碎碎念 开关
    • 随机触发:关(只跟随机动作一起)/ 频繁 3~10 分钟 / 一般 1030 分钟 / 偶尔 3090 分钟 —— 每次触发后在区间里重新随机下一次时间,不是固定周期
    • 气泡时长:随机 2~6 秒(默认) / 3 秒 / 5 秒 / 8 秒
  • 顺带把碎碎念和随机动作解耦:以前碎碎念只能跟着"随机动作间隔"一起冒,现在有自己的节拍

v1.1.8(2026-10-18)

  • 修:切帧率没反应。原来只靠菜单回调清缓存,回调没跑到(或缓存没清干净)就一直是旧帧率。现在 Update-Pet 每帧比对 petFps 和已应用值,不一致就自己重建帧缓存(菜单、手改 settings.json 都生效),日志会打 宠物帧率:48Hz(已重建帧缓存)
  • 修:关掉窗口后没有托盘/桌宠
    • 菜单退出时:装了开机自启就自动把托盘拉回来(Start-TrayIfNeeded);没装则明确提示「选 9) 安装开机自启 才会常驻」
    • 托盘加了 UI 异常兜底(Application.ThreadException):回调抛异常只记日志,不再让整个托盘退出
  • 帧缓存重建后补一次 GC.Collect()(连切两档会涨几十 MB)
  • 说明:托盘里同时在做网速/状态刷新,实测计时器 52 Hz、渲染 37 fps;想要满 60 用 -Mode pet 单独跑(59.6 Hz / 47 fps)

v1.1.7(2026-10-18)

  • 新增帧率档位:宠物右键 →「帧率」,24Hz(原生) / 48Hz / 60Hz(默认)
    • 素材是 24fps,48/60 会在相邻两帧之间插一张线性混合帧,动作时长不变,看着更顺;60Hz 档同时把计时器打到 60Hz
    • 实测:-Mode pet 下计时器 59.6 Hz、渲染 47.1 fps(内容 48fps);24Hz 档是 24.0 fps
    • 代价:进程内存 134 MB → 151 MB(多出来的是插帧后的位图);嫌占内存就在菜单里切回 24Hz
  • 新增摸头:点宠物上半部分算摸头,随机抽一个动作播(以前固定挥手),30% 概率顺带说一句
  • 新增 右键菜单点外面自动关闭:菜单打开期间挂一个 40ms 守卫,在菜单矩形外按下鼠标就收起(窗口 TopMost 且没焦点时,WinForms 默认经常不收)
  • 顺带修:每帧都读 settings.json 的两处(petWander / petRandomMin)改走 2 秒缓存,60Hz 下不再反复读盘

v1.1.6(2026-10-18)

  • 移除 微信 / QQ 推送(v1.1.5 加的):个人微信、QQ 都没有官方发消息接口,只能靠中转服务,凭据申请和稳定性都不值得;push.json 同时删掉,通知回到系统的通知中心
  • 调整 桌宠右键菜单:原来的「悬浮面板尺寸…」并入 「信息框」子菜单
    • 6 个固定档位:自动 / 紧凑 240 / 标准 320 / 宽版 420 / 方框 300×120 / 大框 380×160,当前档位打勾
    • 自定义尺寸… 保留,照旧填 宽,高
    • 换档立即生效(面板正开着会按新尺寸重画)

v1.1.5(2026-10-18)

  • 新增 微信 / QQ 通知:通知中心之外再推一份到手机
    • 支持 Server酱、PushPlus(微信)、企业微信群机器人、OneBot(QQ,go-cqhttp/NapCat)、自定义 webhook
    • 菜单 N 配置(回车不变、- 清空),-Mode push 发一条自检;多通道并行
    • 复用原来的去重间隔,掉线/恢复/修复完成等事件不会刷屏
    • 修:PS 5.1 的 -Body 默认按 ASCII 发,中文会变问号 —— 全部改成显式 UTF-8 字节发送
  • 新增 桌宠悬停面板长宽可调 + 文本自适应:宠物右键 →「悬浮面板尺寸…」
    • 宽,高,0 = 自动;固定宽会长文本换行,固定高会截断加省略号,英文/数字不劈词
  • push.json 加进 .gitignore(里面有你的 SendKey/token)

v1.1.4(2026-10-18)

  • 天气位置改成「省 / 市 / 区县」三级
    • 用 Nominatim 做地理编码(地址层级全),整串「吉林省长春市」「广州市天河区」都能拆开逐级重试;查到市后自动补齐所属区县
    • 直辖市自动去重(只显示「上海市」,不会「上海市 上海市」)
    • 没填城市时退回 IP 定位(只到市),再退回 Open-Meteo 地理编码
  • 天气数据源换成彩云天气:菜单 W 填 token(或 -Mode weather -CaiyunToken xxx),一次 weather.json 就能拿实时天气 + 体感温度 + 穿衣指数 + 天气预警;没 token / 取数失败自动回退 Open-Meteo,不会变成"没数据"
  • 新增穿衣提醒:按体感温度分 9 档(短袖短裤 → 羽绒服+帽子围巾),再按天气追加「带伞 / 路滑 / 戴口罩 / 风大 / 多喝水」;彩云自带的穿衣等级作为括号备注
  • 修 天气接口失败原本被静默吞掉,现在会写日志(天气地理编码失败 / IP 定位失败 / Open-Meteo 取数失败 / 彩云取数失败),排查时不用猜

v1.1.3(2026-10-18)

  • 新增 新手向导:-Mode wizard / 菜单 G) / 第一次运行自动弹出
    1. 问一句「当前这个 WiFi 是校园网 / 需要自动认证的吗?」——不是就让你填真正要连的名字,顺手把「目标 WiFi + 自动连接」写好
    2. 没账号就顺便让你填(DPAPI 加密)
    3. 自动认门户:302 跳转 → 网关 → HTTPS 劫持页,命中内置预设(Dr.COM / 天翼 / 深澜 / 锐捷 / 通用)就直接套用
    4. 没命中就现场生成配置:抓门户页,从 <form> 里抠出登录接口、账号字段、密码字段和隐藏字段,拼成 template;页面里出现 md5( / rc4 / base64 就顺带猜加密方式
    5. 可选试登录一次、可选装开机自启
  • 生成的配置存为 id=custom,成功判定先留空(以连通性为准),随时可以 -Mode portal 看和改

v1.1.2(2026-10-18)

  • 新增 -Mode collect / 双击 collect.bat / 菜单 C):一键采集诊断包,给人不在现场的情况用
    • 收集:SSID / IP / 网关 / DNS / 代理变量 / HTTP 302 门户 / 网关 80·8080 / HTTPS 劫持页标题与域名 / 指纹 / 运营商线索
    • 附门户 HTML + 同站 JS(最多 8 个)打包成 collect-<时间>.zip —— 登录字段和加密算法就写在这些 JS 里
    • 报告文本自动进剪贴板,对方粘一下就发得出来;不含账号密码,可放心转发
  • 修 采集同站脚本时按 %{url_effective} 解析相对路径,../share/xxx.js 不再拼错(之前抓回来的是同一个 404 页面)
  • 文档:新增「远程适配」一节,含采集顺序(必须在未认证时采)、F12 → Copy as cURL 的精确抓法、快速助手远程协助

v1.1.1(2026-10-17)

  • 修 启动时自动忽略 http_proxy / https_proxy / all_proxy 环境变量。开着代理软件时 curl 会跟着代理走,对校园网地址一律返回 HTTP 000 —— 这是最容易把"校园网正常但认证没做"误判成"网络坏了"的坑
  • 新增诊断三项:代理环境变量(会告诉你它被忽略了)、网关页面(门户域名不通时,很多学校的认证页就挂在网关上)、门户识别(在线时跳过,省得白探)
  • 增强 -DetectPortal:HTTP 层没抓到 302 时,会再试网关(http://网关/、:8080)和 HTTPS 劫持页(用 -k 取回页面,打印标题和页面里出现的域名——浏览器"自动弹认证页"多半就是这条)

v1.1.0(2026-10-17)

  • 新增 引擎支持两步取 token:tokenUrl / tokenMethod / tokenRegex,登录模板里用 {token} —— 深澜、锐捷和很多自建门户都是这个形状
  • 新增 JSON 体门户:contentType 带 json 就行,模板直接写 {"username":"{user}"},值自动做 JSON 转义;请求体改走临时文件,顺手解决 PS 5.1 传参时引号被搞坏的问题
  • 新增 预设 jsonform(通用 JSON 表单)、srun2(深澜 v2 token 骨架)、ruijie(锐捷骨架)
  • 改进 门户指纹:先认域名再认关键字,修掉「任何带 wlanuserip 的地址都被判成天翼」的误判;新增移动 / 联通 / 电信运营商线索
  • 改进 自动切换只对实测过的 drcom / esurfing / form 生效;骨架预设只提示、不改你的配置
  • 文档 新增「移动 / 联通 / 电信 ≠ 认证系统」对照表;每个预设都标清是实测还是骨架

v1.0.1(2026-10-17)

  • 新增 广东电信天翼校园网(esurfing 预设):queryschool → advertisement.do → vchallenge → client/login,JSON + 大写 MD5 签名,把服务端下发的 challenge 原样回填 —— 不需要识别图形验证码
  • 新增 自动识别门户:抓一次外网 302 就能认出 Dr.COM / 天翼 / 深澜,登录失败时自动换配置重试一次;入口 -Mode portal -AutoPortal、-Mode portal -DetectPortal、菜单 O) 输入 auto
  • 新增 天翼现场勘查:一条命令打印 clientip / nasip / mac / queryschool / vchallenge 原始返回(不含密码),rescode 对照表见文档
  • 修正:portal.json 只写当前协议用得上的字段,不再留一堆 null
  • 文档:说明 WiFi 名字(young / wo / …)与门户识别无关;补 802.1X(教学区企业级 WiFi)不属于本脚本范围

v1.0.0(2026-10-17)

首个公开版本:菜单 / 托盘 / 开机自启 / 多账号 / 自动连 WiFi / 校时 / 网速 / 一键诊断 / 门户改版自检 / 通知中心 / 唤醒重认证 / 自动修复 / 桌面宠物 / 配置驱动的通用门户。

远程适配(朋友不在现场怎么办)

给人远程装这套东西,最缺的不是网络,是**"你那边到底弹的是哪个门户"**。所以有个采集模式,把判断需要的信息一次性收齐。

让朋友做这三步

  1. 把整个文件夹发给他(或者只发 Connect-CampusNet.ps1 + collect.bat 两个文件)
  2. 连上校园网后、还没在浏览器里登录之前,双击 collect.bat
  3. 约 20 秒后,屏幕上出现一份报告,文字已经自动在剪贴板里 —— 让他直接粘贴到聊天窗口发你;同目录如果多出 collect-日期.zip,一起发

菜单里也可以:-Mode menu → C) 采集诊断包。

⚠️ 顺序很重要:一定要在"认证页还活着"的时候采。一旦他自己在浏览器里点过了登录,门户就不再劫持了,采集基本是空的。 采集包不含账号密码(只有网络、探测结果、门户页面和它的 JS),可以放心转发。

采集包里有什么

段 内容 拿来干嘛
无线 当前 SSID、状态、脚本目标 SSID、可见网络 判断是不是目标网络没设对
地址 本机 IP、网关、DNS、代理环境变量 判断网段、是否被代理干扰
探测 联网判定、HTTP 302 门户地址、网关 80/8080、HTTPS 劫持页标题 + 域名 定位门户到底在哪
识别 指纹结果 + 运营商线索 决定套哪个预设
门户页 门户 HTML(portal-1.html)+ 同站 JS 最多 8 个 登录逻辑和加密就写在这些 JS 里,照它就能写出预设

拿到 zip 之后,portal-*.html 里能看到表单字段名,script-*.js 里能搜到 encrypt、md5、password 这类关键字——当初 Dr.COM 那套 RC4 就是这么逆出来的。

更精确的一招(会一点电脑的话)

浏览器弹出认证页 → F12 → Network → 在页面里输入账号密码点登录 → 找到那个 POST 请求 → 右键 → Copy as cURL → 粘贴发过来。

这一条信息量最大:URL、表单字段、密码是明文还是密文、有没有加密参数,全在里面。有它就不用猜了。

实在要动手点

Windows 自带 快速助手(Win+Ctrl+Q,或搜「快速助手」),让对方在设置里开"允许协助"给他一串代码就行,不用装第三方软件。

关键词(方便搜索)

校园网 · 校园网自动登录 · 校园网自动认证 · 校园网自动认证登录 · WiFi 自动认证 · WiFi自动认证登录 · 无线网自动连接 · 校园 WiFi 自动登录 · 宿舍 WiFi 自动登录 · 开机自动联网 · Portal 认证 · 认证门户 · Dr.COM / 城市热点 · 天翼校园网 · 深澜 Srun · 锐捷 ePortal · 深信服 · ChinaNet · CMCC-EDU · 沃 WiFi · 联通校园网 · 移动校园网 · 电信校园网 · PowerShell 脚本 · Windows 托盘常驻

免责声明

  • 本项目只用于你自己的账号在你自己学校的校园网上自动完成认证,等价于你手动打开网页登录
  • 不要用它跑别人的账号、不要用来绕过计费或做任何违反学校规定的事
  • 账号密码用 Windows DPAPI 加密后存在本机 accounts.json,不会随仓库分发,也不会外传
  • 仓库里的 portal.json、settings.json、日志等运行期文件都已在 .gitignore 中排除

About

校园网认证 / 校园网自动登录 / 校园网自动认证 / WiFi自动认证登录 / WiFi 自动认证:Windows 开机自动连校园无线网并完成 Portal 认证,托盘常驻、掉线重连、24 小时自检、多账号。内置 Dr.COM、天翼校园网、深澜 Srun、锐捷 ePortal 门户,支持自定义;附一键采集诊断包,可远程适配别人的学校。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages