記錄使用Python登錄浙江大學統一身份認證


背景

現在每天要進行健康情況上報,但是因為經常睡過頭忘記打卡,於是想着寫一個程序來自動打卡。

統一身份認證

訪問健康情況上報頁面(https://healthreport.zju.edu.cn/ncov/wap/default/index)后會先跳轉到登錄界面
登陸頁面

輸入賬號密碼登陸以后會發送一個post請求
post請求
表單里一共有五項內容
在這里插入圖片描述
在這里插入圖片描述
可以看到,username就是學號,password不是密碼的明文,可能是經過了哈希或者加密,authcode一項為空不用管,_eventId應該是提交的意思,而最長的execution看不出有什么含義。
通過查看網頁源代碼,可以看到登錄表單中有一項
在這里插入圖片描述
就是execution的內容,可以看出,每次請求頁面的時候會返回execution,在登錄時帶着這一項提交,作用可能是防止csrf攻擊(猜的)。

那么就只剩下密碼這一個參數了。
如果前端通過js加密密碼,必然要先從input框中先獲取密碼的內容,於是先找到密碼框的html代碼
在這里插入圖片描述
然后在source中全文搜索password關鍵字,發現login.js中有一段這樣的代碼
在這里插入圖片描述
點開看看
在這里插入圖片描述
可以看到這段代碼先進行一些字段檢查,再把密碼加密填寫回password,最后再執行submit提交到后台。
繼續搜索加密中用到的RSAUtils
在這里插入圖片描述
發現代碼都放在security.js中,繼續打開看看
這個文件包含了加密需要的代碼,其中的算法我不太了解,不過好在Python有pyexecjs這個神器,直接把代碼扒下來調用就好了。
在這里插入圖片描述
但是圖中需要的public_exponentModulus兩個參數還沒有找到,考慮到每次登錄提交的密碼內容都不一樣,所以猜測這兩個可能是通過時間戳生成或者請求來的?繼續搜索
在這里插入圖片描述

在這里插入圖片描述
原來是通過ajax請求了這兩個參數,再在network里找,果然找到了這個請求
在這里插入圖片描述

應該是通過cookie將這次的登錄表單和這對參數聯系起來,好奇后台是通過什么算法驗證的。

代碼實現

現在整個登錄的流程已經梳理清楚了,開始使用代碼實現

  1. 先訪問頁面並提取execution
    sess = requests.session()
    r = sess.get('https://healthreport.zju.edu.cn/ncov/wap/default/index')
    execution = re.search('name="execution" value="(.*?)"', r.text).group(1)
    
  2. 獲取密碼加密需要的參數
    r = sess.get('https://zjuam.zju.edu.cn/cas/v2/getPubKey')
    modulus = r.json()['modulus']
    exponent = r.json()['exponent']
    
  3. 加密密碼
    ctx = execjs.compile(jscode)
    encrypted_password = ctx.call('encrypt', username, password)
    
  4. 發送登錄請求
    data = {
    			'username': username,
    			'password': encrypted_password,
    			'authcode': ''
    			'execution': execution,
    			'_eventId': 'submit'
    		}
    
    r = sess.post(post_url, data=data)
    

之后就可以進行自動打卡的操作了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM