前言:博主因为觉得每次启动电脑登录校园网时都要手动输入账号、密码,点击登录,十分的麻烦,于是开发了这款程序。本程序用于自动化登录大连工业大学DPU_LianTong的校园网。本程序完全本地部署且开源至github:https://github.com/artifactcw/DPUautoConnectWIFI.git ,不用担心密码泄露问题。
目录
3.edgedriver_win64文件夹---Edge驱动器
一、开发环境
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;将快捷方式复制到该文件夹下,便可开机自启动
这样,每次打开电脑都会自动连接到校园网,从而不用手动输入。
配合自动开机的硬件,可以实现开机即联网的自动化操作,便于远程操作。