首先抓包或者按下F12進(jìn)入瀏覽器開發(fā)者模式進(jìn)行分析:

2018-1-25(1).jpg
由這張圖我們可以得出我們填寫完學(xué)號(hào)和密碼后post的表單包含的內(nèi)容有username,password,lt,execution,eventld,rmShown。而execution,_eventId,rmShown都是常量,分別為
'execution': 'e1s1',
'_eventId': 'submit',
'rmShown': '1'
而lt每次都是不同的一串字符串,查看源代碼:

2018-1-25(2).png
這個(gè)lt實(shí)際上是登錄的用戶需要的流水號(hào),相當(dāng)于你起銀行辦理業(yè)務(wù)的時(shí)候,首先得拿到一個(gè)流水號(hào)排隊(duì)表示你進(jìn)入了辦理整個(gè)業(yè)務(wù)的流程。而在這里,只有有了webflow發(fā)放的有效的流水號(hào),用戶才可以說明是已經(jīng)進(jìn)入了webflow流程。否則,沒有流水號(hào)的情況下,webflow會(huì)認(rèn)為用戶還沒有進(jìn)入webflow流程,從而會(huì)重新進(jìn)入一次webflow流程,從而會(huì)重新出現(xiàn)登錄界面。
而為了得到lt,我們可以通過BeautifulSoup庫(kù)進(jìn)行解析,在
<input>標(biāo)簽下找到name='lt',并提取出value后的一串字符串即可。此外,在我們請(qǐng)求頁(yè)面以獲取lt值后,如果再用post發(fā)送我們構(gòu)造好的表單,在這個(gè)過程中,相當(dāng)于刷新了一下頁(yè)面,,我們先前獲得的lt值已經(jīng)不再是現(xiàn)在的lt值了,所以這個(gè)時(shí)候我們就要用requests的session方法來保持cookie不變了,session方法可以讓同一個(gè)實(shí)例發(fā)出的所有請(qǐng)求保持相同的cookie。代碼如下:
__author__=='YunLambert'
import requests
from http import cookiejar
from bs4 import BeautifulSoup as bs
header = {'User-Agent':...} #填寫自己瀏覽器的請(qǐng)求頭部信息即可
loginurl = 'http://idas.uestc.edu.cn/authserver/login?service=http://portal.uestc.edu.cn/index.portal'
def getLt(str):
lt = bs(str, 'html.parser')
dict = {}
for i in lt.form.find_all('input'):
if(i.get('name')) != None:
dict[i.get('name')] = i.get('value')
return dict
print('****UESTC模擬登錄*****')
print('請(qǐng)輸入學(xué)號(hào):')
username = input()
print('請(qǐng)輸入密碼:')
password = input()
s = requests.Session()
s.cookies = cookiejar.CookieJar()
r = s.get(loginurl)
dict = getLt(r.text)
postdata={
'username': username,#學(xué)號(hào)
'password': password,#密碼
'lt': dict['lt'],
'execution': 'e1s1',
'_eventId': 'submit',
'rmShown': '1'
}
response = s.post(loginurl, data = postdata, headers = header)
print(response)
#如果返回值為200,說明模擬登陸成功;404說明錯(cuò)誤,登陸失??;500的話,可能是學(xué)校網(wǎng)又炸了....