從零搭建教務(wù)搶課系統(tǒng)(四)

目錄

(一)核心功能:模擬登陸
(二)使用Cookie進(jìn)行模擬登錄
(三)獲取教務(wù)網(wǎng)選課列表
(四)循環(huán)選課
(五)斷線重連

Github鏈接: https://github.com/njuwuyuxin/CourseGrabber

循環(huán)選課

在成功實(shí)現(xiàn)了登陸系統(tǒng),拉取課程列表之后,我們離成功只差最后一步,只需要模擬瀏覽器,向?qū)?yīng)端口發(fā)送選課請求即可。
手動(dòng)在網(wǎng)頁上選擇任意一門課之后發(fā)現(xiàn),選課請求體結(jié)構(gòu)非常簡單,同樣為Post請求

{
  'method':'addSpecialitySelect',
  'classId':'xxxx'
}

這里的classID就是上一篇中提到的后臺為每個(gè)課程標(biāo)記的ID,并不是大家平時(shí)使用的課程號。好在上一篇中,我們已經(jīng)對每門課的序號和課程ID進(jìn)行了映射。

基本思路理清后,代碼的部分就相對非常簡單。

def GrabCourse(courseID,interval=0):
    while(True):
        selectCourse_reqdata={}
        selectCourse_reqdata['method']="addSpecialitySelect"
        selectCourse_reqdata['classId']=str(courseID)
        selectResult = s.post(host+'student/elective/selectCourse.do',selectCourse_reqdata)
        soup = BeautifulSoup(selectResult.content,"html.parser",from_encoding='utf-8')
        for tag in soup.find_all('div'):
            if tag.get('id')=="successMsg":
                print("搶課成功!")
                return
            elif tag.get('id')=="errMsg":   
                if tag.string.find("已經(jīng)")!=-1:
                    print("您已經(jīng)搶到該課程啦~")
                    exit()
                elif tag.string.find("錯(cuò)誤")!=-1:
                    print("出現(xiàn)錯(cuò)誤,添加失敗")
                    exit()
                else:
                    print("當(dāng)前班級已滿,仍在為您持續(xù)搶課")
            else:
                pass
        if interval!=0:
            time.sleep(interval)

這里的GrabCourse函數(shù)接收兩個(gè)參數(shù),第一個(gè)就是課程ID,第二個(gè)為一個(gè)可調(diào)的時(shí)間間隔。為了避免對教務(wù)系統(tǒng)造成過大負(fù)擔(dān)(防止被查水表),這里默認(rèn)設(shè)置了每次發(fā)送選課請求的時(shí)間間隔為1秒。

同時(shí)對每次選課請求的返回進(jìn)行一下檢驗(yàn),主要分為四種情況:

  1. 選課成功:理想情況
  2. 已經(jīng)選課:證明課表這已經(jīng)選中這門課
  3. 班級已滿:搶課系統(tǒng)主要針對的正是這種情況,班級滿時(shí)需要循環(huán)發(fā)送請求,等待班級空出位置的瞬間。
  4. 出現(xiàn)錯(cuò)誤:多為課程ID填寫錯(cuò)誤,或者選擇了其他院系專業(yè)課(沒有選課權(quán)限)等情況

對每種情況分別處理即可

其他嘗試

由于之前拉取課程列表時(shí),嘗試通過填寫其他院系編號來構(gòu)造請求體,成功拉取到了其他院系的課表,可知教務(wù)系統(tǒng)后端對院系方面審核并不十分嚴(yán)格。因此在選課階段同樣進(jìn)行了類似的嘗試(作死),方法同樣是在構(gòu)造選課請求時(shí),填寫其他院系課程的課程ID
結(jié)果:返回“出現(xiàn)錯(cuò)誤,添加失敗”(笑)
可見教務(wù)平臺至少在選課的時(shí)候還是稍微做了一下身份驗(yàn)證。不過至此,整個(gè)搶課系統(tǒng)的基本功能已經(jīng)實(shí)現(xiàn)。可以成功登錄、獲取列表、循環(huán)發(fā)送選課請求。接下來的工作就是優(yōu)化人機(jī)交互以及斷線重連相關(guān)功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容