校園門戶登入

小馮挺忙發表於2021-06-06

最近一年多受疫情影響,學校一直在組織健康打卡,出發點是好的,但是總覺得每天提交任務是在太繁瑣。因此就利用介面進行代開啟。
中間校方針對業務也前前後後進行幾次調整,python模擬登入代價越來越高,近幾天要返校參加畢業典禮,所以又重操舊業,把程式程式碼再改一改。

實現思路

這裡主要還是借鑑了之前在網上看到的一篇部落格,因為年代久遠找不到連結了這裡不再引用出處,大致思路如下:

  1. 利用python模擬使用者登入(之前的部落格採用cookie),但是後來操作發現cookie是會過期的。
  2. 通過開啟介面模擬打卡請求。
  3. 通過阿里雲端計算函式遞交python程式碼,實現定時打卡。

當前版本問題

由於提到了cookie過期,所以在此就只能通過模擬登入方式去獲取cookie。

那看下目前來講登入過程網站要做哪些事情

準備登入需要的引數

首先開啟登入網站 然後F12開始抓包,這個想必就不用多說了。
image
其實在登入過程中只輸入了賬號密碼,可是登入請求密碼是密文傳輸的還多了許多引數,比較難辦的是需要獲得lt及加密方式,沒辦法只能老老實實去看js了。

值得慶幸的是我在網頁裡看到這個LT的資料項
image
大膽猜測一下 ,後面njqn應該南京地區吧,然後1622明顯是時間戳,剩下的就沒搞懂啥意思,不過網頁上帶的,就等於白給嘛
剩下的就是密碼加密了,這裡被坑了好久。
image
提交按鈕繫結事件監聽,進入看看在哪加密的
image
可以查詢函式名或者打斷點讓他帶你走一遍流程去找
image
萬惡之源應該是這沒錯了
image
斷點看看啥引數,這個_p1沒搞懂是啥,不過大致有了眉目,函式最終返回的是_gas的結果其中主要是_rds(64) 拼上密碼,p1,rds(16),再看看rds是啥
image
顯然這個函式根據字符集隨機生成指定長度字串,因為是隨機生成的我們用一個已經生成的沒多大問題,剩下就是_p1了
image
看了看函式呼叫,這玩意應該也來自網頁,下面就只要仿照他完成加密即可,看一看_gas到底幹了啥吧
image
emm ,問題不大,直接放程式碼 AES加密 CBC模式

def pkcs7padding(text):
    """
    明文使用PKCS7填充
    最終呼叫AES加密方法時,傳入的是一個byte陣列,要求是16的整數倍,因此需要對明文進行處理
    :param text: 待加密內容(明文)
    :return:
    """
    bs = AES.block_size  # 16
    length = len(text)
    bytes_length = len(bytes(text, encoding='utf-8'))
    # tips:utf-8編碼時,英文佔1個byte,而中文佔3個byte
    padding_size = length if(bytes_length == length) else bytes_length
    padding = bs - padding_size % bs
    # tips:chr(padding)看與其它語言的約定,有的會使用'\0'
    padding_text = chr(padding) * padding
    return text + padding_text
def aes_encode(key, content):
    """
    AES加密
    key,iv使用同一個
    模式cbc
    填充pkcs7
    :param key: 金鑰
    :param content: 加密內容
    :return:
    """
    key0 = re.sub(r'/(^\s+)|(\s+$)', "", key)
    key_bytes = bytes(key0, encoding='utf-8')
    iv =bytes("QDj3eQfnPmTzCXN6",encoding='utf-8')
    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
    # 處理明文
    content_padding = pkcs7padding(content)
    # 加密
    aes_encode_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
    # 重新編碼
    result = str(base64.b64encode(aes_encode_bytes), encoding='utf-8')
    return result
aes_encode(key,date)

iv是隨機生成的就是rds(16) kye0 從網頁獲取 按照函式處理流程同樣進行處理 這裡date可以打斷點抓取,因為是隨機生成+密碼拼接直接用也沒啥問題,這也登入的問題是解決了。

登入302

image
3次請求重定向,面對重定向問題採用session解決把每次請求的cookie都帶上,丟了頁面路由就會從頭開始,程式碼解決如下:
image
首先requests中將重定向跳轉設定false 每次手動從header中獲取重定向地址
image
最後輸出頁面內容可以看到主頁的內容,成功登入了

然鵝事情往往並沒有那麼簡單 當我嘗試跳轉到打卡介面的時候

image

好傢伙白給了

相關文章