Dr.COM 校园网自动登录:使用 Python 实现断线检测与重连

学校的 giwifi 校园网使用 Dr.COM 进行网络认证。如果连接中断后需要重新打开认证页面登录,操作起来会比较麻烦。

我这里采用的方法是:通过浏览器获取校园网的登录请求 URL,再使用 Python 定时检测网络状态。当检测到网络可能断开时,自动重新发送认证请求。

整个过程不需要模拟浏览器点击登录,只需要提前获取能够完成认证的请求地址。

1. 获取校园网登录 URL

首先,需要通过浏览器开发者工具,找到登录校园网时发送的认证请求。

操作步骤如下:

  1. 连接 giwifi 校园网,打开认证页面:http://172.25.251.2/a79.htm。
  2. 按 F12 打开浏览器开发者工具,切换到「网络(Network)」面板,并勾选「保留日志(Preserve log)」。
  3. 正常完成一次校园网登录,在网络请求列表中找到对应的 GET 请求。
  4. 复制该请求的完整 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 代码

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,让脚本在后台运行,不额外弹出命令行窗口。

具体操作如下:

  1. 将脚本保存为 .pyw 文件,例如 campus_login.pyw。
  2. 安装 Python,并确保脚本所使用的 Python 环境已经安装 requests 依赖。
  3. 将 .pyw 文件的打开方式设置为 pythonw.exe。它通常与 python.exe 位于同一安装目录。
  4. 按下 Win + R,打开 Windows「运行」窗口。
  5. 输入 shell:startup 并回车,进入当前用户的启动文件夹。
  6. 在启动文件夹中创建该 .pyw 文件的快捷方式。

设置完成后,Windows 用户登录时就会尝试自动运行脚本。

不过,.pyw 模式没有普通的控制台窗口,原代码中的 print() 日志也无法像在终端运行时那样直接查看。

因此,建议先使用普通 .py 文件,在终端中确认登录和检测逻辑正常,再考虑设置后台自启动。

5. 总结

这套方案的实现并不复杂,主要是利用浏览器开发者工具获取登录请求,再通过 Python 定时检查网络状态,在检测失败时尝试重新认证。

其中,TCP 检测用于快速判断目标端口的连通性,HTTP 204 检测则作为补充,尽量减少单次探测失败造成的误判。

目前的脚本适用于能够通过重发认证 URL 完成登录的校园网环境。不同学校的认证方式可能存在差异,如果登录请求依赖动态令牌、会话信息等参数,就需要根据实际情况调整。

另外,这份实现采用固定间隔轮询,持续掉线时可能反复发送登录请求,实际长期使用时还可以考虑增加重试间隔和日志记录。

谢谢你读到这里。 ✧

聊两句

评论审核后显示

有疑问、补充,或者想交流一下,都可以写在这里。

评论区将在滚动到这里时加载。