南京邮电大学 校园网自动认证工具
使用 Deepseek V4.1 Flash 完成
项目地址 https://github.com/Hikazyo/njupt_wifi_autologin
用 C++ 写的南邮校园网(Dr.COM eportal 门户)自动登录工具。
只用 WinHTTP,没有任何第三方依赖,编译出来是一个独立的 exe。
支持三种运营商账号:
--isp |
说明 | 实际提交的账号 |
|---|---|---|
edu |
校园网 / 教育网(默认) | 学号 |
cmcc |
中国移动 | 学号@cmcc |
ct |
中国电信 | 学号@njxy |
一、认证原理
南邮用的是城市热点 Dr.COM eportal 网页认证系统。整个流程只有三步:
-
判断当前是否已经联网
请求几个公共的generate_204探测地址。返回204说明网络已通;
返回302或返回带location.href="..."的页面,说明被门户劫持了,需要认证。
用公共探测点而不是直接请求校园网门户,是为了少给门户添流量(门户本身比较脆)。 -
拿到本机在校园网内的 IP
GET https://p.njupt.edu.cn/a79.htm,从返回的 HTML 里正则抓
v46ip='10.10.x.x'。这个值要作为wlan_user_ip参数提交。 -
提交认证
GET https://p.njupt.edu.cn:802/eportal/portal/login?...
关键参数(顺序与设备侧一致):参数 值 callbackdr1003login_method1user_account,0,+ 账号(含运营商后缀)user_password明文密码 wlan_user_ip上一步抓到的 IP wlan_user_mac000000000000jsVersion4.5terminal_type1operateportal_loginbusiness_type1v500~99999 的随机数 langzh-cn(末尾再带一个zh)另外还会带上
enable_r3=0、mac_type=0、authex_enable=、
wlan_ac_ip=、wlan_ac_name=、wlan_user_ipv6=等空值参数。 -
解析结果
返回值是 JSONP:dr1003({"result":1,"msg":"...","ret_code":2})。
result == 1即认证成功;否则打印msg里的原因
(例如密码错误、账号欠费、当前时间禁止上网等)。
关于 HTTPS 证书:校园门户的证书经常是自签 / 域名不匹配 / 过期的,
所以程序对门户请求放宽了证书校验(SECURITY_FLAG_IGNORE_*)。
这一点只作用于校内门户,不会影响其它程序。
二、编译
需要 MinGW-w64(g++),或者你自己改用 MSVC。
用 Makefile:
1 | mingw32-make |
直接编译:
1 | g++ -std=c++17 -O2 -Wall -Wextra -static -o njupt_login.exe njupt_login.cpp -lwinhttp |
-static请不要省略。 如果你的 PATH 里存在另一个 MinGW 工具链的
libstdc++-6.dll(装了 Git for Windows 就会这样,它的
C:\Program Files\Git\mingw64\bin往往排在 msys2 前面),动态链接的 exe
会加载到 ABI 不兼容的那一份,启动瞬间以0xC0000005(访问冲突)崩溃。
静态链接生成的是独立 exe,既没这个问题,也方便丢进启动文件夹。
MSVC(可选):
1 | cl /std:c++17 /EHsc /utf-8 /O2 njupt_login.cpp winhttp.lib |
(MSVC 需要把 _getch 所在的 <conio.h> 保持原样即可;若提示 _WIN32_WINNT
相关符号未定义,加 /D_WIN32_WINNT=0x0601。)
三、使用
1. 配置账号
把 config.example.ini 复制成 config.ini,和 exe 放在同一目录:
1 | username = B21010101 |
2. 常用命令
1 | # 登录一次(账号密码都在 config.ini 里时,直接运行即可) |
3. 退出码
| 退出码 | 含义 |
|---|---|
0 |
认证成功 / 本来就已经联网 |
1 |
认证失败或当前未联网 |
2 |
参数错误、读不到配置文件 |
四、开机自动运行
方法 A:任务计划程序
Win + R→taskschd.msc- 创建任务 → 触发器选「登录时」→ 操作选「启动程序」
- 程序填
D:\NJUPT_Network\njupt_login.exe,参数填--loop -i 20 - 勾选「不管用户是否登录都要运行」可让它在锁屏时也工作
方法 B:启动文件夹
Win + R → 输入 shell:startup → 把 exe 的快捷方式丢进去,
快捷方式目标改成 "...\njupt_login.exe" --loop。
五、安全提示
config.ini 里是明文密码,请务必:
- 不要把
config.ini提交到 Git(本目录的.gitignore已经排除它); - 不要把这个目录放到共享盘或网盘同步目录里;
- 如果不想落盘,就不用配置文件,改用命令行 / 交互式输入密码。
命令行传 -p 会让密码出现在进程列表里,多人共用的机器上建议只在
config.ini 里填,或者用交互式输入。
六、常见问题
Q:提示「无法连接认证服务器」
A:说明根本没连上校园网。先确认有线插好 / 连上了 NJUPT 无线信号。
另外如果是在宿舍用路由器,注意路由器本身也要完成认证,电脑直连可能拿不到 IP。
Q:提示「认证被拒」
A:最常见的是 --isp 选错了。校园网套餐选 edu,移动宽带选 cmcc,
电信宽带选 ct。其次是密码改了、或者账号被停机。
Q:提示「当前时间禁止上网」
A:学校在断网时段(一般是凌晨)主动拒绝认证,这不是脚本的问题。
Q:p.njupt.edu.cn 解析不了
A:程序会自动回退到 10.10.244.11 直连(带 Host 头)。
也可以在 config.ini 里手动指定 portal_host / portal_ip。
Q:想用 HTTP 而不是 HTTPS
A:程序在 HTTPS 失败时会自动尝试明文 :802,无需手动配置。
Q:exe 一运行就闪退,退出码是 -1073741819
A:这是 0xC0000005 访问冲突,几乎总是自己编译时漏了 -static:
PATH 里另一个工具链的 libstdc++-6.dll 被抢先加载,ABI 对不上。
用 mingw32-make(已默认加 -static)重新编译即可。
Q:怎么看程序到底干了什么
A:加 -v。会把门户页面大小、抓到的本机 IP、认证接口的 HTTP 状态码和
响应体原文都打出来,排错时非常有用。
七、文件说明
| 文件 | 作用 |
|---|---|
njupt_login.cpp |
全部源码(单文件) |
Makefile |
构建脚本 |
config.example.ini |
配置模板 |
config.ini |
你自己的配置(需自行创建,已被 gitignore) |
八、参考
协议细节对照了以下维护中的开源实现(本项目为独立的 C++ 重写):
- ArcticLampyrid/njupt_wifi_login(Rust)
- s235784/NJUPT_AutoLogin(Shell,OpenWRT/路由器场景)
本项目仅供个人在校内网络下自用。请遵守南京邮电大学校园网使用相关规定。





