前言
每次查成績都要點來點去很麻煩,特別是期末這段時間,着實有丶不太方便。
所以寫了一個一條命令查成績的小工具;
沒什麼技術含量,只是方便了點,各位大佬們看看就好;
莫對俺下手【/互聯網暴力】
完整代碼可以在
Github:https://github.com/hausa-han/HAUST_auto_get_score
Gitee(訪問較快):https://gitee.com/hausa/HAUST_auto_get_score
找到。
分析與開發過程
從對教務系統的第一次訪問開始抓包分析:
請求方式是GET,獲得了一個SessionId,此後每一次請求都需要SessionId,因此需要模擬這一過程,將cookie中的SessionId保存下來:
import requests
def getcookie():
print('正在進行第一次請求,以獲取Cookies')
url = 'http://jxglxt2.haust.edu.cn/'
cookies = requests.get(url).cookies
#由於這時的Cookies是RequestsCookieJar類型,所以要進行轉換:
cookies = requests.utils.dict_from_cookiejar(cookies)
print('Cookies獲取成功:' + cookies['ASP.NET_SessionId'] + '\n')
return cookies['ASP.NET_SessionId']
getcookie()
運行:
之後在網頁上進行登錄操作,並對登錄時的包進行抓包,可以看到:
所有的POST參數中,__VIEWSTATE
和__VIEWSTATEGENERATOR
參數是固定的;Sel_Type
參數是用戶類型,即STU;txt_sdsdfdsfryuiighgdf
參數是學號;很明顯sdfdfdhgwerewt
參數即是加密後的密碼,其他參數均爲空。接下來來分析密碼的加密過程。
進行JS調試:
在Sources欄,展開直到發現一個叫md5.js
的文件,md5是一種加密方式。看名字,猜測是加密密碼的腳本文件,在md5函數處打斷點,開始動態分析。
在輸入密碼時中斷,不斷跟進函數調用過程(F10),發現這樣一段代碼:
var s=md5(yhm+md5(obj.value).substring(0,30).toUpperCase()+schoolcode).substring(0,30).toUpperCase();
document.all.sdfdfdhgwerewt.value=s;
可以看到,下面一行對sdfdfdhgwerewt
參數的值進行了設置,值爲上面加密過程得出的結果。分析可知,上面一句對密碼的加密過程爲:第一次MD5加密:用戶輸入的密碼的md5的32位大寫,取其前30位,然後將:學號、第一次加密結果、學校編碼拼接到一起進行第二次md5加密,並取結果的32位大寫的前30位。
我們用python模擬這樣的加密過程,並將結果與這裏的結果對照:
import hashlib
def encodepasswd(stuID, passwd):
print("正在加密密碼")
a = hashlib.md5()
a.update(passwd.encode(encoding='utf-8'))
str = a.hexdigest()
str = stuID + str[:-2] + '10464'
b = hashlib.md5()
str = str.upper()
b.update(str.encode(encoding='utf-8'))
str = b.hexdigest()
str = str.upper()
print("加密完成:" + str[:-2] + '\n')
return str[:-2]
encodepasswd('191404050107', 'hausa')
是一致的,所以加密過程解決。
之後將加密後的參數與其他所有參數拼接到一起,進行一次login嘗試:
(在這裏卡了好久,最後發現這裏有一個小坑,這個包之前有兩個完全一樣的請求發出,但是返回的__VIEWSTATE
不一樣,就這裏,耗了至少5個小時)
P.S.這裏是部分代碼,完整代碼參考上面的倉庫地址。
登錄後,即可用相同的方法對獲取成績的過程進行分析和模擬,並最終調整,寫出最終程序。
程序運行效果:
第一次使用需要輸入學號和密碼,若教務系統正常運行,則會在當前目錄生成一個score.jfif圖片文件,其中即爲成績:
從第二次使用開始,會自動讀取加密存儲的賬號密碼,2~4秒內實現查成績操作:
因爲教務系統過一段時間後就會清除已登錄的cookie(主要是我懶。。),所以沒有實現Logout,有興趣的小夥伴可以來實現一下,加強程序的安全性。
有問題歡迎在下方評論嗷~~(不會吧不會吧,連查成績多點幾下都懶得點的我,不會真的在評論區跟各位大佬討論吧,不會吧不會吧,不會真的有人想邀請我去爬山,還要照相吧?不會吧不會吧?)
今天就這麼多話了,晚安,瑪卡巴卡。