这个登录也用了有一段时间了,现在就总结下具体的操作过程。
Mac自带了一款应用,叫自动操作,可以自己定义多种操作,方便使用。这里要用自动操作登录Wifi,首先还是要写脚本,写脚本就要分析网页的登录请求是什么样的,以便构造。
连接Wifi以后,登录页面的IP固定。界面很简单,输入学号和密码,再选择运营商即可登录。
输入学号为account,密码为123456,运营商中国移动。然后打开BurpSuite,开启浏览器代理,点击登录,抓取登录请求的包。在BurpSuite看到请求包的内容如下,参数还是比较多的。user_account是账户名@运营商(@的URL编码为%40),user_account是密码,wlan_user_ip是当前IP。
然后,其他的参数意义我就不知道了,然后找到了室友给路由器写的脚本,发现很多参数是固定的,一些参数是时间戳,其他参数不用管,然后账户名,密码和运营商一选定,就可以登录Wifi了。感觉学校的一些东西做得还是不太讲究,2333。登录请求后,服务器会返回一个json数据,反映登录状态,脚本可根据这个判断是否出错。
整体的Python脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| import time import json import base64 import requests
def login(user, pwd, provider, ip, mac, stamp): url = "http://10.2.5.251:801/eportal/?c=Portal&a=login&callback=dr1594111093261&login_method=1" url += "&user_account={0}@{1}&user_password={2}".format(user, provider, pwd) url += "&wlan_ac_ip=&wlan_ac_name=" url += "&jsVersion=3.0&_={0}".format(stamp) res = requests.get(url) res_text = res.content.decode("utf-8") res_json = json.loads(res_text.split('(')[1].split(')')[0]) result = res_json.get("result") if result == '1': print("登陆成功") else: msg = base64.b64decode(res_json.get('msg')).decode() if msg == 'userid error1': print('不存在此用户,请检查用户名是否填写错误,或者运行商选择错误') elif msg == 'userid error2': print('用户密码错误') elif msg: print('未知错误:', msg) else: print('无错误', msg)
if __name__ == "__main__": user = "********" pwd = "********" provider = "********" ip = "" mac = "000000000000" time_stamp = str(int(time.time() * 1000)) login(user, pwd, provider, ip, mac, time_stamp)
|
找个位置保存好上面的脚本,打开Mac上的自动操作,新建“快速操作”,在资源库中选择“运行Shell脚本”。工作流程收到“没有输入”,位于“任何应用程序”。在右下方的文本框,输入/usr/bin/python3 /Users/crownz/Code/VsCode/loginNetwork/school_network.py
,以启动脚本,这个根据自己放置的位置而有所不同。
若现在连接了Wifi,可以点击运行来测试下。运行无误后,保存为“热点登陆.workflow”文件,这里把它放到了~/Library/Services目录下,这样就可以在左上方的“服务”下拉栏中看到我们的自动操作选项。如果想去掉,可以在服务偏好设置里面自定义。这个东西是全局的,在任何应用的“服务”下拉栏都可以使用。
参考
[1] 给 Mac 添加自定义服务