建议使用以下浏览器,以获得最佳体验。 ie 9.0 以上版本 chrome 31 谷歌浏览器 firefox 30 火狐浏览器
温馨提示

抱歉,您需设置社区昵称后才能参与社区互动!

前往修改
我再想想
选择版块
主题:2366帖子:10802

【技术干货】

用python写一个脚本,自动连wifi,自动登录校园网[转载]

5 天前 231

文章目录
1.实现原理
1.1认识 url
1.2 http请求报文格式
1.3 http响应报头格式
2.具体实现
2.1 获取url
2.2 获取请求报文的报头
2.3 获取请求报文的数据
2.4 获取本机的局域网ip
3.自动连接wi-fi
4.打包成exe文件
原来在本科期间买的老华硕电脑,最近开始无缘无故的黑屏、死机,让我开始有了换电脑的念头,早都想试一试苹果的系统了,所以趁着这次618活动来临,也是狠下手笔,入手了人生第一台macbook-air。在适应了一天之后,基本上使用起来没什么障碍了,肯定还有很多功能是我没发现的,以后在慢慢探索了。期间我也遇到了一个令人烦恼的事情,就是每次连学校的校园网,都要弹窗、登录,很繁琐,就想着试试看,自己能不能也写一个脚本来实现自动连接校园网的功能。第一次搞这玩意儿,也是遇到各种问题,写帖记录一下。

1.实现原理
刚好最近学了http协议,就当是复习了。简单概括就是,通过网址找到登录界面,然后发送post请求,把登录信息提交给服务器,从而完成登录。图片来源于朋友博客的,他的更详细介绍了http协议,感兴趣可以看看。

1.1认识 url
我们所说的网址,其实就是统一资源定位符(uniform resource locator简称url),通过这个唯一的地址,可以找到对应的服务。它的标准格式如下:

协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

这个只是标准的格式,有些信息是可以省略的,比如登录信息等,还有服务器地址可以用域名地址,也可以用ip地址。带层次的文件路径其实就是你要访问的服务器资源,问号?后面是get请求的参数。http协议有多种请求方法,post和get只是其中的两种。

1.get方法主要是获取服务器的资源信息,请求的参数一般放在url?后面。
2.post方法主要是把数据提交给服务器,在报文的正文部分进行提交。

http协议本质是获得某种“资源”(视频、音频、网页、图片……),而传输则是其功能。实际上,上网的大部分行为,都在进行着进程间通信,既然是通信,就需要获取信息和发送信息,所以对应到我们生活中,大部分的上网行为无非两种:
1.把服务器上面的资源拿到本地(下载短视频、网络小说……)
2.把本地的服务器推送到服务器(搜索、登录、下单……)

1.2 http请求报文格式

首行: [方法] [url] [版本]
header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示header部分结束
body: 空行后面的内容都是body. body允许为空字符串. 如果body存在, 则在header中会有一个 content-length属性来标识body的长度;

1.3 http响应报头格式

首行: [版本号] [状态码] [状态码解释]
header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示header部分结束
body: 空行后面的内容都是body. body允许为空字符串. 如果body存在, 则在header中会有一个 content-length属性来标识body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中。

http常见header:
content-type: 数据类型(text/html等) content-length: body的长度
host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上; user-agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

2.具体实现
import requests
import socket

# 获取ip地址
def get_host_ip():
    """
    查询本机ip地址
    :return: ip
    """
    try:
        s = socket.socket(socket.af_inet, socket.sock_dgram)
        s.connect(('10.255.255.255', 1))
        ip = s.getsockname()[0]
    finally:
        s.close()
 
    return ip
user_ip = get_host_ip()

# 校园网地址,最好不要用浏览器里的url,还是建议抓包获取
post_addr = "http://10.10.244.11:801/eportal/"

#下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号
post_header = {
#报头信息,通过抓包,获取
}
 
post_data = {
 #正文数据,通过抓包获取
}
 #提交http请求报文
z = requests.post(post_addr, data=post_data, headers=post_header)

print("登录校园网成功,局域网ip如下:")
print(user_ip)
#input("")

上面是代码的主要逻辑,细节信息还需要抓包填充。一开始电脑上是没有安装requests包的,需要自己先安装一下,后面python需要导入的包都是用pip3命令安装。如果没安装pip3命令的,请自行安装。

pip3 install requests
1
2.1 获取url
在谷歌浏览器先打开上网登录窗口,然后按f12键进入开发者模式,勾选保留日志,输入账号密码,进行登录,在网络那里获取登录时的http请求报文。

然后查看抓到的包,查看第一个即可,一般是第一个,如果不放心可以点进区查看,看到标头里的请求方法,确保是post。然后里面还有一个请求网址,就是url了。只需要复制?问号前面的内容即可,后面的是一些get方法的请求参数,不明白什么意思的看长文url的解释。往下拉,还有响应标头,请求标头等信息,⚠️注意,因为我们要向服务器请求登录,所以我们需要的是请求标头,而不是响应,别搞错了。

# 校园网地址,最好不要用浏览器里的url,还是建议抓包获取
post_addr = "http://10.10.244.11:801/eportal/"

这样就完成了第一步,获取到了校园网地址。为什么说不建议直接从浏览器里面复制呢,比如我们学校这种情况返回的响应是3xx,说明网址被重定向过了,所以抓包到的地址比较准确一些。

2.2 获取请求报文的报头



把请求标头里的内容填充到代码块里,部分header的含义上文已经解释过,还想了解更多请自行搜索。填充的格式是键值 key:values模式,key和values都是字符串需要加引号,上下键值用逗号隔开,下面是我自己的报文,只是个例子。

#下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号
post_header = {
    'accept': '*/*',
    'accept-encoding': 'gzip, deflate',
    'accept-language': 'zh-cn,zh;q=0.9',
    'cache-control': 'max-age=0',
    'connection': 'keep-alive',
    'host': '10.10.244.11',
    'referer': 'http://10.10.244.11/',
    'upgrade-insecure-requests': '1',
    'user-agent': 'mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/537.36 (khtml, like gecko) chrome/101.0.4951.64 safari/537.36',
}

2.3 获取请求报文的数据

把载荷里的查询字符串、表单数据都填充到程序块中,这里主要上传的就是你的登录信息,不要填错了。

post_data = {
    'c': 'acsetting',
    'a': 'login',
    'ddddd': 'xxxx',
    'upass': 'xxxxx',
    'protocol': 'http:',
    'hostname': '10.10.244.11',
    'itermtype': '1',
    'wlanuserip': user_ip,
    'wlanacip': 'xxxxxx',
    'wlanacname': 'spl-bras-sr8806-x',
    'mac': '00-00-00-00-00-00',
    'ip': user_ip,
    'enadvert': '0',
    'queryacip': '0',
    'loginmethod': '1'
}

2.4 获取本机的局域网ip
为什么要单独写一个函数获取主机ip呢,因为ip地址分为固定ip地址和动态ip地址,我们需要获取的是动态的ip地址,它是一直变化的,不能直接在请求数据里填抓包拿到的地址,不然你换个地方,可能那个地址就失效了。

固定ip:固定ip地址是长期固定分配给一台计算机使用的ip地址,一般是特殊的服务器才拥有固定ip地址。
动态ip:因为ip地址资源非常短缺,通过电话拨号上网或普通宽带上网用户一般不具备固定ip地址,而是由isp动态分配暂时的一个ip地址,这些都是计算机系统自动完成的。

# 获取ip地址
#需要导入socket包,系统应该自带
def get_host_ip():
    """
    查询本机ip地址
    :return: ip
    """
    try:
        s = socket.socket(socket.af_inet, socket.sock_dgram)
        s.connect(('10.255.255.255', 1))
        ip = s.getsockname()[0]
    finally:
        s.close()
 
    return ip
user_ip = get_host_ip()

写到这里其实,已经可以自动连接校园网了,但是前提是你先打开wi-fi,连到学校的校园网wi-fi。说到底,现在的功能只能帮助你登录校园网,连接校园网wi-fi的事情还是得你来做,如果你之前连的是其他网络,那么你还有进行网络的切换。所以还要再增加一个自动连接wi-fi的功能,刚好python里有一个pywifi包可以支持这个功能。但是!!直接pip3 安装的pywifi包里面不支持mac os的wi-fi控制,因为开发这个pywifi包的作者不用mac os系统,所以pywifi包只支持windows和linux。好在,后来有人提出这个问题,作者后来又写了一个适合mac os的包,不过需要自己下载。我也是经历很多波折,才解决了这个问题。

3.自动连接wi-fi
还是先在终端安装pywifi包,然后找到pywifi包对应位置,把内容全部替换成支持moc os 的pywifi包。

pip3 install pywifi
1
如果找不到pywifi路径可以先执行卸载命令,然后就会弹出所以安装过的包路径了,然后复制所需的路径,最好选择n命令,停止卸载就行。

得到安装路径以后,可以在终端里查看,也可以在mac可视化文件模式里查看,我更喜欢可视化,打开的时候有的文件夹就翻译成中文了,我相信只要用心肯定能找到。

找到pywifi路径之后,就要下载支持mac os的pywifi包了,下载完进行替换就行。那这个支持mac os的pywifi在哪呢?这里给出作者github的地址,作者awkman在issue24里面也回答了,他写了一个兼容macos的demo程序。

moc版pywifi
作者回复

可以在终端用git命令下载,也可以,直接到作者仓库取自己下载,大家随意。git命令下载指令如下:-b 后面带的是分支,作者放在macos_dev里了。

git clone -b macos_dev https://github.com/awkman/pywifi.git
1

下载完检查一下是不是包含了mac的.py文件,包含了就没问题。然后把包含了mac的这个pywifi文件和之前的pywifi进行替换就行。先cd到当前文件夹,然后cp拷贝到原来路径(怎么找路径前文已经说了),文件名相同会自动替换里面内容。

cd pywifi
cp -r pywifi /users/wenanqin/library/python/3.8/lib/python/site-packages
1
2
之前我在这样做完,运行还是报错,因为发现_wifiutil_macos.py里有一个包没安装,装完就好了。

pip3 install pyobjc
1

下面开始完成连接wifi功能的代码,在统一路径下,新建一个wifi.py文件。

import pywifi
import time
#保存包中写义的常量
from pywifi import const

def wifi_connect_status():
    """
    判断本机是否有无线网卡,以及连接状态
    :return: 已连接或存在无线网卡返回1,否则返回0
    """
    #创建一个元线对象
    wifi = pywifi.pywifi()

    #取当前机器,第一个元线网卡
    iface = wifi.interfaces()[0] #有可能有多个无线网卡,所以要指定
   

    #判断是否连接成功
    if iface.status() in [const.iface_connected,const.iface_inactive]:
        #print('wifi已经连接了网络')
        return 1
    else:
        print("兄弟,我没设置自动打开wi-fi功能,你先打开wifi再试?")
    return 0

def scan_wifi():
    """
    扫描附件wifi
    :return: 扫描结果对象
    """
    #扫描附件wifi
    wifi = pywifi.pywifi()
    iface = wifi.interfaces()[0]

    iface.scan() #扫描附件wifi
    time.sleep(1)
    basewifi = iface.scan_results()
    # for i in basewifi:
    #     print('wifi扫描结果:{}'.format(i.ssid)) # ssid 为wifi名称
    #     print('wifi设备mac地址:{}'.format(i.bssid))
    return basewifi

def connect_wifi():
    wifi = pywifi.pywifi()  # 创建一个wifi对象
    ifaces = wifi.interfaces()[0]  # 取第一个无限网卡
    #print("本机无线网卡名称:")
    #print(ifaces.name())  # 输出无线网卡名称
    ifaces.disconnect()  # 断开网卡连接
    time.sleep(3)  # 缓冲3秒


    profile = pywifi.profile()  # 配置文件
    profile.ssid = "njupt-cmcc"  # wifi名称
    #连校园网不需要密码登录,另有登录模块
    # profile.auth = const.auth_alg_open  # 需要密码
    # profile.akm.append(const.akm_type_wpa2psk)  # 加密类型
    # profile.cipher = const.cipher_type_ccmp  # 加密单元
    # profile.key = '4000103000' #wifi密码

    ifaces.remove_all_network_profiles()  # 删除其他配置文件
    tmp_profile = ifaces.add_network_profile(profile)  # 加载配置文件

    ifaces.connect(tmp_profile)  # 连接
    time.sleep(1)  # 尝试10秒能否成功连接
    isok = true
    if ifaces.status() == const.iface_connected:
        print("连接校园网成功")
    else:
        print("连接校园网失败")
    #ifaces.disconnect()  # 断开连接
    time.sleep(1)
    return isok这里有三个功能,前两个测试用的,实际可以只调用第三个。link.py登录校园网之前先调用连接wifi模块。

import requests
import socket
#导入刚才写的wifi模块,一定放在同一文件夹内
import wifi

#查看wifi状态
wifi.wifi_connect_status()
#连接wifi
wifi.connect_wifi()

# 获取ip地址
def get_host_ip():
    """
    查询本机ip地址
    :return: ip
    """
    try:
        s = socket.socket(socket.af_inet, socket.sock_dgram)
        s.connect(('10.255.255.255', 1))
        ip = s.getsockname()[0]
    finally:
        s.close()
 
    return ip
user_ip = get_host_ip()# 校园网地址
post_addr = "http://10.10.244.11:801/eportal/"

#下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号
post_header = {
    'accept': '*/*',
    'accept-encoding': 'gzip, deflate',
    'accept-language': 'zh-cn,zh;q=0.9',
    'cache-control': 'max-age=0',
    'connection': 'keep-alive',
    'host': '10.10.244.11',
    'referer': 'http://10.10.244.11/',
    'upgrade-insecure-requests': '1',
    'user-agent': 'mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/537.36 (khtml, like gecko) chrome/101.0.4951.64 safari/537.36',
}
 
post_data = {
    'c': 'acsetting',
    'a': 'login',
    'ddddd': ',0,xxxxxxx@cmcc',
    'upass': 'xxxxx',
    'protocol': 'http:',
    'hostname': '10.10.244.11',
    'itermtype': '1',
    'wlanuserip': user_ip,
    'wlanacip': 'xxxxxxx',
    'wlanacname': 'spl-bras-sr8806-x',
    'mac': '00-00-00-00-00-00',
    'ip': user_ip,
    'enadvert': '0',
    'queryacip': '0',
    'loginmethod': '1'
}
z = requests.post(post_addr, data=post_data, headers=post_header)
#如果不想每次都手动关闭窗口可以删除下面的input,然后将print里的内容改成自己想要的
print("登录校园网成功,局域网ip如下:")
print(user_ip)
#input("")

4.打包成exe文件
1.先安装pyinstaller包

pip3 install pyinstaller
1
2.找到pyinstaller命令路径(带bin,老方法卸载看路径),我直接执行不了pyinstaller指令,因为python系统就有,环境变量还没配置。

3.执行指令打包

先cd到需要打包文件的路径下,然后执行指令,我安装了一个超级右键程序,很方便操作

#将 xx.py 打包为 xx.exe

/users/wenanqin/library/python/3.8/bin/pyinstaller -f xx.py
1

执行完操作,会生成三个文件,exe文件在dist文件内,至此,全部工作完成。

执行程序,效果如上。

如果想实现开盖自连,可看macbook利用sleepwatcher实现开盖自动联网。

原文链接:https://blog.csdn.net/weixin_42907822/article/details/125105976

回复1

0 0
2022/6/19 09:15

感谢分享

上划加载中
直达楼层
全部回复
正序浏览
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 亚博平台下载的解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

用python写一个脚本,自动连wifi,自动登录校园网[转载]-yb体育官方

您已采纳当前回复为最佳回复

仙女本仙

发帖: 81粉丝: 2

发表于2022年06月17日 10:52:59 231 1
[技术干货] 用python写一个脚本,自动连wifi,自动登录校园网[转载]

文章目录
1.实现原理
1.1认识 url
1.2 http请求报文格式
1.3 http响应报头格式
2.具体实现
2.1 获取url
2.2 获取请求报文的报头
2.3 获取请求报文的数据
2.4 获取本机的局域网ip
3.自动连接wi-fi
4.打包成exe文件
原来在本科期间买的老华硕电脑,最近开始无缘无故的黑屏、死机,让我开始有了换电脑的念头,早都想试一试苹果的系统了,所以趁着这次618活动来临,也是狠下手笔,入手了人生第一台macbook-air。在适应了一天之后,基本上使用起来没什么障碍了,肯定还有很多功能是我没发现的,以后在慢慢探索了。期间我也遇到了一个令人烦恼的事情,就是每次连学校的校园网,都要弹窗、登录,很繁琐,就想着试试看,自己能不能也写一个脚本来实现自动连接校园网的功能。第一次搞这玩意儿,也是遇到各种问题,写帖记录一下。

1.实现原理
刚好最近学了http协议,就当是复习了。简单概括就是,通过网址找到登录界面,然后发送post请求,把登录信息提交给服务器,从而完成登录。图片来源于朋友博客的,他的更详细介绍了http协议,感兴趣可以看看。

1.1认识 url
我们所说的网址,其实就是统一资源定位符(uniform resource locator简称url),通过这个唯一的地址,可以找到对应的服务。它的标准格式如下:

协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

这个只是标准的格式,有些信息是可以省略的,比如登录信息等,还有服务器地址可以用域名地址,也可以用ip地址。带层次的文件路径其实就是你要访问的服务器资源,问号?后面是get请求的参数。http协议有多种请求方法,post和get只是其中的两种。

1.get方法主要是获取服务器的资源信息,请求的参数一般放在url?后面。
2.post方法主要是把数据提交给服务器,在报文的正文部分进行提交。

http协议本质是获得某种“资源”(视频、音频、网页、图片……),而传输则是其功能。实际上,上网的大部分行为,都在进行着进程间通信,既然是通信,就需要获取信息和发送信息,所以对应到我们生活中,大部分的上网行为无非两种:
1.把服务器上面的资源拿到本地(下载短视频、网络小说……)
2.把本地的服务器推送到服务器(搜索、登录、下单……)

1.2 http请求报文格式

首行: [方法] [url] [版本]
header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示header部分结束
body: 空行后面的内容都是body. body允许为空字符串. 如果body存在, 则在header中会有一个 content-length属性来标识body的长度;

1.3 http响应报头格式

首行: [版本号] [状态码] [状态码解释]
header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示header部分结束
body: 空行后面的内容都是body. body允许为空字符串. 如果body存在, 则在header中会有一个 content-length属性来标识body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中。

http常见header:
content-type: 数据类型(text/html等) content-length: body的长度
host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上; user-agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

2.具体实现
import requests
import socket

# 获取ip地址
def get_host_ip():
    """
    查询本机ip地址
    :return: ip
    """
    try:
        s = socket.socket(socket.af_inet, socket.sock_dgram)
        s.connect(('10.255.255.255', 1))
        ip = s.getsockname()[0]
    finally:
        s.close()
 
    return ip
user_ip = get_host_ip()

# 校园网地址,最好不要用浏览器里的url,还是建议抓包获取
post_addr = "http://10.10.244.11:801/eportal/"

#下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号
post_header = {
#报头信息,通过抓包,获取
}
 
post_data = {
 #正文数据,通过抓包获取
}
 #提交http请求报文
z = requests.post(post_addr, data=post_data, headers=post_header)

print("登录校园网成功,局域网ip如下:")
print(user_ip)
#input("")

上面是代码的主要逻辑,细节信息还需要抓包填充。一开始电脑上是没有安装requests包的,需要自己先安装一下,后面python需要导入的包都是用pip3命令安装。如果没安装pip3命令的,请自行安装。

pip3 install requests
1
2.1 获取url
在谷歌浏览器先打开上网登录窗口,然后按f12键进入开发者模式,勾选保留日志,输入账号密码,进行登录,在网络那里获取登录时的http请求报文。

然后查看抓到的包,查看第一个即可,一般是第一个,如果不放心可以点进区查看,看到标头里的请求方法,确保是post。然后里面还有一个请求网址,就是url了。只需要复制?问号前面的内容即可,后面的是一些get方法的请求参数,不明白什么意思的看长文url的解释。往下拉,还有响应标头,请求标头等信息,⚠️注意,因为我们要向服务器请求登录,所以我们需要的是请求标头,而不是响应,别搞错了。

# 校园网地址,最好不要用浏览器里的url,还是建议抓包获取
post_addr = "http://10.10.244.11:801/eportal/"

这样就完成了第一步,获取到了校园网地址。为什么说不建议直接从浏览器里面复制呢,比如我们学校这种情况返回的响应是3xx,说明网址被重定向过了,所以抓包到的地址比较准确一些。

2.2 获取请求报文的报头



把请求标头里的内容填充到代码块里,部分header的含义上文已经解释过,还想了解更多请自行搜索。填充的格式是键值 key:values模式,key和values都是字符串需要加引号,上下键值用逗号隔开,下面是我自己的报文,只是个例子。

#下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号
post_header = {
    'accept': '*/*',
    'accept-encoding': 'gzip, deflate',
    'accept-language': 'zh-cn,zh;q=0.9',
    'cache-control': 'max-age=0',
    'connection': 'keep-alive',
    'host': '10.10.244.11',
    'referer': 'http://10.10.244.11/',
    'upgrade-insecure-requests': '1',
    'user-agent': 'mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/537.36 (khtml, like gecko) chrome/101.0.4951.64 safari/537.36',
}

2.3 获取请求报文的数据

把载荷里的查询字符串、表单数据都填充到程序块中,这里主要上传的就是你的登录信息,不要填错了。

post_data = {
    'c': 'acsetting',
    'a': 'login',
    'ddddd': 'xxxx',
    'upass': 'xxxxx',
    'protocol': 'http:',
    'hostname': '10.10.244.11',
    'itermtype': '1',
    'wlanuserip': user_ip,
    'wlanacip': 'xxxxxx',
    'wlanacname': 'spl-bras-sr8806-x',
    'mac': '00-00-00-00-00-00',
    'ip': user_ip,
    'enadvert': '0',
    'queryacip': '0',
    'loginmethod': '1'
}

2.4 获取本机的局域网ip
为什么要单独写一个函数获取主机ip呢,因为ip地址分为固定ip地址和动态ip地址,我们需要获取的是动态的ip地址,它是一直变化的,不能直接在请求数据里填抓包拿到的地址,不然你换个地方,可能那个地址就失效了。

固定ip:固定ip地址是长期固定分配给一台计算机使用的ip地址,一般是特殊的服务器才拥有固定ip地址。
动态ip:因为ip地址资源非常短缺,通过电话拨号上网或普通宽带上网用户一般不具备固定ip地址,而是由isp动态分配暂时的一个ip地址,这些都是计算机系统自动完成的。

# 获取ip地址
#需要导入socket包,系统应该自带
def get_host_ip():
    """
    查询本机ip地址
    :return: ip
    """
    try:
        s = socket.socket(socket.af_inet, socket.sock_dgram)
        s.connect(('10.255.255.255', 1))
        ip = s.getsockname()[0]
    finally:
        s.close()
 
    return ip
user_ip = get_host_ip()

写到这里其实,已经可以自动连接校园网了,但是前提是你先打开wi-fi,连到学校的校园网wi-fi。说到底,现在的功能只能帮助你登录校园网,连接校园网wi-fi的事情还是得你来做,如果你之前连的是其他网络,那么你还有进行网络的切换。所以还要再增加一个自动连接wi-fi的功能,刚好python里有一个pywifi包可以支持这个功能。但是!!直接pip3 安装的pywifi包里面不支持mac os的wi-fi控制,因为开发这个pywifi包的作者不用mac os系统,所以pywifi包只支持windows和linux。好在,后来有人提出这个问题,作者后来又写了一个适合mac os的包,不过需要自己下载。我也是经历很多波折,才解决了这个问题。

3.自动连接wi-fi
还是先在终端安装pywifi包,然后找到pywifi包对应位置,把内容全部替换成支持moc os 的pywifi包。

pip3 install pywifi
1
如果找不到pywifi路径可以先执行卸载命令,然后就会弹出所以安装过的包路径了,然后复制所需的路径,最好选择n命令,停止卸载就行。

得到安装路径以后,可以在终端里查看,也可以在mac可视化文件模式里查看,我更喜欢可视化,打开的时候有的文件夹就翻译成中文了,我相信只要用心肯定能找到。

找到pywifi路径之后,就要下载支持mac os的pywifi包了,下载完进行替换就行。那这个支持mac os的pywifi在哪呢?这里给出作者github的地址,作者awkman在issue24里面也回答了,他写了一个兼容macos的demo程序。

moc版pywifi
作者回复

可以在终端用git命令下载,也可以,直接到作者仓库取自己下载,大家随意。git命令下载指令如下:-b 后面带的是分支,作者放在macos_dev里了。

git clone -b macos_dev https://github.com/awkman/pywifi.git
1

下载完检查一下是不是包含了mac的.py文件,包含了就没问题。然后把包含了mac的这个pywifi文件和之前的pywifi进行替换就行。先cd到当前文件夹,然后cp拷贝到原来路径(怎么找路径前文已经说了),文件名相同会自动替换里面内容。

cd pywifi
cp -r pywifi /users/wenanqin/library/python/3.8/lib/python/site-packages
1
2
之前我在这样做完,运行还是报错,因为发现_wifiutil_macos.py里有一个包没安装,装完就好了。

pip3 install pyobjc
1

下面开始完成连接wifi功能的代码,在统一路径下,新建一个wifi.py文件。

import pywifi
import time
#保存包中写义的常量
from pywifi import const

def wifi_connect_status():
    """
    判断本机是否有无线网卡,以及连接状态
    :return: 已连接或存在无线网卡返回1,否则返回0
    """
    #创建一个元线对象
    wifi = pywifi.pywifi()

    #取当前机器,第一个元线网卡
    iface = wifi.interfaces()[0] #有可能有多个无线网卡,所以要指定
   

    #判断是否连接成功
    if iface.status() in [const.iface_connected,const.iface_inactive]:
        #print('wifi已经连接了网络')
        return 1
    else:
        print("兄弟,我没设置自动打开wi-fi功能,你先打开wifi再试?")
    return 0

def scan_wifi():
    """
    扫描附件wifi
    :return: 扫描结果对象
    """
    #扫描附件wifi
    wifi = pywifi.pywifi()
    iface = wifi.interfaces()[0]

    iface.scan() #扫描附件wifi
    time.sleep(1)
    basewifi = iface.scan_results()
    # for i in basewifi:
    #     print('wifi扫描结果:{}'.format(i.ssid)) # ssid 为wifi名称
    #     print('wifi设备mac地址:{}'.format(i.bssid))
    return basewifi

def connect_wifi():
    wifi = pywifi.pywifi()  # 创建一个wifi对象
    ifaces = wifi.interfaces()[0]  # 取第一个无限网卡
    #print("本机无线网卡名称:")
    #print(ifaces.name())  # 输出无线网卡名称
    ifaces.disconnect()  # 断开网卡连接
    time.sleep(3)  # 缓冲3秒


    profile = pywifi.profile()  # 配置文件
    profile.ssid = "njupt-cmcc"  # wifi名称
    #连校园网不需要密码登录,另有登录模块
    # profile.auth = const.auth_alg_open  # 需要密码
    # profile.akm.append(const.akm_type_wpa2psk)  # 加密类型
    # profile.cipher = const.cipher_type_ccmp  # 加密单元
    # profile.key = '4000103000' #wifi密码

    ifaces.remove_all_network_profiles()  # 删除其他配置文件
    tmp_profile = ifaces.add_network_profile(profile)  # 加载配置文件

    ifaces.connect(tmp_profile)  # 连接
    time.sleep(1)  # 尝试10秒能否成功连接
    isok = true
    if ifaces.status() == const.iface_connected:
        print("连接校园网成功")
    else:
        print("连接校园网失败")
    #ifaces.disconnect()  # 断开连接
    time.sleep(1)
    return isok这里有三个功能,前两个测试用的,实际可以只调用第三个。link.py登录校园网之前先调用连接wifi模块。

import requests
import socket
#导入刚才写的wifi模块,一定放在同一文件夹内
import wifi

#查看wifi状态
wifi.wifi_connect_status()
#连接wifi
wifi.connect_wifi()

# 获取ip地址
def get_host_ip():
    """
    查询本机ip地址
    :return: ip
    """
    try:
        s = socket.socket(socket.af_inet, socket.sock_dgram)
        s.connect(('10.255.255.255', 1))
        ip = s.getsockname()[0]
    finally:
        s.close()
 
    return ip
user_ip = get_host_ip()# 校园网地址
post_addr = "http://10.10.244.11:801/eportal/"

#下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号
post_header = {
    'accept': '*/*',
    'accept-encoding': 'gzip, deflate',
    'accept-language': 'zh-cn,zh;q=0.9',
    'cache-control': 'max-age=0',
    'connection': 'keep-alive',
    'host': '10.10.244.11',
    'referer': 'http://10.10.244.11/',
    'upgrade-insecure-requests': '1',
    'user-agent': 'mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/537.36 (khtml, like gecko) chrome/101.0.4951.64 safari/537.36',
}
 
post_data = {
    'c': 'acsetting',
    'a': 'login',
    'ddddd': ',0,xxxxxxx@cmcc',
    'upass': 'xxxxx',
    'protocol': 'http:',
    'hostname': '10.10.244.11',
    'itermtype': '1',
    'wlanuserip': user_ip,
    'wlanacip': 'xxxxxxx',
    'wlanacname': 'spl-bras-sr8806-x',
    'mac': '00-00-00-00-00-00',
    'ip': user_ip,
    'enadvert': '0',
    'queryacip': '0',
    'loginmethod': '1'
}
z = requests.post(post_addr, data=post_data, headers=post_header)
#如果不想每次都手动关闭窗口可以删除下面的input,然后将print里的内容改成自己想要的
print("登录校园网成功,局域网ip如下:")
print(user_ip)
#input("")

4.打包成exe文件
1.先安装pyinstaller包

pip3 install pyinstaller
1
2.找到pyinstaller命令路径(带bin,老方法卸载看路径),我直接执行不了pyinstaller指令,因为python系统就有,环境变量还没配置。

3.执行指令打包

先cd到需要打包文件的路径下,然后执行指令,我安装了一个超级右键程序,很方便操作

#将 xx.py 打包为 xx.exe

/users/wenanqin/library/python/3.8/bin/pyinstaller -f xx.py
1

执行完操作,会生成三个文件,exe文件在dist文件内,至此,全部工作完成。

执行程序,效果如上。

如果想实现开盖自连,可看macbook利用sleepwatcher实现开盖自动联网。

原文链接:https://blog.csdn.net/weixin_42907822/article/details/125105976

分享文章到朋友圈

分享文章到微博
您已采纳当前回复为最佳回复

发帖: 752粉丝: 61

发表于2022年06月19日 09:15:10

感谢分享

您需要登录后才可以回帖 | 立即注册

推荐阅读

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200
网站地图