南信大 校園網 自動登陸 python實現

打開電腦,無線網每次連接校園網(i-NUIST)的時候都會跳出一個認證界面,認證完才能上網,我的電腦有時候還抽風跳不出來這個網頁,於是我就想做個登陸的腳本,連接上無線網直接自動登陸就好了。

工具:

1.python3.6
2.requests模塊 和 base64模塊
3.Google Chrome瀏覽器

過程:
我試了幾下登陸,發現那就是個post過程。

打開谷歌瀏覽器
輸入網址:http://a.nuist.edu.cn
輸入校園網賬號密碼,按下F12開始抓包咯。。
抓到的包
就抓到了一條post包,還是jquery的。。。。

既然是post的包,當然要看它傳的data了。。
data

發送的數據:

  • username:就是賬號的明文
  • domain:運營商(移動CMCC 聯通Unicom 電信ChinaNet)
  • password:應該是密碼,而且是加密的
  • enablemacauth不知道這條是做什麼的,登陸了好多次都是不變的,那就把它固定住,不改變。

post最關鍵的就是data包了,這個包也就password是加密的,其他還好,接下來就搞一下這個加密吧。。
先看一下它的長度,8位的,猜了一個md5加密,試了一下,發現不是。。

接下來怎麼辦呢。。。。

只能從他的js裏面找它的加密方法,當然不是一行一行的分析它的源碼,這樣會累死的

打開F12裏面的search,尋找關鍵字password
搜索

很明顯是在login.js裏面
於是,打開這個文件,找啊找啊(此處省略過程),發現了點頭緒。
js文件

還好我暑假看過一點jQuery的基礎,看得懂他的ajax 跨域請求
看他的data項,找到了base64的加密,然後後面測試了一下也是正確的。

post請求的data應該可以構造了。
接下來看看,它要不要加什麼協議頭 ,cookie什麼的。。。

查看它的 請求頭
在這裏插入圖片描述

其他都好構造,好像需要cookie

看了一下這兩個cookie,應該是進入網頁的時候生成的。

所以這個模擬登陸的正確流程應該是

  1. 打開網頁 a.nuist.edu.cn 獲得cookie
  2. 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就行了

最後皮一下
皮

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章