2020年10月11日 星期日

校務通開發序章--登入邏輯

import requests
import hashlib
from lxml import etree
HOST = "https://sso.wzu.edu.tw"
CAPTCHA_DICT = {
"9bcd5ab8fc729c83bdbbc784e3002d2f": "3",
"543cd21e5aaa43d056d8068654c54b9a": "4",
"5b24f8c135fee3ae3b14a1b9d0594704": "5",
"2e81195ea486bd3704e94d8738cce591": "6",
"88a220af9e880ed9089f64067a09e9b3": "7",
"961ad1052e35d01d1a0cafc0917183a9": "8",
"ed6b4795dd09ba4aab1d728657ac825a": "a",
"ada5aca56c49ebdd600af0e74f1b91fd": "d",
"f2a05ef72e154278ab4e6665d5200458": "e",
"9f729a736e3590d919d52ae4c6bc2346": "f",
"51203198720eb3c05e5acf73f209c285": "h",
"969f09793ed0900a9d86768f013446c5": "i",
"4d12aa55f5402f24a86cf848ccbdaad7": "m",
"a41049298340e857d905972dca4d4732": "n",
"de5ad6fec2d3e65cabdc79077aff44fd": "r",
"9197aa82ba8921840737c118d1a12f79": "t"
}
def get_md5(data: bytes):
md5_object = hashlib.md5()
md5_object.update(data)
return md5_object.hexdigest()
def get_captcha_text(session: requests.session, login_page_html: str):
# parse image url
root = etree.HTML(login_page_html)
single_captcha_text_dom = root.xpath(
'//span[@id="table1"]/img[@border="0"]')
result = ""
for i in single_captcha_text_dom:
# get image file on single session
image_request = session.get(f"{HOST}{i.get('src')}")
result += CAPTCHA_DICT[get_md5(image_request.content)]
return result
def login(session: requests.session, username: str, password: str) -> bool:
login_page_url = f'{HOST}/Portal/login.htm'
login_page_request = session.get(url=login_page_url)
if login_page_request.status_code != 200:
return False
# get captcha text part
form_captcha_text = get_captcha_text(session=session,
login_page_html=login_page_request.text)
# print(captcha_text)
# get SYSTEM_MAGICNUMBER
root = etree.HTML(login_page_request.text)
form_system_magicnumber = root.xpath(
'//input[@name="SYSTEM_MAGICNUMBER"]')[0].get('value')
# login request
login_request = session.post(url=f'{HOST}/Portal/loginprocess',
data={
'USERID': username,
'PASSWD': password,
'SYSTEM_MAGICNUMBERTEXT': form_captcha_text,
'SYSTEM_MAGICNUMBER': form_system_magicnumber
},
allow_redirects=False)
if login_request.status_code == 302:
return True
return False
if __name__ == "__main__":
# session
session = requests.session()
login_request_status = login(session=session,
username='',
password='')
print("login status: ", login_request_status)
view raw wzu_login.py hosted with ❤ by GitHub

 參考網頁:文藻外語大學校務系統

可以懂邏輯

1.         首先,先導入PY程式所需要的套件,

2.         再來,連入文藻校務系統的鏈結

3.         針對驗證碼解析做CAPTCHA轉換

4.         (第四段不懂用意—def get_md5(data: bytes))

5.         使用MD5取得root權限

6.         核對圖片驗證碼請求

7.         如果login_page_request.status_code200則回傳錯誤(False)

8.         比對正確性

9.         連入放置學生教職員帳號密碼的資料庫,比對本人的帳密有無錯誤

10.     如果狀態為302則代表登入成功

11.     印出登入狀態、登入請求狀態

 

以上大概解釋,如果有錯請學長指導

 

 

我可能變數命名比較辣雞一點

__main__那開始

requests這一個套件有 session 這功能

會自己做好cookie 管理

 

get_md5  這一個是計算md5function

輸入是bytes  原則上是輸入圖片的bytes

 

我這邊的root 是指 DOM root

我這邊是用lxml.etree去解析html

一般學爬蟲比較會看到beautifulsoup

 

流程

先請求login.htm 的頁面資訊 (對方也會給我cookie 這裡 requests.session處理掉了 )

 

拿這個頁面的html get_captcha_text

 

把這個html中的 驗證碼網址給parse 出來

parse 之後 再拿session get 圖片檔案

同時在把圖片檔案(bytes) get_md5    再拿剛剛那個表 就能知道這張圖片是哪一個字母了

 

接下來就是拿SYSTEM_MAGICNUMBER

這一個就只是在login.htm   直接透過lxml.etree 去解析 (我解析都用Xpath)

 

 

最後就是向loginprocess 去登入

他們登入成功是給302


Share:

Related Posts:

0 意見:

張貼留言