打開電腦,無線網每次連接校園網(i-NUIST)的時候都會跳出一個認證界面,認證完才能上網,我的電腦有時候還抽風跳不出來這個網頁,於是我就想做個登陸的腳本,連接上無線網直接自動登陸就好了。
工具:
1.python3.6
2.requests模塊 和 base64模塊
3.Google Chrome瀏覽器
過程:
我試了幾下登陸,發現那就是個post過程。
打開谷歌瀏覽器
輸入網址:http://a.nuist.edu.cn
輸入校園網賬號密碼,按下F12開始抓包咯。。
就抓到了一條post包,還是jquery的。。。。
既然是post的包,當然要看它傳的data了。。
發送的數據:
- username:就是賬號的明文
- domain:運營商(移動CMCC 聯通Unicom 電信ChinaNet)
- password:應該是密碼,而且是加密的
- enablemacauth不知道這條是做什麼的,登陸了好多次都是不變的,那就把它固定住,不改變。
post最關鍵的就是data包了,這個包也就password是加密的,其他還好,接下來就搞一下這個加密吧。。
先看一下它的長度,8位的,猜了一個md5加密,試了一下,發現不是。。
接下來怎麼辦呢。。。。
只能從他的js裏面找它的加密方法,當然不是一行一行的分析它的源碼,這樣會累死的
打開F12裏面的search,尋找關鍵字password
很明顯是在login.js裏面
於是,打開這個文件,找啊找啊(此處省略過程),發現了點頭緒。
還好我暑假看過一點jQuery的基礎,看得懂他的ajax 跨域請求
看他的data項,找到了base64的加密,然後後面測試了一下也是正確的。
post請求的data應該可以構造了。
接下來看看,它要不要加什麼協議頭 ,cookie什麼的。。。
查看它的 請求頭
其他都好構造,好像需要cookie
看了一下這兩個cookie,應該是進入網頁的時候生成的。
所以這個模擬登陸的正確流程應該是
- 打開網頁 a.nuist.edu.cn 獲得cookie
- 向 a.nuist.edu.cn/index.php/index/login 攜帶cookie發送post請求
我試了試,好像直接post 是可以的,不需要獲取cookie,我想多了。
發送post後 他會返回一個json格式的信息,來告知你是否登陸成功
接下來是python代碼
登陸函數:
需要requests 模塊 和 base64模塊
def login(username='賬號',password='密碼',domain='Unicom'): #要輸入賬號密碼啊。。。
password = base64.b64encode(password.encode()).decode() #base64加密。。
url="http://a.nuist.edu.cn/index.php/index/login"
dv={ #構造data
'username':username,
'domain':domain,
'password':password,
'enablemacauth':0
}
try: #用try來防止未知錯誤。
r = requests.post(url,data=dv) #發送post
r.raise_for_status() #錯誤拋出異常
return r.json() 返回json格式的數據
except:
print('error')
完整代碼:
import requests #導入庫
import base64
def login(username='賬號',password='密碼',domain='Unicom'): #要輸入賬號密碼啊。。。
password = base64.b64encode(password.encode()).decode() #base64加密。。
url="http://a.nuist.edu.cn/index.php/index/login"
dv={ #構造data
'username':username,
'domain':domain,
'password':password,
'enablemacauth':0
}
try: #用try來防止未知錯誤。
r = requests.post(url,data=dv) #發送post
r.raise_for_status() #錯誤拋出異常
return r.json() 返回json格式的數據
except:
print('error')
#下面輸入你的賬號密碼,運營商:移動CMCC 聯通Unicom 電信ChinaNet
dic=login('你的賬號','密碼','運營商')
for i in list(dic.keys()):
if dic[i]:
print(i+":"+str(dic[i])) #輸出登陸信息,成功與否
input()
註銷的代碼也放上來:
比較簡單
import requests
def logout():
url = 'http://a.nuist.edu.cn/index.php/index/logout'
try:
r = requests.post(url,timeout=30)
r.raise_for_status()
return r.json()['info']
except:
print('error')
#def main():
print(logout())
input()
此外,如果你不想連接上無線網就彈出登陸網頁的話,那就要手動修改一下註冊表了。
打開註冊表的方法,百度(https://jingyan.baidu.com/article/3aed632ed714d6701080912e.html)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet 中enableactiveprobing 調成0就行了
最後皮一下