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) |
參考網頁:文藻外語大學校務系統
可以懂邏輯
1.
首先,先導入PY程式所需要的套件,
2.
再來,連入文藻校務系統的鏈結
3.
針對驗證碼解析做CAPTCHA轉換
4.
(第四段不懂用意—def get_md5(data:
bytes))
5.
使用MD5取得root權限
6.
核對圖片驗證碼請求
7.
如果login_page_request.status_code非200則回傳錯誤(False)
8.
比對正確性
9.
連入放置學生教職員帳號密碼的資料庫,比對本人的帳密有無錯誤
10.
如果狀態為302則代表登入成功
11.
印出登入狀態、登入請求狀態
以上大概解釋,如果有錯請學長指導
我可能變數命名比較辣雞一點
從 __main__那開始
requests這一個套件有
session 這功能
會自己做好cookie 管理
—
get_md5
這一個是計算md5的function
輸入是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
0 意見:
張貼留言