学校的WiFi采用了web认证方式登录,也就是连接上WiFi后会自动弹出一个页面,地址是http://captive.apple.com/,这后面就是服务器登录页面的地址,在这个页面输入用户名和密码后就可以上网了。 在iPhone上这个页面的使用体验还算可以,因为可以自动填充用户名和密码,但是在mac上,这个页面是作为单独的一个窗口弹出来的,永远在所有页面最上方,并且点击关闭后他还会自动弹出来1~2次,同时这个页面开启时(也就是弹出后不登录也不做操作),浏览器和终端是连接不上网的,最无法接受的是,在这个页面里没有办法自动填充,只能手动输入,而且离线后登陆状态保持时间很短,每天都要一遍遍输入密码,显得非常的繁琐。所以我一直在考虑能不能简化这个过程,下面是我尝试的一种让电脑开机时自动连接认证服务器的方法。
首先这个功能是由Captive Network Assistant.app提供的,关于Apple的Captive Network Assistant 这篇文章里介绍了其工作原理:
- 发送一个HTTP/1.0的请求到 http://www.apple.com/library/test/success.html
- 接收一个回应,如果回应跟它预计的结果一致,那么认为网络是通的,就不会自动弹出页面。同时,状态栏的WIFI图标出现。流程结束。否则,进入下一步。
- 如果收到的回应不是它想要的那个,它就认为有CWP存在。
- 如果有CWP存在,iOS就会自动打开一个页面,在这个页面中再请求一次 http://www.apple.com/library/test/success.html ,这一次使用的是HTTP/1.1。
- 然后就可以打开Login页面了。
实现过程具体可以分成以下几步:
1. 首先要禁用Captive Network Assistant这个程序,在终端输入以下命令
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.captive.control Active -boolean false
让开机时登录的窗口不会自动弹出,因为这个窗口存在时,终端是没有连接网络的,后续的操作也就无法正常进行。
2. 然后退出登录,在Chrome里打开登录页面,打开DevTools,选择Network选项卡,登录账户,这时会记录网络的发送接收情况,在执行post操作的文件(比如login.php)上点击右键,选择Copy as cURL,
curl 'https://abc.xyz/portal/login.php' -H 'Origin: https://abc.xyz' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.8' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2767.4 Safari/537.36' -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: https://abc.xyz/portal/index.html' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data-binary 'username=1234&password=abcd' --compressed
经过我的测试,
curl 'https://abc.xyz/portal/login.php' -H 'Connection: keep-alive' --data-binary 'username=1234&password=abcd'
只要运行这一段就可以正常登录,所以把这一部分保存为login.sh,放在合适的地方。
3. 为了让这段脚本在开机时自动启动,要建立一个luanchd angent,关于luanchd的苹果官方的介绍 Creating Launch Daemons and Agents 说的非常清楚,也建议使用这种方式进行启动项设置。我使用了一个很好的GUI软件Lingon,设置界面如下:
其实这是一个位于/Users/yourname/Library/LuanchAgents/的plist文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key> <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/sbin</string>
</dict>
<key>Label</key>
<string>com.arthur.wifilogin</string>
<key>LaunchOnlyOnce</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/Users/arthurwang/Library/LaunchAgents/login.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
想进行其他详细设置也可以手写这个文件,不过至此我希望实现的功能就已经完成了,终于不用再输入超长的密码了。