使用 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 网页认证系统。整个流程只有三步:

  1. 判断当前是否已经联网
    请求几个公共的 generate_204 探测地址。返回 204 说明网络已通;
    返回 302 或返回带 location.href="..." 的页面,说明被门户劫持了,需要认证。
    用公共探测点而不是直接请求校园网门户,是为了少给门户添流量(门户本身比较脆)。

  2. 拿到本机在校园网内的 IP
    GET https://p.njupt.edu.cn/a79.htm,从返回的 HTML 里正则抓
    v46ip='10.10.x.x'。这个值要作为 wlan_user_ip 参数提交。

  3. 提交认证
    GET https://p.njupt.edu.cn:802/eportal/portal/login?...
    关键参数(顺序与设备侧一致):

    参数 值
    callback dr1003
    login_method 1
    user_account ,0, + 账号(含运营商后缀)
    user_password 明文密码
    wlan_user_ip 上一步抓到的 IP
    wlan_user_mac 000000000000
    jsVersion 4.5
    terminal_type 1
    operate portal_login
    business_type 1
    v 500~99999 的随机数
    lang zh-cn(末尾再带一个 zh)

    另外还会带上 enable_r3=0、mac_type=0、authex_enable=、
    wlan_ac_ip=、wlan_ac_name=、wlan_user_ipv6= 等空值参数。

  4. 解析结果
    返回值是 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
2
3
username = B21010101
password = your_password
isp = edu

2. 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 登录一次(账号密码都在 config.ini 里时,直接运行即可)
.\njupt_login.exe

# 命令行传账号密码
.\njupt_login.exe -u B21010101 -p mypassword --isp edu

# 只检测网络状态,不登录(适合写进监控脚本)
.\njupt_login.exe --check

# 守护模式:每 30 秒检测一次,掉线自动重连
.\njupt_login.exe --loop -i 30

# 注销
.\njupt_login.exe --logout -u B21010101

# 排错时打开调试输出,会打印响应体原文
.\njupt_login.exe -v

3. 退出码

退出码 含义
0 认证成功 / 本来就已经联网
1 认证失败或当前未联网
2 参数错误、读不到配置文件

四、开机自动运行

方法 A:任务计划程序

  1. Win + R → taskschd.msc
  2. 创建任务 → 触发器选「登录时」→ 操作选「启动程序」
  3. 程序填 D:\NJUPT_Network\njupt_login.exe,参数填 --loop -i 20
  4. 勾选「不管用户是否登录都要运行」可让它在锁屏时也工作

方法 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++ 重写):

本项目仅供个人在校内网络下自用。请遵守南京邮电大学校园网使用相关规定。