一键上网,懒人必备
事情是这样的,由于我所在的公司如果要访问外网,需要连接公司内部wifi,并且登录上网系统,虽然只有两步操作,但是每次都需要先去电脑右下角去选择wifi,然后在浏览器里输入内网地址,然后登录,没想到这件事我干了快三年,直到今天我才幡然醒悟,一键登录不香吗?话不多说,开搞~
注:如果连接wifi不需要在浏览器中登录,只需要输入wifi密码这种方式,其实没有必要使用该程序的,感觉有点费力不讨好,但是如果大家的上网方式和我类似,就可以考虑使用该方法。
不知道大家是否了解,PC机如果此前已经连接过某个特定wifi之后,会在本地的某个配置文件中把我们连接过的wifi数据记录起来,可以通过在命令窗口中输入netsh wlan show profiles
查看连接历史,再通过netsh wlan show profiles name="WIFI名称" key=clear
就可以查到某个wifi的详细信息,其中在安全设置下的关键内容就是wifi的密码,但是会有一个问题,我要连接的wifi是企业wifi,当我通过以上操作之后可能得到的结果并没有我想要的密码,我也没有深究,希望有高手能告诉我这是为什么~在下感激不尽
有些wifi我能拿到密码,有些拿不到,事实上,既然我已经连接过wifi了,那么再次连接的时候就不需要再输入密码了。换句话说,我们在连接wifi的时候可以去取本地某个wifi的配置数据来进行连接。此时我们就可以顺利的连上wifi,然后调用浏览器,模拟用户操作输入账号密码并提交,即可开始上网了。
用到的python依赖:pywifi、sys、time、urllib、selenium
其中安装pywifi的时候还需要安装comtypes,否则会报错
代码主体:
import pywifi
from pywifi import const
import sys
import time
from urllib import request #该依赖还可以写爬虫哦~
from selenium import webdriver
from selenium.webdriver import ActionChains
connect_wifi_name = "WIFI名称" # 全局定义我将要连接的wifi
# 尝试连接wifi
def connectWifi():
wifi = pywifi.PyWiFi() # 创建一个无线对象
ifaces = wifi.interfaces() # 获取pc机的无线网卡
iface = ifaces[0] # 取第一个无限网卡
profiles = iface.network_profiles() #获取pc机此前连接过的所有wifi的配置profile
for item in profiles:
if item.ssid == connect_wifi_name: # 连接目标wifi
iface.add_network_profile(item) # 设定连接文件
iface.connect(item) # 开始连接wifi
time.sleep(3) #等待3秒钟
break #跳出循环
if iface.status() == const.IFACE_CONNECTED: #判断连接状态是否为4
print("连接已有配置成功")
if testNetwork(): #测试是否能上外网
print("开始上网吧~")
else:
print("开始准备打开浏览器")
openChrome() #调用谷歌浏览器
else:
# getWifi(iface) #该方法以后会有妙用,不过这里先注释掉
print("连接已有配置失败,开始尝试连接新的wifi")
if __name__ == "__main__":
connectWifi()
# wifi连接状态,作为参考
const.IFACE_DISCONNECTED = 0 #没有连接
const.IFACE_SCANNING = 1 #扫描中
const.IFACE_INACTIVE = 2 #没有激活
const.IFACE_CONNECTING = 3 #连接中
const.IFACE_CONNECTED = 4 #已连接
# 测试网络是否连通
testUrl = "https://www.baidu.com" #以百度为测试目标
def testNetwork():
try:
ret = request.urlopen(url=testUrl, timeout=3.0)
print("网络已连接")
except:
print("网络未连接,请进行下一步操作")
return False
return True
def openChrome():
try:
options = webdriver.ChromeOptions()
# options.add_argument('headless') # 静默模式
options.add_argument('lang=zh_CN.UTF-8')
# 打开chrome浏览器
driver = webdriver.Chrome(options=options)
driver.get("上网地址")
time.sleep(3) #等待网页加载完毕
driver.find_element_by_id('username').send_keys('账号')
driver.find_element_by_id('password1').send_keys('密码')
driver.find_element_by_id('read').click()
driver.find_element_by_xpath('//input[@id="read"]').click() # click
if driver.find_element_by_xpath('//input[@id="read"]').is_selected():
print("selected!")
else:
print("not yet!")
login_submit = driver.find_element_by_id("submit_button_1")
ActionChains(driver).move_to_element(login_submit).click(login_submit).perform()
# driver.find_element_by_id('submit_button_1').submit()
print("自动登录完毕")
except Exception as e:
print("自动操作浏览器出错")
finally:
driver.quit()
通过以上代码即可完成自动连接wifi并实现登录
补充:
要使用selenium模拟用户操作浏览器还需要下载一个驱动程序chromedriver.exe
- 淘宝下载与浏览器对应版本的chromedriver.exe
- 下载地址:[http://npm.taobao.org/mirrors...]
- 将chromedriver.exe分别放在安装chrome和python的根目录下
- 在环境变量path中加入安装chrome浏览器的路劲
参考连接:
Selenium模拟用户操作:[https://www.cnblogs.com/derek...]
关于PyWiFi模块的应用与文档总结:[https://www.wandouip.com/t5i1...]
大家是不是以为结束了~
其实并没有
这里是关于无线信号的一些知识,无线信号的强度单位是dBm,使用负数表示,越接近0信号就越好,比如A信号的强度是-40,B信号的强度是-60,那么A信号强于B信号;
dBm的值一般在-90~0之间:信号比较强的区间-50dbm~0dbm,信号比较好的区间-75~-50,信号弱的区间-75以下;
那么当我们想看看附近有哪些可用的wifi,除了通过点击系统的wifi图标去查看,还可以怎么做呢,当然是利用现有的PyWifi咯
也就是说,关于PyWiFi模块的应用还可以做更多的事情,比如
#获取附近wifi
def getWifi():
wifi = pywifi.PyWiFi() # 创建一个无线对象
ifaces = wifi.interfaces() # 获取pc机的无线网卡
iface = ifaces[0] # 取第一个无限网卡
iface.scan() # 开始扫描附近wifi
time.sleep(5) # 等待五秒
wifiList = iface.scan_results() # 获取扫描结果
if len(wifiList) == 0:
print("附近暂无可用wifi")
else:
parseList = []
for wifi in wifiList:
if wifi.signal > -90: #信号强度<-90的wifi几乎连接不上
w = {
"ssid": wifi.ssid,
"mac_address": wifi.bssid,
"signal": wifi.signal
}
parseList.append(w) # 添加WiFi名
res = filter(parseList) #过滤扫描后的wifi得到的结果
theBestWifi = getBestWifi(res) #此时我们将取出最合适我们的wifi进行连接
if theBestWifi is not None:
status = iface.status()
if status in [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]:
print('wifi尚未连接,开始尝试暴力连接')
isSuccess = tryConnect(theBestWifi) #在这里就可以做一些你们懂得的操作了,虽然我不会~但是你们可以的
if isSuccess:
print("成功连接")
elif status == const.IFACE_CONNECTED:
print('wifi已连接')
else:
print(status)
level1 = -50 # 信号强度等级一,大于-50的为信号强的wifi
level2 = -75 # 信号强度等级二,-75~-50的为信号较强的wifi
level3 = -90 # 信号强度等级三,-90~-75的为信号较弱的wifi
#过滤wifi
def filter(wifiList):
result = {
"level1":[],
"level2":[],
"level3":[],
}
for item in wifiList:
if item["signal"] > level1:
result["level1"].append(item)
elif item["signal"] > level2:
result["level2"].append(item)
elif item["signal"] > level3:
result["level3"].append(item)
#取出信号最好的wifi
def getBestWifi(res):
theBestWifi = None
for k in res.keys():
if len(res[k]) > 0:
theBestWifi = res[k][0]
return theBestWifi
#尝试连接wifi
def tryConnect(theBestWifi):
profile = pywifi.Profile() # 创建wifi连接文件
profile.ssid = theBestWifi['ssid'] # 要连接的wifi的名称
profile.auth = const.AUTH_ALG_OPEN # 网卡的开放状态 | auth - AP的认证算法
profile.akm.append(const.AKM_TYPE_WPA2PSK) #选择wifi加密方式 akm - AP的密钥管理类型
profile.cipher = const.CIPHER_TYPE_CCMP # 加密单元 /cipher - AP的密码类型
profile.key = "wifi密码" # wifi密钥,如果不知道wifi密码的话,尝试暴力破解吧~
ifaces.remove_all_network_profiles() # 删除所有连接过的wifi文件
tep_profile = ifaces.add_network_profile(profile) # 加载新的连接文件
ifaces.connect(tep_profile)
# wifi连接时间
time.sleep(2)
if ifaces.status() == const.IFACE_CONNECTED:
return True
else:
return False
完结,写到此处我已经下班15分钟了,没有摸到鱼,但是很开森~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。