每天早上开机的第一件事,就是打开浏览器、等校园网认证页面加载出来、输入账号和密码、点登录,然后祈祷这次一次成功。这套流程重复了大半年之后,我实在忍不住花了一个晚上,用批处理写了一个一键登录脚本。现在开机到连上校园网,中间不用再等一分钟的页面加载和手动输入时间,这份经验我觉得值得分享出来。
这篇文章主要解决一个很具体的需求:如何用 Windows 自带的批处理(bat)脚本,实现校园网的自动认证登录。适合那些每天在固定地点使用固定账号上网的同学、同事,也适合刚学批处理、想找个真实场景练手的入门者。我不会只丢给你一段代码,而是把从抓包分析到最终落地的完整思路都讲清楚,这样就算你学校的认证系统和我这边的长得不一样,你也知道该怎么改。
1. 先别急着写代码:搞清你校园网用的是哪种认证
很多同学一上来就搜“校园网自动登录 代码”,copy 一段脚本回来发现完全没用。原因几乎都是同一个:不同学校的认证方式差别很大,脚本是针对“某个特定认证流程”写的,换一个环境就不成立。
我自己最开始也是这么踩的坑。所以第一步不是写代码,而是先搞清楚你所在的校园网到底是怎么做认证的。这不是浪费时间,恰恰是省时间。
1.1 最典型的WEB认证:浏览器跳转背后的流程
大部分学校采用的都是 WEB 认证,流程大致是:你连上网线或者 Wi-Fi 之后,随便打开一个网页,会被重定向到一个认证页面,页面里有输入账号和密码的框,提交之后服务器校验通过,然后你就可以正常访问外网了。
这个过程中真正发生的事情是:你的浏览器向认证服务器发了一个 HTTP 请求,把账号和密码(可能还有别的隐藏字段)当作参数提交过去。服务器返回一段文本或者 JSON,告诉浏览器“登录成功”或者“账号密码错误”。
只要抓到这个请求的完整结构,批处理就能模拟浏览器去提交同样的请求,从而做到免手输的“一键登录”。这也是所有自动化方案里面最基础、最可行的一条路。
1.2 需要额外装客户端的认证:批处理能做到什么程度
也有不少校园网不是浏览器认证,而是要求你安装一个准入客户端软件,登录时必须有那个客户端常驻后台。这种情况下,认证过程往往走的是私有协议,或者结合了 802.1X 之类的东西,批处理直接模拟的难度会大很多。
不过也不是完全没救。有两个可行的思路:
- 看看那个客户端有没有提供命令行参数入口,如果有,批处理调用它就行,本质变成“启动客户端并自动填入参数”。
- 如果客户端没有命令行入口,只剩一个笨办法:让批处理自动打开客户端、自动填好账号密码,再由你自己点一下“连接”。
如果你的校园网属于第二种,我建议先降低预期。这篇的方案主要针对 WEB 认证;如果是客户端认证,你可以在网上搜“你那个准入客户端品牌 + 命令行参数”,看看有没有自动化的可能。
1.3 用 F12 抓包,找出认证请求的真实参数
下面这一步是整个方案里最关键的一步:抓包。方法很简单,不需要任何额外工具,浏览器自带的开发者工具就够用。
在认证页面打开开发者工具(F12),切到 Network(网络)面板,勾选 Preserve log(保留日志),然后在页面上随便输入一个错误的账号密码并提交,比如账号填 test、密码填 123456。这么做的好处是:请求会停留在认证请求上,不会因为“登录成功跳转”而刷掉日志。
提交之后,在 Network 列表里找到那个发出去的认证请求,重点看四项内容:
- 请求 URL:是 http 还是 https,指向哪个地址,有没有端口号;
- 请求方法:通常是 POST,少数情况是 GET;
- 请求参数:也就是表单里提交的字段,比如 userid、passwd、action 之类的具体名称;
- 有没有特殊依赖:比如需要某个 Cookie、Referer 或者 Content-Type 才能成功。
我遇到过最典型的参数结构大概长这样:一个 POST 请求,把 userid、passwd、action=login 三个字段发到 /include/auth_action.php。但这种结构不同学校差异很大,有的用 cmd,有的用 R1,有的还有隐藏的 token 字段。你抓到的字段是啥,脚本里就写啥,不要套模板。
提示:抓包时故意输错账号密码,是个很实用的技巧。用真实账号提交虽然也能看到请求,但成功后页面直接跳转,有时会覆盖掉关键日志信息。
2. 为什么最终选择了批处理 + 系统自带工具
在我决定用批处理之前,其实列过好几个方案。它们各有各的优势,但对于“校园网一键登录”这个场景来说,批处理反而是综合成本最低的。
2.1 四个候选方案的对比
| 方案 | 依赖条件 | 维护成本 | 适合场景 |
|---|---|---|---|
| bat + 系统自带工具(curl/PowerShell) | Windows 10 1803+ 自带 curl,无需安装 | 低,一个文件搞定 | 日常固定环境、快速分享给同事同学 |
| Python + requests 库 | 需要先装 Python 和第三方库 | 中,依赖环境 | 已经有 Python 环境的人 |
| 路由器脚本 / 第三方固件 | 需要路由器能刷机或支持脚本 | 高,改硬件 | 想把登录做到网络设备层的人 |
| 浏览器自动填充 / 书签脚本 | 无需安装,但需要手动点 | 低,但没省掉点击 | 临时用,不是一劳永逸 |
从这个表能看出来,批处理方案最大的优势是零依赖。Windows 系统自带的命令就能完成 HTTP 请求,不需要安装 Python,不需要下载绿色软件,更不需要改路由器。把脚本发给别人,对方双击就能跑,这对大学宿舍这种“互相传脚本”的场景特别友好。
2.2 批处理本质上是“命令序列”,没那么难维护
很多人听到批处理就觉得是上古技术,其实理解起来很简单:bat 文件就是你把平时在命令行里敲的命令按顺序写进一个文件里,双击运行就依次执行。
登录这件事再复杂,落到命令行也就是一条 HTTP 请求的事情。批处理负责组织流程:发请求、检查结果、写日志、开机触发。每个环节拆开都不难,拼在一起就是所谓的“一键登录”。
2.3 什么时候我才推荐换别的方案
批处理不是银弹。如果你学校认证页面有动态验证码,或者登录过程需要额外的浏览器 JS 加密,批处理做起来会非常吃力,这种情况建议转向 Python 方案,或者直接用下面会讲到的“半自动模式”。
还有一点:如果你的账号密码里面含有大量特殊符号,或者学校对 HTTP 请求做了很严格的风控,批处理的转义规则会让人头大。遇到这种情况再考虑换语言,没必要死磕。
3. 核心脚本:从抓包结果到能用的 bat 代码
假设你已经抓到了认证请求,下面用一个常见的简化结构来演示:POST 请求、字段包含 userid 和 passwd,服务器登录成功后返回内容里含有 success 字样。你的实际字段名以抓包结果为准。
3.1 先把登录动作翻译成一个 HTTP 请求
用自然语言描述一下整个过程,就是:向认证服务器地址发送一个 POST 请求,在请求体里告诉它“我是谁,密码是多少”。这个请求做成功后,就不需要浏览器出场了。
这一步的关键是把上一步抓到的参数名、URL、请求方法原样保留下来。哪怕改错一个字段名,服务器都会直接拒绝。
3.2 使用系统自带 curl 的最小脚本
Windows 10 1803 及以上版本自带 curl.exe,可以直接在批处理里调用。注意写 curl.exe 而不是 curl,因为在某些 Windows 环境里 curl 可能被映射到别的东西。
写一个最简版本:
@echo off set AUTH_URL=http://你抓到的认证地址 set USER_ID=你的账号 set USER_PASS=你的密码 curl.exe -s -o login_result.txt -d "userid=%USER_ID%&passwd=%USER_PASS%&action=login" "%AUTH_URL%" findstr /C:"success" login_result.txt >nul if not errorlevel 1 ( echo 登录成功 ) else ( echo 登录失败,返回内容如下: type login_result.txt )这里-d表示提交表单数据,-s是静默模式不显示进度条,-o把返回内容保存到文件。判断是否成功用的是 findstr 去返回内容里找特征字符串。
3.3 用 PowerShell 替代 curl 的情况
如果你发现学校认证页面返回的内容编码是 UTF-8,而 findstr 处理中文容易乱码,可以直接用 PowerShell 来发请求,它对字符编码的处理更稳。
在 bat 里内嵌一行 PowerShell 命令是可行的:
powershell -ExecutionPolicy Bypass -Command "$r = Invoke-WebRequest -Uri '%AUTH_URL%' -Method Post -Body @{userid='%USER_ID%';passwd='%USER_PASS%';action='login'} -ContentType 'application/x-www-form-urlencoded' -UseBasicParsing; $r.Content"这条命令会把登录返回的完整内容输出到屏幕。你可以把它重定向到文件,再做后续判断。PowerShell 的好处是它对 URL 编码和特殊字符的处理更接近浏览器,兼容性更好。
注意:内嵌 PowerShell 时,外层 bat 的百分号变量还能正常展开,但脚本里的单引号和双引号一定要配对清楚。如果密码里有单引号,这条路会变得很麻烦,需要额外转义。
3.4 保存和运行 bat 的细节
写好的脚本用记事本保存,文件后缀必须是 .bat,编码建议用 ANSI,也就是系统默认编码。如果你用 UTF-8 保存,里面又写了中文 echo 提示,在 Windows 的 cmd 里基本都会变成乱码,后面我会专门说这个坑。
保存后先别急着放进启动项,双击跑一次,确认能接到“登录成功”的返回。这一步跑通,后面自动化才有意义。
3.5 一个带日志判断的完整示例
给一个稍微完整一点的版本,方便你直接改参数用:
@echo off setlocal enabledelayedexpansion set AUTH_URL=http://你的认证地址 set USER_ID=你的账号 set USER_PASS=你的密码 set LOG_FILE=D:\network_login\log.txt curl.exe -s -o login_result.txt -d "userid=%USER_ID%&passwd=%USER_PASS%&action=login" "%AUTH_URL%" findstr /C:"success" login_result.txt >nul if not errorlevel 1 ( echo %date% %time% login ok >> %LOG_FILE% echo [OK] 校园网登录成功 ) else ( echo %date% %time% login fail >> %LOG_FILE% echo [FAIL] 登录失败,请手动检查认证页面 type login_result.txt )日志文件建议放到一个你自己记得住的路径下。以后排查“上午到底连上没连上”的时候,翻日志比回忆直观得多。
4. 把这脚本变成“不用管”的常驻工具
脚本能跑只是第一步。真正省心的是让它在你开机之后自动执行、断线之后自动重连。这个部分做得好,才算真的做到“一键”甚至“零键”。
4.1 开机自启的三种安排
Windows 下让 bat 开机自动运行,常见有三种方式:
- 最简单:Win+R 输入
shell:startup,回车打开启动文件夹,把 bat 的快捷方式丢进去。 - 任务计划:用
schtasks命令创建开机触发任务。 - 注册表 Run 键:就是往注册表里加一个启动项。
我个人在“只给自己用”的时候推荐启动文件夹,最透明、最好删。如果还要考虑“开机时网络还没就绪”,任务计划更可靠,因为它可以设置延迟启动。
任务计划的一条命令就能搞定:
schtasks /create /tn "CampusAutoLogin" /tr "D:\scripts\autologin.bat" /sc onlogon /rl limited /f创建之后,可以在任务计划程序里手动调整延迟时间,比如开机后等 30 秒再跑。因为刚开机时网卡可能还没拿到 IP,立刻发登录请求容易失败。
4.2 断线重连:让它自己盯着网络状态
校园网的一个烦人之处是有时会自动掉线,或者一段时间不活跃就被踢下线。所以除了开机登录,还得加一个自动检测和重连机制。
思路很简单:周期性地 ping 一个外网探针地址,如果 ping 不通,就说明掉线了,于是调用登录脚本。
这里有一个容易踩的坑:不要拿默认网关做探针。因为校园网的默认网关通常是认证服务器,即使你的账号没登录成功,网关也可能通,这样 ping 网关永远显示“正常”,但实际根本没有外网。正确做法是选一个稳定的外网 IP 作为探针,例如学校常用的公共 DNS 地址,或者任何你能确定可 ping 通的公网地址。
可以写成这样,用计划任务每分钟跑一次:
@echo off set PROBE=外网探针地址 ping -n 2 %PROBE% >nul if errorlevel 1 ( call D:\scripts\autologin.bat )这个脚本体量很小,配合任务计划“每 1 分钟重复”就能实现自动盯线。注意call调另一个 bat 而不是goto,这样两个脚本互相独立,改起来也方便。
4.3 多账号和密码外置:把配置和代码分开
如果你帮室友也写了一份,或者你自己有多个账号要切换,不建议把账号密码硬编码在 bat 里,每次改都要动脚本。
更清爽的做法是用一个单独的配置文件,比如同目录下放一个config.txt,内容就两行:
USER_ID=20190001 USER_PASS=123456然后在 bat 里用for /f把这两项读进来。这样以后换号只需要改配置文件,脚本完全不动。对那种喜欢把脚本分享到班群里的场景,别人拿到手也只需要改一个文件,不容易改坏代码。
5. 实测中踩过的坑与对应的解决办法
脚本能用之后,我在自己机器上反复试了很久,也帮身边的同学调过不少,下面这些坑基本是“必遇款式”。遇到不要慌,逐个对号入座就能解决。
5.1 中文乱码问题:编码不对,一切白搭
bat 文件在记事本里默认保存的是 ANSI,但如果你在编码下拉框里选了 UTF-8,回到 cmd 里执行时,中文提示全变乱码。
解决很简单:写 bat 时统一用 ANSI 编码保存。如果里面没有中文,只有英文和数字,那就无所谓编码。
另外,判断返回内容中文时,最好把特征换成英文或者数字。很多认证系统的返回内容其实是success、login_ok这种字符串,直接用英文特征匹配,比匹配中文稳得多。
5.2 密码里的特殊字符:cmd 的转义规则要小心
这是最容易出问题的地方。如果你密码里含有&、^、%、!这类的字符,在 cmd 里它们都有特殊含义。比如&会被当成“连续执行多条命令”,%会被当成变量引用。
最简单的避开办法是把密码写入配置文件,用for /f读取后再使用。读取时注意开启延迟变量扩展,即setlocal enabledelayedexpansion,同时用!变量名!而不是%变量名%,可以绕开很多符号误解。
实在绕不开,就把特殊字符挨个用^转义。但我不推荐硬转义,太容易漏。
5.3 PowerShell 执行策略和杀软误报
默认情况下,Windows 上直接跑 PowerShell 脚本可能被执行策略拦下来。我在 bat 里内嵌命令时都会带上-ExecutionPolicy Bypass,只对当前进程生效,不会影响系统设置,可以放心用。
还有一点:某些杀毒软件对“脚本自动提交账号密码”这类行为比较敏感,可能弹出拦截提示。这不是脚本有问题,而是行为特征像自动化工具。遇到这种情况,可以给脚本目录加白名单,或者改用系统自带的任务计划去触发。
5.4 遇到验证码怎么办:半自动模式
如果你的校园网认证页面还有验证码,就别指望纯批处理全自动了。识别验证码需要 OCR 或打码平台,已经超出批处理的能力范围。
现实的做法是“半自动”:脚本自动打开认证页、自动填好账号密码,再把光标定位到验证码输入框,你只需要看图输验证码、点登录。这样至少省掉了手输账号密码的重复劳动,流程快很多。
实现可以用系统的 IE COM 对象,不过触发杀软的概率偏高,我一般作为备选方案。如果验证码问题始终绕不开,更推荐老老实实上 Python 方案。
5.5 换环境之后脚本失效:大多数是参数变了
脚本用了一个学期,有天突然登录失败了,先别怀疑人生。最常见的原因有两个:一是学校把认证服务器换了地址或改了请求接口;二是你换了宿舍、换了交换机,认证环境不一样了。
解决办法就是重新做一遍 1.3 节的抓包步骤,把新的 URL 和字段名更新进脚本。这行脚本本来就是你网络环境的“镜像”,环境变了,镜像当然也要跟着变。
6. 一段个人体会收尾
批处理这个东西看起来很老,但用来解决校园网登录这种“高频、固定、流程简单”的小事,真的是杀鸡用牛刀却刚刚好。它不需要额外装任何东西,改起来也不怕改坏系统,哪怕你完全没接触过编程,只要愿意花一个晚上把抓包逻辑搞清楚,就能写出属于自己的版本。
最后分享一个我后来常用的扩展习惯:脚本里加一行时间戳写入日志,时间久了就会发现它价值极大。哪天网络出问题,管理员问“你什么时候断的”,翻一下日志就能说清楚,不用全靠记忆猜。
这篇的核心不是让你复制我的代码,而是让你学会“先看你的网络环境,再对症下药”。抓着 F12 多看两眼,比盲试十个脚本都管用。