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

admin 2023年3月30日11:17:42评论22 views字数 8934阅读29分46秒阅读模式

原来在本科期间买的老华硕电脑,最近开始无缘无故的黑屏、死机,让我开始有了换电脑的念头,早都想试一试苹果的系统了,所以趁着这次 618 活动来临,也是狠下手笔,入手了人生第一台 MacBook-Air。在适应了一天之后,基本上使用起来没什么障碍了,肯定还有很多功能是我没发现的,以后在慢慢探索了。期间我也遇到了一个令人烦恼的事情,就是每次连学校的校园网,都要弹窗、登录,很繁琐,就想着试试看,自己能不能也写一个脚本来实现自动连接校园网的功能。第一次搞这玩意儿,也是遇到各种问题,写帖记录一下。

1.实现原理

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

1.1 认识 URL

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

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


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


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

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

http 协议本质是获得某种 “资源”(视频、音频、网页、图片……),而传输则是其功能。实际上,上网的大部分行为,都在进行着进程间通信,既然是通信,就需要获取信息和发送信息,所以对应到我们生活中,大部分的上网行为无非两种:


    1. 把服务器上面的资源拿到本地(下载短视频、网络小说……)

    1. 把本地的服务器推送到服务器(搜索、登录、下单……)

1.2 http 请求报文格式


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


**首行: [方法] +

+ [版本] **

  • Header: 请求的属性, 冒号分割的键值对; 每组属性之间使用 n 分隔; 遇到空行表示 Header 部分结束
  • Body: 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在, 则在 Header 中会有一个 Content-- Length 属性来标识 Body 的长度;

1.3 http 响应报头格式


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


**首行: [版本号] + [状态码] + [状态码解释] **

  • 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 请求报文。


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


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


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


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

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

2.2 获取请求报文的报头


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


把请求标头里的内容填充到代码块里,部分 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 获取请求报文的数据

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

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

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 命令,停止卸载就行。


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


得到安装路径以后,可以在终端里查看,也可以在 mac 可视化文件模式里查看,我更喜欢可视化,打开的时候有的文件夹就翻译成中文了,我相信只要用心肯定能找到。用Python写一个脚本自动连wifi自动登录校园网


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


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

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

用Python写一个脚本自动连wifi自动登录校园网moc 版 pywifi作者回复

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

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


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


下载完检查一下是不是包含了 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


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


下面开始完成连接 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 1    else:        print("兄弟,我没设置自动打开Wi-Fi功能,你先打开wifi再试?")    return 0def 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 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 = True    if 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

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

    1. 执行指令打包

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


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


将 xx.py 打包为 xx.exe

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


如有侵权,请联系删除

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

好文推荐

用Python写一个脚本自动连wifi自动登录校园网
红队打点评估工具推荐
干货|红队项目日常渗透笔记
实战|后台getshell+提权一把梭
一款漏洞查找器(挖漏洞的有力工具)
神兵利器 | 附下载 · 红队信息搜集扫描打点利器
神兵利器 | 分享 直接上手就用的内存马(附下载)
推荐一款自动向hackerone发送漏洞报告的扫描器

欢迎关注 系统安全运维

原文始发于微信公众号(系统安全运维):用Python写一个脚本自动连wifi自动登录校园网

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月30日11:17:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   用Python写一个脚本自动连wifi自动登录校园网https://cn-sec.com/archives/1638829.html

发表评论

匿名网友 填写信息