Python Selenium自动化:(大连工业大学)校园网开机自动登录

前言:博主因为觉得每次启动电脑登录校园网时都要手动输入账号、密码,点击登录,十分的麻烦,于是开发了这款程序。本程序用于自动化登录大连工业大学DPU_LianTong的校园网。本程序完全本地部署且开源至github:https://github.com/artifactcw/DPUautoConnectWIFI.git ,不用担心密码泄露问题。

目录

一、开发环境

二、项目结构

1.README.md自述文件

2.wifi.exe主程序入口

3.edgedriver_win64文件夹---Edge驱动器

4.loginSet.txt-----账号密码存储文件

三、构思介绍

四、代码讲解

1.判断WiFi连接并更改

2.selenium自动化操作

五、本地部署


 

一、开发环境

python:3.8(理论上支持win7系统)

selenium:4.7.2

webdriver:133.0.3065.92(适用于windows系统)

二、项目结构

1.README.md自述文件

2.wifi.exe主程序入口

3.edgedriver_win64文件夹---Edge驱动器

4.loginSet.txt-----账号密码存储文件

三、构思介绍

当我们想要连接到校园网时,我们会先连接到DPU_LianTong的Wifi

在这之后,会自动连接到”210.30.48.32“,进行用户验证。这时需要完成三个步骤:

1.输入用户名

2.输入密码

3.点击登录

在登陆网页,按下F12,将光标移到用户名输入框上发现:

在这个<div>下共有两个input,第一个id为usernmae_tip的控件居然是readonly,这表明它没有任何的实际作用。再看第二个id为username的input,发现,这个是可以输入的,不过display却是none。这种情况很有可能是通过js代码调控的,比如用户将鼠标焦点放在第一个input上,该input将不可见,同时将焦点转移到另一个input上。

我们点击用户名,发现:

第一个input的display变成了none,而第二个变成了block,这也证实了我的猜想。那么我们在代码操作中,应该向id=“username”的input输入,而不是username_tip。

同理,密码输入框也是这样设计的 

这样模拟用户的账号和密码输入部分的思路已经基本理清了。我们还需要看一下最后一步,点击按钮连接Login

通过观察可以发现,组成它的是一个<a> 而不是input,这也很符合点击后会跳转登陆成功网页的事实。这里需要注意的是,我们要获取的id是<a>的id,而不是<div>的id。

最后,只需要click这个控件就完成了校园网的自动登录

四、代码讲解

1.判断WiFi连接并更改

我们可以通过netsh命令查询无线网络接口的信息,从而解析出SSID

def get_current_wifi_ssid():
    """ 获取当前连接的 WiFi 名称 """
    try:
        # 使用 netsh 命令获取无线网络接口信息
        result = subprocess.run(['netsh', 'wlan', 'show', 'interfaces'], capture_output=True, text=True,
                                    encoding='utf-8')

            if result.returncode != 0:
                print("WiFi信息获取错误:", result.stderr)
                return None

            # 解析输出内容,找出 SSID
            output = result.stdout
            ssid = None
            lines = output.split('\n')
            for line in lines:
                if "SSID" in line:
                    parts = line.split(":")
                    if len(parts) > 1:
                        ssid = parts[1].strip()
                        break
            return ssid
        except Exception as e:
            print("Error occurred:", e)
            return None

当目前连接的WIFI不是DPU_LlanTong或者未连接时我们希望它能自动连接校园网

这也可以使用netsh命令来完成

    def connect_to_wifi(ssid):
        """ 连接到指定的 WiFi 网络 """
        try:
            # 使用 netsh 命令连接到指定的 WiFi
            result = subprocess.run(['netsh', 'wlan', 'connect', 'name=' + ssid], capture_output=True, text=True,
                                    encoding='utf-8')
            if result.returncode != 0:
                print("Error connecting to WiFi:", result.stderr)
            else:
                print("Connected to WiFi:", ssid)
        except Exception as e:
            print("Error occurred:", e)

有了这两个函数后,我们希望先判断当前的WFI连接状态,再进行校园网连接

target_ssid = "DPU_LianTong" 
current_ssid = get_current_wifi_ssid()
if current_ssid:
    print("当前 SSID:", current_ssid)
else:
    print("无 WiFi 连接.")

if current_ssid != target_ssid:
    print("非目标WIFI连接. Connecting...")
    connect_to_wifi(target_ssid)
else:
    print("已连接目标 WiFi"+ssid)

这样可以确保连接到校园网的wifi

2.selenium自动化操作

接下来便是要执行登录程序,这里使用selenium自动化完成浏览器操作

创建AutoEdge类,初始化service,driver。开启无头模式便于自动化,打开校园网登录地址

class AutoEgde:
    def __init__(self, url, username,pwd):
        self.edge_options = Options()
        self.edge_options.add_argument("--headless")
        self.edge_options.add_argument("--disable-gpu")
        self.edge_options.add_argument("--window-size=1920,1080")

        self.service = Service(executable_path="edgedriver_win64/msedgedriver.exe")
        self.driver = webdriver.Edge(service=self.service, options=self.edge_options)
        self.driver.get(url)
        print("成功打开网页")

模拟用户名输入 

def userNameInput(self,username):
        username_input = self.driver.find_element(By.ID, "username")
        print("已找到username输入控件")
        username_input.send_keys(username)
        print("成功输入username")

模拟密码输入 

 def pwd_tipInput(self,pwd):
        pwd_tip = self.driver.find_element(By.ID, "pwd_tip")
        print("已找到pwd_tip控件")
        actions = ActionChains(self.driver)
        actions.click(pwd_tip).perform()
        actions.send_keys(pwd).perform()
        print("成功输入pwd控件")

模拟登录按钮点击 

def loginClick(self):
        loginlink = self.driver.find_element(By.ID,"loginLink")
        loginlink.click()

有意思的是,登录按钮并不是一个简单的input控件,而是一个<a>,用于跳转登录成功的网页 

在init初始化中调用函数 

        try:
            self.userNameInput(username)
            self.pwd_tipInput(pwd)
            self.loginClick()
            print("自动登录完成")
            self.driver.close()
        except selenium.common.exceptions.NoSuchElementException:
            print("ERRO 控件不存在")
        except Exception:
            print("ERRO 未知错误")

这里写的异常处理,主要是应对于已登录网络会返回不同的网页,从而无法找到相应的控件的情况。 

最后运行

wifi = Wifi(ssid="DPU_LianTong")
edge = AutoEdge("http://210.30.48.32/","your number","your password")

成功连接的情况

无 WiFi 连接.
非目标WIFI连接. Connecting...
Connected to WiFi: DPU_LianTong
成功打开网页
已找到username输入控件
成功输入username
已找到pwd_tip控件
成功输入pwd控件
自动登录完成

已登录的情况

当前 SSID: DPU_LianTong
已连接目标 WiFiDPU_LianTong
成功打开网页
ERRO 控件不存在

五、本地部署

大家可以去我在前言中提到的github中下载压缩包,解压到任意文件夹后,

需要更改loginSet.txt文件,文件的第一行为用户名,第二行为密码

ctrl+S保存后,即可运行wifi.exe

若需要开机自启动

首先为wifi.exe创建快捷方式

再win+R,输入: shell:startup;将快捷方式复制到该文件夹下,便可开机自启动

这样,每次打开电脑都会自动连接到校园网,从而不用手动输入。

配合自动开机的硬件,可以实现开机即联网的自动化操作,便于远程操作。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值