校园网自动认证登录 / WiFi 自动认证登录 —— Windows 装一次,之后开机自动连校园无线网、自动完成 Portal 认证、掉线自动重连。宿舍 WiFi(ChinaNet / CMCC-EDU / 沃 WiFi)、教学楼认证页都适用。
针对你学校这套 中国电信 Dr.COM 校园网认证门户(http://1.1.1.4);同一套脚本也内置了广东电信天翼校园网(enet.10000.gd.cn)和通用表单门户,换个学校不用改代码,详见 通用版:换所学校也能用。
设置一次,之后开机自动在后台跑,右下角有「网」图标,掉线自动重连,系统时间偏了会自动校准。
- 双击
connect.bat→ 弹菜单(会自动用 Windows Terminal 打开,所以背景图才生效) - 第一次运行会自动进「新手向导」:问一句「这个 WiFi 是校园网吗」→ 不是就换名字 → 顺便填账号 → 自动认门户并生成配置
- 想再跑一次向导:菜单里按
G(或-Mode wizard) - 最后选
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 加密的
默认目标是 CIT-Chinanet,程序一启动就以最高优先级先连它,连上之后才做门户登录、校时等其它事。守护每轮发现掉线时也会重新确认 WiFi,不是目标网络就自动 netsh wlan connect 连上去。
「是否自动连接」是一个可保存的开关(存在 settings.json),三个地方都能改:
| 位置 | 说明 |
|---|---|
菜单第 1 项 |
放在最上面,优先级最高;点一下就切换 开/关 |
| 托盘右键第一项 | 同样一眼可见 |
命令行 -NoWifi |
本次强制不碰 WiFi(不改变设置) |
关掉之后,启动时就不会去连 WiFi,但门户登录照旧。
三个前提(缺一个就连不上,脚本会在日志里说清楚):
- Windows 里必须先存过这个 SSID 的配置 —— 手动连过一次就行。没有配置时脚本会明确报"请先手动连接一次"。
CIT-Chinanet是 Open(无密码) 网络,所以不需要密码、也不需要管理员权限,一条netsh就够。- 无线服务
WlanSvc必须在跑(停了脚本会尝试拉起,但拉起需要管理员)。
每次启动都会打一行 WiFi 状态,方便排查:
[INFO] WiFi 当前: CIT-Chinanet ,目标: CIT-Chinanet
换目标网络:菜单第 2 项,或 -WifiSsid "另一个SSID"(会写进设置,之后一律以设置为准)。
把"为什么不工作"变成"报告里第几项不正常"。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,托盘点「一键诊断」还会自动用记事本打开 —— 要问人时直接把这份发出去。
校园网最常见的情况不是"没网",而是 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 处变化"。
菜单 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 处理,不会算出天文数字
- 离线时不显示速度(免得看起来像在跑流量)
Windows 的 WiFi 列表是缓存的:刚开机、刚唤醒、刚从别的网络切回来时,列表经常还是空的 / 过期的 —— 结果就是"明明有信号,却报没有配置 / 连不上"。所以每次连接前都会自动刷新一遍,不需要你操作,也没有开关。
具体会自动做这几件事:
- 连接前强制刷新:先跑
netsh wlan show networks(让无线服务重新扫描),再读profiles/interfaces,三份数据一起判断 - 列表变化写日志:目标 SSID 消失 / 重新可见时记一行,事后好排错
- 超时自动重试一轮:第一次连接超时后再刷新一次列表,如果这时能看到目标(刚开机扫描慢的典型情况)就再试一次,看不到就不白等
- 开放网络缺配置自动补:目标 SSID 可见、是开放网络、但 Windows 里没有它的配置时,用
netsh wlan add profile自动补一份再连(仅开放网络;带密码的网络不猜) - 连不上时告诉你搜到了什么:日志里列出当前可见的 SSID,不用再开别的工具看
菜单顶部显示可见网络数量;诊断报告第 12 项会报目标 SSID 是否可见、信号多少、Windows 里有没有配置。
以前用的是托盘气泡(ShowBalloonTip)—— Win10/11 上它经常被系统吞掉,而且留不在通知中心里,错过就没了。现在改成 WinRT 的 Toast:
- 进通知中心:断了/恢复了,按
Win+N还能翻回来看 - 点了能干活:通知自带按钮「打开菜单」「立即登录」「查看日志」,点一下直接执行(走
campusnet:协议) - 设置里能单独关:设置 > 通知 里会出现一条「校园网自动登录」,不想看就关掉它,不影响登录
- 不刷屏:同类通知有去重(比如掉线 20 秒内只发一条);守护连续 3 次登录失败才会提醒一次"可能改密码了"
自检:-Mode notify 会发一条测试通知,并打印通知身份、快捷方式路径、通知中心里的历史条数。托盘右键也有「发送测试通知」。
第一次运行会自动建一个开始菜单快捷方式「校园网自动登录」,这是让系统认识本应用的必要条件(AppUserModelID)。删掉它通知就会退回气泡。
合盖睡一晚再打开,以前要等守护下一轮(最多 30 秒)才会重连。现在两条路一起走:
- 托盘挂
PowerModeChanged:一唤醒立刻起一个隐藏进程补一次认证(抢在守护前面) - 守护看"睡过头":每轮记录睡觉时长,远超检测间隔就说明刚从休眠回来,马上重新认证
重认证不是无脑重发密码:先测连通性 → 通了就什么都不做 → 不通才连 WiFi、再登录。刚唤醒网卡可能还没起来,所以最多试 3 轮、每轮隔 3 秒。成功了发通知「唤醒后已自动重新认证」,失败发「唤醒后连不上,已开始自动修复」。
诊断发现常见毛病时不再只告诉你"哪里不对",而是先动手试一遍。修的顺序是从轻到重:
| 步骤 | 做什么 | 什么时候做 |
|---|---|---|
| 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 步。
托盘右键 →「内存」子菜单,不装任何第三方软件:
| 项 | 说明 |
|---|---|
| 轻清(免管理员) | 把自家托盘/守护进程的工作集清一遍(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,双重保证。若确实没有标签页,截个窗口图发我 |
现在任务用"当前用户登录时"触发 + 普通权限。原因:凭据是当前用户级 DPAPI,系统账户解不开。
真要在登录前联网,需要改成 SYSTEM 运行 + -MachineScope 机器级加密 —— 需要就说一声。
版本号还是 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 自动连接 / 校时 / 网速 / 诊断 / 门户自检 / 通知中心 / 唤醒重认证 / 自动修复 / 内存清理 / 通用门户 / 采集 / 向导 全部保留
点开看(含本版已移除的桌宠 / 图标互动 / 天气相关变更)
- 去掉「整理图标」:溜达/拖动触发的随机事件不再重排整个桌面,只保留吃掉和搬运,不动的图标一个都不碰
- 菜单里的「整理图标」也删了;「桌面图标互动」现在是 吃掉 / 搬运 / 还回被吃掉的 / 恢复布局
- 内存清理(精简版 Mem Reduct):托盘右键新增「内存」子菜单
- 轻清:清自家进程工作集,免管理员,实测 100 → 16 MB
- 系统清理:清 standby list + 文件缓存,实测可用内存 +363 MB
- 全部清理
- 内存紧张时自动清理:可用 < 阈值(默认 12%)才触发,冷却 10 分钟内不重复;阈值/冷却菜单里可调
- 自动清理可选顺带清系统缓存
- 免 UAC 提权任务
CampusNet-MemClean:托盘权限不够时自动改用,不弹 UAC - 顺带加命令行入口
-Mode memclean -Scope light|system|all
- 新增开关「启动时自动拉起桌宠」:托盘右键 →「启动时自动拉起桌宠」勾选;关掉后开机/托盘重启不会再自动弹出桌宠,需要时在「桌面宠物」里手动打开
-
桌宠 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自检;两边渲染/物理/菜单行为一致
- 动作时长对齐原项目:dsh-pet 每段动作都是 10 秒(assets/preview/*.gif 全是 120 帧 × 83ms = 10.00 秒),之前只播 1.4 秒就回待机。现在按
pet.json的ms循环播放 10 秒(往返播,接缝不硬跳):日志会写宠物动作:撸猫 10 秒(往返循环)和宠物动作结束:撸猫 实际 10.2 秒。想改时长直接改pet.json的ms,"pingpong": false可改成普通循环
- 退出程序窗口时给三个选择(菜单
0)):完全退出程序 / 只保留桌宠 / 最小化程序,另加「取消」回到菜单- 完全退出:停托盘、停守护、停桌宠(开机自启还在,下次登录会自己起来)
- 只保留桌宠:停托盘和守护,单独拉一个隐藏的桌宠进程,把窗口关掉它也不会跟着退
- 最小化程序:窗口收进任务栏,托盘 / 守护 / 桌宠照常跑(Windows Terminal 里控制台窗口是隐藏的,这时最小化的是终端窗口)
- 修:右键菜单里二级菜单的项点了没反应 —— 这才是「帧率改了没生效」的真凶。v1.1.7 加的「点菜单外自动关闭」守卫是按下就收,而二级菜单天生就在父菜单矩形之外,于是按下 48Hz 的那一瞬间菜单被关掉,
Click根本没跑到(日志里连一行宠物帧率: 48Hz都没有)- 现在改成松手之后再判断该不该收,并且判断「在不在菜单里」时把还开着的二级 / 三级菜单一起算(
Test-PetMenuPoint) - 实测(合成鼠标点击打在真实菜单上):帧率 → 48Hz →
petFps=48、日志打出宠物帧率: 48Hz;动作 → 挥手、碎碎念 → 气泡时长 → 8 秒 也都点得动了
- 现在改成松手之后再判断该不该收,并且判断「在不在菜单里」时把还开着的二级 / 三级菜单一起算(
- 修:帧率菜单的勾不跟着变。菜单只在宠物启动时建一次,勾选是建的时候算死的 —— 所以把帧率改成 48Hz 再打开菜单,勾还停在 60Hz 上。现在每一项都登记了「怎么判断该不该打勾」,每次弹出前按最新设置重算,帧率 / 大小 / 字号 / 透明度 / 信息框尺寸 / 手感 / 弹性 / 摩擦 / 各项开关 / 随机间隔 / 随机触发 / 气泡时长 全部一起修好了
- 托盘右键的「退出托盘」也会顺手停掉单独跑的桌宠进程,不会留下一个孤儿宠物
- 「随机动作间隔」挪进「动作」二级菜单:顶层不再单列,改成 动作 → 随机间隔
- 碎碎念拆成三项:
自动碎碎念开关随机触发:关(只跟随机动作一起)/ 频繁 3~10 分钟 / 一般 1030 分钟 / 偶尔 3090 分钟 —— 每次触发后在区间里重新随机下一次时间,不是固定周期气泡时长:随机 2~6 秒(默认) / 3 秒 / 5 秒 / 8 秒
- 顺带把碎碎念和随机动作解耦:以前碎碎念只能跟着"随机动作间隔"一起冒,现在有自己的节拍
- 修:切帧率没反应。原来只靠菜单回调清缓存,回调没跑到(或缓存没清干净)就一直是旧帧率。现在
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)
- 新增帧率档位:宠物右键 →「帧率」,
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 下不再反复读盘
- 移除 微信 / QQ 推送(v1.1.5 加的):个人微信、QQ 都没有官方发消息接口,只能靠中转服务,凭据申请和稳定性都不值得;
push.json同时删掉,通知回到系统的通知中心 - 调整 桌宠右键菜单:原来的「悬浮面板尺寸…」并入 「信息框」子菜单
- 6 个固定档位:
自动/紧凑 240/标准 320/宽版 420/方框 300×120/大框 380×160,当前档位打勾 自定义尺寸…保留,照旧填宽,高- 换档立即生效(面板正开着会按新尺寸重画)
- 6 个固定档位:
- 新增 微信 / 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)
- 天气位置改成「省 / 市 / 区县」三级
- 用
Nominatim做地理编码(地址层级全),整串「吉林省长春市」「广州市天河区」都能拆开逐级重试;查到市后自动补齐所属区县 - 直辖市自动去重(只显示「上海市」,不会「上海市 上海市」)
- 没填城市时退回 IP 定位(只到市),再退回
Open-Meteo地理编码
- 用
- 天气数据源换成彩云天气:菜单
W填 token(或-Mode weather -CaiyunToken xxx),一次weather.json就能拿实时天气 + 体感温度 + 穿衣指数 + 天气预警;没 token / 取数失败自动回退Open-Meteo,不会变成"没数据" - 新增穿衣提醒:按体感温度分 9 档(短袖短裤 → 羽绒服+帽子围巾),再按天气追加「带伞 / 路滑 / 戴口罩 / 风大 / 多喝水」;彩云自带的穿衣等级作为括号备注
- 修 天气接口失败原本被静默吞掉,现在会写日志(
天气地理编码失败 / IP 定位失败 / Open-Meteo 取数失败 / 彩云取数失败),排查时不用猜
- 新增 新手向导:
-Mode wizard/ 菜单G)/ 第一次运行自动弹出- 问一句「当前这个 WiFi 是校园网 / 需要自动认证的吗?」——不是就让你填真正要连的名字,顺手把「目标 WiFi + 自动连接」写好
- 没账号就顺便让你填(DPAPI 加密)
- 自动认门户:302 跳转 → 网关 → HTTPS 劫持页,命中内置预设(Dr.COM / 天翼 / 深澜 / 锐捷 / 通用)就直接套用
- 没命中就现场生成配置:抓门户页,从
<form>里抠出登录接口、账号字段、密码字段和隐藏字段,拼成template;页面里出现md5(/rc4/base64就顺带猜加密方式 - 可选试登录一次、可选装开机自启
- 生成的配置存为
id=custom,成功判定先留空(以连通性为准),随时可以-Mode portal看和改
- 新增
-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的精确抓法、快速助手远程协助
- 修 启动时自动忽略
http_proxy/https_proxy/all_proxy环境变量。开着代理软件时 curl 会跟着代理走,对校园网地址一律返回HTTP 000—— 这是最容易把"校园网正常但认证没做"误判成"网络坏了"的坑 - 新增诊断三项:
代理环境变量(会告诉你它被忽略了)、网关页面(门户域名不通时,很多学校的认证页就挂在网关上)、门户识别(在线时跳过,省得白探) - 增强
-DetectPortal:HTTP 层没抓到 302 时,会再试网关(http://网关/、:8080)和 HTTPS 劫持页(用-k取回页面,打印标题和页面里出现的域名——浏览器"自动弹认证页"多半就是这条)
- 新增 引擎支持两步取 token:
tokenUrl/tokenMethod/tokenRegex,登录模板里用{token}—— 深澜、锐捷和很多自建门户都是这个形状 - 新增 JSON 体门户:
contentType带json就行,模板直接写{"username":"{user}"},值自动做 JSON 转义;请求体改走临时文件,顺手解决 PS 5.1 传参时引号被搞坏的问题 - 新增 预设
jsonform(通用 JSON 表单)、srun2(深澜 v2 token 骨架)、ruijie(锐捷骨架) - 改进 门户指纹:先认域名再认关键字,修掉「任何带
wlanuserip的地址都被判成天翼」的误判;新增移动 / 联通 / 电信运营商线索 - 改进 自动切换只对实测过的
drcom/esurfing/form生效;骨架预设只提示、不改你的配置 - 文档 新增「移动 / 联通 / 电信 ≠ 认证系统」对照表;每个预设都标清是实测还是骨架
- 新增 广东电信天翼校园网(
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)不属于本脚本范围
首个公开版本:菜单 / 托盘 / 开机自启 / 多账号 / 自动连 WiFi / 校时 / 网速 / 一键诊断 / 门户改版自检 / 通知中心 / 唤醒重认证 / 自动修复 / 桌面宠物 / 配置驱动的通用门户。
给人远程装这套东西,最缺的不是网络,是**"你那边到底弹的是哪个门户"**。所以有个采集模式,把判断需要的信息一次性收齐。
- 把整个文件夹发给他(或者只发
Connect-CampusNet.ps1+collect.bat两个文件) - 连上校园网后、还没在浏览器里登录之前,双击
collect.bat - 约 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中排除