測試網站是本人學校,費話不多說下麵開始 首先直接導庫,過程中需要時間戳,rsa加密 import requests import re import time from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 ...
測試網站是本人學校,費話不多說下麵開始
首先直接導庫,過程中需要時間戳,rsa加密
import requests import re import time from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5
接下來,開始獲取token,搜索發現有csrftoken,把那串值通過正則拿下來
token_url = '本人學校網址' headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Language': 'zh,zh-CN;q=0.9', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36', } r = requests.session() token_page = r.get(token_url,headers=headers).text #獲取token rule = r'name="csrftoken" value="(.*?)"/>' token = re.findall(rule,token_page) if token[0] == "": print("token獲取錯誤") else: #print(token[0]) pass
下麵包裝了三個函數,為rsa加密做準備,根據js分析得知,需要從服務端獲取兩個參數一個modulus,exponent
進一步查看發現這兩個值通過請求這個地址獲得
代碼實現,不得不說,chatgpt是真的牛逼,我知道這個js的大概,但是不懂怎麼用python去實現,結果我直接複製進去chatgpt直接把python代碼給我了,牛逼!!!!!!!!!!
# 將base64編碼的字元串轉化為十六進位編碼的字元串 def b64tohex(b64str): import base64 return base64.b64decode(b64str).hex() #將十兛進位編碼的密文轉化為base64編碼的密文 def hex2b64(hexstr): import base64 return base64.b64encode(bytes.fromhex(hexstr)).decode() def rsa_encrypt(modulus,exponent): # 創建 RSA 密鑰 modulus = b64tohex(modulus) exponent = b64tohex(exponent) key = RSA.construct((int(modulus, 16), int(exponent, 16))) # 加密 cipher = PKCS1_v1_5.new(key) password = '我的密碼' ciphertext = cipher.encrypt(password.encode()) # 將密文轉換為base64編碼 enPassword = hex2b64(ciphertext.hex()) #print("加密後的密文: ", enPassword) return enPassword
#註意這裡還有個時間戳變數,不過我感覺可能沒啥用,反正加上就加上
#生成時間毫秒級時間戳
milliseconds = int(round(time.time() * 1000))
#print(milliseconds)
params = {
'time': milliseconds,
}
#獲取加密密碼的重要參數信息地址 modules , exponnent ,教務系統進行李rsa加密
dir = r.get('兩個參數的地址', params=params, headers=headers, verify=False).json()
modulus = dir.get("modulus")
exponent = dir.get("exponent")
password = ''
if modulus=="" or exponent=="":
print("加密的關鍵參數獲取錯誤")
else:
#print(modulus,exponent)
password += rsa_encrypt(modulus, exponent)
#print(password)
最後將前面獲取到的csrftoken和加密後的密碼進行和賬號一起包裝成data,發包拿下登陸後的cookies
data = { 'csrftoken': token[0], 'language': 'zh_CN', 'yhm': '本人學號', 'mm': [ password, password, ], } verify = r.post('學校登錄網址',headers=headers, data=data).text account_url = '個人信息頁面網址'+str(milliseconds) account_page = r.get(account_url,headers=headers).text #print(account_page) #通過判斷是否有修改密碼判定是否成功 if "修改密碼" in account_page: print("congratulation, login successful!")
最後也是成功successful
開始都快放棄選擇selenium了,但是還是嘗試查資料搞好了,chatgpt是真的牛逼,開始也不確定到底加密後的密碼是不是正確可以用的,嘗試下還真是哈哈哈,淺淺記錄下!