网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

来源:网络

1.实现原理

刚好最近学了http协议,就当是复习了。

简单概括就是,通过网址找到登录界面,然后发送post请求,把登录信息提交给服务器,从而完成登录。

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 requestsimport 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 ipuser_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

2.1 获取url

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

然后查看抓到的包,查看第一个即可,一般是第一个,如果不放心可以点进区查看,看到标头里的请求方法,确保是post。然后里面还有一个请求网址,就是url了。只需要复制?问号前面的内容即可,后面的是一些get方法的请求参数,不明白什么意思的看长文url的解释。

往下拉,还有响应标头,请求标头等信息,:warning:注意,因为我们要向服务器请求登录,所以我们需要的是请求标头,而不是响应,别搞错了。

# 校园网地址,最好不要用浏览器里的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 ipuser_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

如果找不到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

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


cd pywificp -r pywifi /Users/wenanqin/Library/Python/3.8/lib/python/site-packages

之前我在这样做完,运行还是报错,因为发现_wifiutil_macos.py里有一个包没安装,装完就好了。


pip3 install pyobjc

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


import pywifiimport time#保存包中写义的常量from pywifi import constdef 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 1else:print("兄弟,我没设置自动打开Wi-Fi功能,你先打开wifi再试?") return 0def scan_wifi():"""扫描附件wifi:return: 扫描结果对象"""#扫描附件wifiwifi = pywifi.PyWiFi()iface = wifi.interfaces()[0]

iface.scan() #扫描附件wifitime.sleep(1)basewifi = iface.scan_results() # for i in basewifi:# print('wifi扫描结果:{}'.format(i.ssid)) # ssid 为wifi名称# print('wifi设备MAC地址:{}'.format(i.bssid))return basewifidef 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 = Trueif ifaces.status() == const.IFACE_CONNECTED:print("连接校园网成功") else:print("连接校园网失败") #ifaces.disconnect() # 断开连接time.sleep(1) return isok

这里有三个功能,前两个测试用的,实际可以只调用第三个。link.py登录校园网之前先调用连接wifi模块。


import requestsimport socket#导入刚才写的wifi模块,一定放在同一文件夹内import wifi#查看wifi状态wifi.wifi_connect_status()#连接wifiwifi.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 ipuser_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

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

3.执行指令打包

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

#将 xx.py 打包为 xx.exe


/Users/wenanqin/Library/Python/3.8/bin/pyinstaller -F xx.py

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

执行程序,效果如上。

推荐阅读 点击标题可跳转









特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
网传重庆一银行副行长将暧昧视频误发到工作群,女主老公就在群里

网传重庆一银行副行长将暧昧视频误发到工作群,女主老公就在群里

兵叔评说
2024-06-13 22:11:29
布局“长远”? 美国把欧洲往火坑里推

布局“长远”? 美国把欧洲往火坑里推

环球网资讯
2024-06-13 21:00:28
马斯克与多名女下属发生性关系?还要给他生娃?这在美国真不算啥

马斯克与多名女下属发生性关系?还要给他生娃?这在美国真不算啥

不掉线电波
2024-06-13 10:19:02
著名女优玩偶姐姐HongKongDoll,被爆料真实面目?

著名女优玩偶姐姐HongKongDoll,被爆料真实面目?

吃瓜党二号头目
2024-06-13 10:15:52
日本官方最新数据:人均海鲜年消费量暴跌50%!只因核污水排海?

日本官方最新数据:人均海鲜年消费量暴跌50%!只因核污水排海?

不掉线电波
2024-06-13 23:16:14
深圳一家五口喝汤中毒,2人进ICU!

深圳一家五口喝汤中毒,2人进ICU!

南方都市报
2024-06-13 20:45:08
喜讯!荷兰女排输球 中国女排锁定巴黎奥运会资格

喜讯!荷兰女排输球 中国女排锁定巴黎奥运会资格

新民晚报
2024-06-13 17:11:19
国足刚晋级18强赛,亚足联就送来大礼,有望直接让中国队进世界杯

国足刚晋级18强赛,亚足联就送来大礼,有望直接让中国队进世界杯

罗掌柜体育
2024-06-13 17:25:23
问界M9翻滚下山崖全景图曝光之后,网友们对山崖又有了新的认识

问界M9翻滚下山崖全景图曝光之后,网友们对山崖又有了新的认识

映射生活的身影
2024-06-13 18:26:51
犯满离场!东契奇吐槽:在总决赛吹了我6次犯规 有这样的吗?

犯满离场!东契奇吐槽:在总决赛吹了我6次犯规 有这样的吗?

直播吧
2024-06-13 11:34:18
中国发出警告:90天内不支付358亿赔偿金,18艘军舰就别想要了

中国发出警告:90天内不支付358亿赔偿金,18艘军舰就别想要了

星辰故事屋
2024-06-09 17:09:59
中国行!桑尼赛后首发声:下个月被邀请来中国,会尽快建国内社媒

中国行!桑尼赛后首发声:下个月被邀请来中国,会尽快建国内社媒

直播吧
2024-06-13 17:05:20
森林北深夜发文:已报案,她和汪峰的感情遭受巨大压力

森林北深夜发文:已报案,她和汪峰的感情遭受巨大压力

素素娱乐
2024-06-13 08:52:58
瓦屋山被砸身亡游客:女大学生,长得漂亮身材好,父亲有心脏病

瓦屋山被砸身亡游客:女大学生,长得漂亮身材好,父亲有心脏病

林大师热点
2024-06-13 10:59:30
刚刚,大爆冷!17岁中专女生闯进全球数学竞赛12强,学服装设计的她怎么做到的?

刚刚,大爆冷!17岁中专女生闯进全球数学竞赛12强,学服装设计的她怎么做到的?

都市快报橙柿互动
2024-06-13 14:57:11
2011年妻子和情夫通奸时,丈夫也要来,妻子说住不下了被丈夫杀死

2011年妻子和情夫通奸时,丈夫也要来,妻子说住不下了被丈夫杀死

汉史趣闻
2024-06-12 07:29:30
广东知名村,一村民小组组长被查!

广东知名村,一村民小组组长被查!

鲁中晨报
2024-06-13 18:31:03
后续!女孩瓦屋山飞石砸亡:身份被曝光,家境太凄惨,目击者发声

后续!女孩瓦屋山飞石砸亡:身份被曝光,家境太凄惨,目击者发声

影像温度
2024-06-13 17:26:28
塔图姆:从去年来看0-3落后要翻也不太难 我们当时差点就做到了

塔图姆:从去年来看0-3落后要翻也不太难 我们当时差点就做到了

直播吧
2024-06-13 16:01:06
王思聪黄一鸣牵手照曝光,黄一鸣挺着大孕肚,挑选母婴用品!

王思聪黄一鸣牵手照曝光,黄一鸣挺着大孕肚,挑选母婴用品!

柠檬有娱乐
2024-06-13 11:20:07
2024-06-14 00:04:49
Python小二
Python小二
人生苦短,我用Python!
387文章数 1899关注度
往期回顾 全部

科技要闻

小红书员工仅1/5工龄满2年 32岁就不让进了

头条要闻

韩国女子20年前遭"集体性侵" 44名嫌犯无一人受到刑罚

头条要闻

韩国女子20年前遭"集体性侵" 44名嫌犯无一人受到刑罚

体育要闻

乔丹最想单挑的男人走了

娱乐要闻

森林北报案,称和汪峰的感情遭受压力

财经要闻

私募大佬孙强:中国为什么缺少耐心资本

汽车要闻

升级8155芯片 新款卡罗拉锐放售12.98-18.48万

态度原创

艺术
本地
房产
时尚
教育

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

房产要闻

再度告急!海口连续仨月住宅入市不足千套!竟有楼盘卖爆!

受法律保护的可颂,究竟有多好吃!?

教育要闻

本科生收入揭秘:月薪六千成常态,高薪专业竟是这些!

无障碍浏览 进入关怀版