1

一键上网,懒人必备

事情是这样的,由于我所在的公司如果要访问外网,需要连接公司内部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

  1. 淘宝下载与浏览器对应版本的chromedriver.exe
  2. 下载地址:[http://npm.taobao.org/mirrors...]
  3. 将chromedriver.exe分别放在安装chrome和python的根目录下
  4. 在环境变量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分钟了,没有摸到鱼,但是很开森~


lyyyyb
1 声望1 粉丝