Dr.COM 校园网自动登录:使用 Python 实现断线检测与重连
学校的 giwifi 校园网使用 Dr.COM 进行网络认证。如果连接中断后需要重新打开认证页面登录,操作起来会比较麻烦。
我这里采用的方法是:通过浏览器获取校园网的登录请求 URL,再使用 Python 定时检测网络状态。当检测到网络可能断开时,自动重新发送认证请求。
整个过程不需要模拟浏览器点击登录,只需要提前获取能够完成认证的请求地址。
1. 获取校园网登录 URL
首先,需要通过浏览器开发者工具,找到登录校园网时发送的认证请求。
操作步骤如下:
- 连接
giwifi校园网,打开认证页面:http://172.25.251.2/a79.htm。 - 按
F12打开浏览器开发者工具,切换到「网络(Network)」面板,并勾选「保留日志(Preserve log)」。 - 正常完成一次校园网登录,在网络请求列表中找到对应的
GET请求。 - 复制该请求的完整 URL,后面会在 Python 脚本中用到。
如下图所示:

将截图红框内的 URL 复制出来,填入脚本的 LOGIN_URL 变量即可。
需要注意,认证 URL 可能包含账号信息或临时认证参数。不要直接将自己的真实 URL 发布到博客或公开代码仓库中。
2. 自动登录的实现思路
拿到登录 URL 后,接下来要解决的问题就是:怎样判断校园网是否断开,以及什么时候需要重新发送登录请求?
如果每隔几秒就发送一次登录请求,显然没有必要。因此,我在脚本中加入了两层网络检测。
第一步:TCP 连通性检测
优先使用 Python 的 socket 模块,尝试连接阿里云公共 DNS 的 223.5.5.5:53 端口。
如果 TCP 连接成功,就认为当前网络通过了第一层连通性检测,不需要重新登录。
如果连接失败,也不能直接认定校园网已经掉线。毕竟,连接失败也可能是目标服务器、端口访问限制或者临时网络波动造成的。
所以还需要进行第二次检查。
第二步:HTTP 204 检测
当 TCP 检测失败时,脚本会访问:
http://connect.rom.miui.com/generate_204
这是一个可以用于网络连通性检查的 HTTP 地址。
如果请求返回 204 No Content,说明这次 HTTP 检查通过,就暂时不执行登录操作。
如果两次检测都没有通过,脚本才会尝试重新发送校园网认证请求。
需要说明的是,这两项检查只能辅助判断网络状态,并不能准确区分所有掉线原因。
第三步:重新发送认证请求
当两次检测均失败时,脚本会通过 requests.get() 访问之前保存的 LOGIN_URL。
发送请求后,等待 2 秒,再次进行 TCP 连通性检测。
如果检测通过,就更新网络状态;如果仍然无法连接,脚本会在后续循环中继续检查,并在满足条件时再次尝试登录。
整个脚本通过 while True 持续运行,在每轮循环结束后休眠 2 秒,避免不停地发送检测请求。
3. 完整 Python 代码
import socket
import time
import requests
# 你的登录 URL
LOGIN_URL = "填入你的URL"
def fast_tcp_check(host="223.5.5.5", port=53, timeout=1.5):
"""
轻量级网络探测 (毫秒级响应)
尝试连接阿里云 DNS 的 TCP 53 端口。速度极快,适合高频调用。
"""
try:
# 使用 socket 创建一个纯净的 TCP 探测
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(timeout)
s.connect((host, port))
return True
except Exception:
return False
def confirm_captive_portal():
"""
HTTP 204 二次确认 (防止偶尔的网络波动误判)
"""
try:
res = requests.get("http://connect.rom.miui.com/generate_204", timeout=2)
if res.status_code == 204:
return True
except requests.RequestException:
pass
return False
def do_login():
"""执行登录操作"""
print(f"[{time.strftime('%H:%M:%S')}] 确认网络断开,正在执行秒级重连...")
try:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
res = requests.get(LOGIN_URL, headers=headers, timeout=5)
if res.status_code == 200:
print(f"[{time.strftime('%H:%M:%S')}] [+] 登录请求发送成功!")
else:
print(f"[-] 服务器返回异常: {res.status_code}")
except Exception as e:
print(f"[x] 请求发送失败,请检查 WiFi 是否彻底断开。错误: {e}")
def main():
print("=== Dr.COM 实时监控自动登录助手已启动 ===")
print("模式: 高频 TCP 探测 (每 2 秒检测一次)")
# 记录上一次的状态,防止频繁打印日志干扰视线
is_online = True
while True:
# 1. 优先使用极速的 TCP 探测
if not fast_tcp_check():
# 2. 如果 TCP 探测失败,可能是网络波动,用 HTTP 204 接口复查
if not confirm_captive_portal():
if is_online:
print(f"\n[{time.strftime('%H:%M:%S')}] 警告:检测到掉线!")
is_online = False
do_login()
time.sleep(2) # 等待 2 秒让网关分配权限
if fast_tcp_check():
print(f"[{time.strftime('%H:%M:%S')}] [+] 网络已极速恢复!")
is_online = True
else:
# HTTP 204 成功,说明只是 DNS 服务器偶发波动,网络其实没断
pass
# 探测间隔缩小到 2 秒,实现几乎无感的“秒连”
time.sleep(2)
if __name__ == "__main__":
main()代码中主要包含四个部分:
fast_tcp_check():通过 TCP 连接进行第一层网络检测。confirm_captive_portal():使用 HTTP 204 请求进行第二次确认。do_login():向保存的认证 URL 发送登录请求。main():通过循环协调网络检测、登录请求和状态更新。
其中,is_online 用来记录上一次的网络状态,避免在连续检测失败时反复输出掉线警告。
需要注意,代码中的 200 状态码只能说明 HTTP 请求收到了成功响应,不能单独证明校园网认证已经完成。因此,脚本在发送登录请求后,还会进行一次 TCP 检测。
4. Windows 设置登录后自动启动
如果每次开机都需要手动运行脚本,还是不够方便。
Windows 可以通过启动文件夹,在用户登录系统后自动启动指定程序。
这里使用 .pyw 文件配合 pythonw.exe,让脚本在后台运行,不额外弹出命令行窗口。
具体操作如下:
- 将脚本保存为
.pyw文件,例如campus_login.pyw。 - 安装 Python,并确保脚本所使用的 Python 环境已经安装
requests依赖。 - 将
.pyw文件的打开方式设置为pythonw.exe。它通常与python.exe位于同一安装目录。 - 按下
Win + R,打开 Windows「运行」窗口。 - 输入
shell:startup并回车,进入当前用户的启动文件夹。 - 在启动文件夹中创建该
.pyw文件的快捷方式。
设置完成后,Windows 用户登录时就会尝试自动运行脚本。
不过,.pyw 模式没有普通的控制台窗口,原代码中的 print() 日志也无法像在终端运行时那样直接查看。
因此,建议先使用普通 .py 文件,在终端中确认登录和检测逻辑正常,再考虑设置后台自启动。
5. 总结
这套方案的实现并不复杂,主要是利用浏览器开发者工具获取登录请求,再通过 Python 定时检查网络状态,在检测失败时尝试重新认证。
其中,TCP 检测用于快速判断目标端口的连通性,HTTP 204 检测则作为补充,尽量减少单次探测失败造成的误判。
目前的脚本适用于能够通过重发认证 URL 完成登录的校园网环境。不同学校的认证方式可能存在差异,如果登录请求依赖动态令牌、会话信息等参数,就需要根据实际情况调整。
另外,这份实现采用固定间隔轮询,持续掉线时可能反复发送登录请求,实际长期使用时还可以考虑增加重试间隔和日志记录。
聊两句
评论审核后显示有疑问、补充,或者想交流一下,都可以写在这里。
评论区将在滚动到这里时加载。