學校校園網最近更換了Portal登錄方式,由於實在是覺得麻煩便想使用腳本在路由器上實現自動登錄,然后路由器充當終端。
基礎信息
Router: Xiaomi MiWiFi Nano(R1CL)
Openwrt: 19.07.4 r11208-ce6496d796
Portal: 中國電信WiFi Portal v4.0
Browser: 90.0.4430.212 64-bit
提示
該腳本僅供參考,里面的Portal服務器/用戶名/密碼等參數均為虛擬,更多的是用來學習Linux腳本技巧。在這個過程中,我也遇到了很多問題,得到了好友Will醬的大力幫助,在此表示感謝。我踩的一些坑會在文末寫出來,避免其他人再踩坑。
獲得Portal參數
首先打開Portal頁面,先進行登錄后確認賬號密碼沒有輸錯。然后按F12調出開發者選項,切換到Network選項卡,在Throttling(丟包)選項中選擇Offline(離線),這時點擊登錄后下面數據流會立即出現一個紅色的數據,一般為login。右鍵,Copy,Copy as cURL(bash)。注意一定要復制為bash。
獲取動態參數
我們學校的Portal是靜態賬號,如果是手機號實時獲取驗證碼那種的就不用往下看了,基本沒用了。
但是它還有一個動態參數UserIP,這個我不清楚是否是有意而為之。
UserIP是DHCP直接分配的,相當於我們只要跟路由器詢問一下當前IP就行了。
OpenWrt中獲取IP地址的命令
ifconfig | grep -A1 "eth0.2" | grep 'inet addr' |awk -F ':' '{print $2}'|awk '{print $1}'
將上面命令的輸出內容作為變量存儲在腳本里面調用即可。
就結束了
是的,就結束了。
我給大家看一下成品
#!/bin/ash
sleep 5
UIP=`ifconfig | grep -A1 "eth0.2" | grep 'inet addr' |awk -F ':' '{print $2}'|awk '{print $1}'`
echo "============New Login===============" >> /root/bdlogin.log
date >> /root/bdlogin.log
echo ${UIP} >> /root/bdlogin.log
curl 'http://10.5.17.253:913/v0400/web/other/login' \
-H 'Connection: keep-alive' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'Accept: application/json, text/javascript, */*; q=0.01' \
-H 'DNT: 1' \
-H 'X-Requested-With: XMLHttpRequest' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
-H 'Origin: http://10.5.17.253:913' \
-H "Referer: http://10.5.17.253:913/v0400/web/index?userip=${UIP}&authip=10.5.12.239&oraurl=null" \
-H 'Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6' \
-H 'Cookie: com.ailk.aiip.modules.webgui.common.theme.CookieFilterThemeResolver.THEME=v_4_0; LogSuc=0' \
--data-raw "commonUser=testbrandbandstu@edustuct&commonUserPwd=93042251®Area=bj&userIp=${UIP}&authip=10.5.12.239&oraUrl=null" \
--insecure >> /root/bdlogin.log
保存為腳本丟進啟動項就可以用了。
踩坑
-
開頭的
sleep 5
是為了防止路由器剛開機就執行腳本會有分不到DHCP的情況,這個后來測試的時候我覺得我是多慮了。 -
>
是覆寫,>>
是寫入完了繼續在寫 -
用了變量的行一定要使用雙引號
"I love ${THEPERSON} who is the best"
-
把命令的輸出結果作為變量的時候,命令本身外面需要套反引號(如上方代碼第五行)
-
每個人網卡配置可能不一樣,中間的
eth0.2
換成你對應的網卡就可以了 -
實際上
curl
里面的-H
參數有些是可以刪的,不過懶得搞了,又不是不能用