南邮自动化连接校园网脚本实现

南邮这个校园网,每当电脑空闲一段时间后就会自动注销,之后打开电脑就要重新登陆账号,虽然浏览器可以记住账号密码,也就是多几步的操作而已,但是出于兴趣,在网上学习了一下如何编写自动化脚本自动检测网络状态,达到断网自连的效果,参考了几位南邮同学的文章,下面是我综合几位同学代码,取长补短修改后的版本。

1 安装库文件

首先,需要安装pyinstaller,这个库文件可以将python代码打包成exe文件。

pip install pyinstaller

其次,需要安装selenium,这个库文件是连接浏览器的自动化脚本,安装对应浏览器的驱动器后,可以实现自动打开浏览器,然后完成账号登陆的功能。
我使用的是Edge浏览器,所以我直接将Edge浏览器升级到最新版本,然后安装最新版本的Edge WebDriver即可。
附上链接:Edge WebDriver 下载
在这里插入图片描述
然后,将下载好的驱动器文件移动到python.exe对应的文件下,即与python.exe处在同一个文件夹下。这里我使用的是虚拟环境,因此我将文件移动到虚拟环境的python.exe所在的文件夹下,如图所示。
在这里插入图片描述

2 编写自动化脚本文件

详细代码如下:

# 南京邮电大学移动电信校园网自动登录脚本
# created by nelson 2024.9.10
import socket

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import subprocess


# 检查网络能否链接到Internet
def isNetOK(testserver):
    s = socket.socket()
    s.settimeout(1)
    try:
        status = s.connect_ex(testserver)
        if status == 0:
            s.close()
            return True
        else:
            return False
    except Exception as e:
        return False


def isConnected():
    q = ('www.baidu.com', 443)
    return isNetOK(q)


# 检查当前连接的WiFi网络名称是否为指定的名称
def check_wifi_connected(target_network_name):
    try:
        # 运行"netsh wlan show interfaces"命令
        result = subprocess.check_output(['netsh', 'wlan', 'show', 'interfaces']).decode('mbcs')

        # 检查输出中是否存在"已连接"字样
        if "已连接" in result:
            # 截取当前连接的WiFi名称
            for line in result.split('\n'):
                if "SSID" in line and ":" in line:
                    # 提取SSID字段
                    current_network_name = line.split(":")[1].strip()
                    # 检查是否与指定的网络名称匹配
                    if current_network_name == target_network_name:
                        print(f"当前已连接至指定WiFi网络:{target_network_name}")
                        return True
                    else:
                        print(f"当前连接的WiFi不是指定网络,连接到的是:{current_network_name}")
                        return False
        else:
            print("当前未连接WiFi")
            return 2
    except subprocess.CalledProcessError as e:
        print("检查WiFi连接时出错:", e.output)
        return False

# 连接到指定的WiFi网络(需要已有配置文件)
def connect_to_wifi(network_name):
    try:
        # 运行"netsh wlan connect"命令
        result = subprocess.run(['netsh', 'wlan', 'connect', 'name={}'.format(network_name)], check=True)
        # print(f"尝试连接到 {network_name}...")
    except subprocess.CalledProcessError as e:
        print(f"连接到WiFi失败:{e}")


# 登录校园网
def login_to_website(username, password):
    # 启动Edge浏览器
    browser = webdriver.Edge()
    try:
        # 访问页面
        browser.get("https://p.njupt.edu.cn/")
        # 定位用户名输入框并输入用户名
        input_text = browser.find_element(By.XPATH, '//*[@id="edit_body"]/div[2]/div[7]/form/input[3]')
        input_text.send_keys(username)

        # 定位密码输入框并输入密码
        input_text = browser.find_element(By.XPATH, '//*[@id="edit_body"]/div[2]/div[7]/form/input[4]')
        input_text.send_keys(password)

        # 定位运营商选择框并选择电信运营商
        #select_element = browser.find_element(By.XPATH, '//*[@id="edit_body"]/div[2]/div[7]/select')
      	# select = Select(select_element)
        # select.select_by_visible_text('中国电信')
        
        # 定位登录按钮并点击
        button = browser.find_element(By.XPATH, '//*[@id="edit_body"]/div[2]/div[7]/form/input[2]')
        browser.execute_script("arguments[0].click();", button)
    except:
        print("可能已经登录或登录错误")
    finally:
        # 退出浏览器
        browser.quit()


######################################################################################
####-----------------------------在此修改你的个人信息-------------------------------####
######################################################################################
target_network_name = 'NJUPT-CHINANET'  # 请注释其中一行
account = "学号"
password = "密码"  # 智慧校园账号密码
######################################################################################
####------------------------------------------------------------------------------####
######################################################################################

def connect():
    if check_wifi_connected(target_network_name) == 2:
        # 如果没有连接到指定网络,执行这部分代码
        print(f"没有连接网络,尝试连接:{target_network_name}")
        # ... 这里加入没有连接到网络时要执行的代码 ...
        connect_to_wifi(target_network_name)
        # 调用函数执行登录动作
        login_to_website(account, password)
    else:
        login_to_website(account, password)

    result = subprocess.check_output(['netsh', 'wlan', 'show', 'interfaces']).decode('mbcs')
    # 检查输出中是否存在"已连接"字样
    if "已连接" in result:
        print(f"当前已连接WiFi网络")
    else:
        print("当前未连接WiFi")


if __name__ == '__main__':

    if not isConnected():
        connect()
    else:
        print('当前可以上网')

接着进行打包操作,在命令行输入一下内容进行打包

pyinstaller --onefile AutoConnectNJUPT-CHINANET.py

生成exe文件在dist文件夹中。
在这里插入图片描述
将此文件移动到自己想要存放的位置。

3 创建任务计划程序

通过Win键+X选择计算机管理选项。
在这里插入图片描述
在这里插入图片描述
这里我将触发器设置成电脑解锁时运行脚本。
在这里插入图片描述
在这里插入图片描述
最后点击确定。

测试

电脑解锁后,会自动运行此脚本,如果断网了会自动连接,如果没断网,则直接退出。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值