搶課系統(tǒng)的核心:登陸與傳輸

作為搶課系統(tǒng),你必須要做到無(wú)論何時(shí)何地都在線,并且持續(xù)不斷的進(jìn)行搶課。只有這樣才能夠戰(zhàn)勝別的同學(xué)。

首先,這個(gè)搶課系統(tǒng)要做到自動(dòng)化,能夠斷線重連,其次是高速的選課。

這里寫出的代碼是在沒(méi)有前端頁(yè)面的前提下臨時(shí)試用用的。所以很多方法的返回以及調(diào)用上不是很規(guī)范。代碼中都有很詳細(xì)的注釋,如果有不懂或者不住請(qǐng)務(wù)必告訴我。

登陸自動(dòng)化:

  • 自動(dòng)輸入驗(yàn)證碼:

學(xué)校的選課系統(tǒng)登陸是需要驗(yàn)證碼的,經(jīng)過(guò)長(zhǎng)達(dá)3天,對(duì)學(xué)校js代碼的全部閱讀下(真的及其痛苦,期間遇到了無(wú)數(shù)的問(wèn)題,看的差點(diǎn)吐出來(lái)),我找到了學(xué)校驗(yàn)證碼的構(gòu)造方法,和登陸的傳輸方法。
下面是我的驗(yàn)證碼請(qǐng)求方法,返回的值為該次申請(qǐng)用的session以及一個(gè)可能的驗(yàn)證碼隊(duì)列

def get_vercode(url):
    if len(os.listdir('static/vercode')) > 50:  # 隔一段時(shí)間清理多余的驗(yàn)證碼圖片
        for x in os.listdir('static/vercode'):
            os.remove('static/vercode/'+x)
    s = requests.session()  # 確保申請(qǐng)驗(yàn)證碼的session和登陸時(shí)為一致的,所以寫在了這里
    # 構(gòu)建驗(yàn)證碼路徑
    now_time = str(int(time.time()))
    pic_url = url + 'servlet/ImageServlet?d=' + now_time  # 學(xué)校的驗(yàn)證碼就是這樣,js獲取時(shí)間后先服務(wù)器索要一個(gè)驗(yàn)證碼圖片
    # 取得驗(yàn)證碼圖片
    pic = s.get(pic_url).content
    filename = 'static/vercode/' + now_time + '.jpg'  # 以后可能還是要用到手動(dòng)輸入驗(yàn)證碼,所以先保存圖片吧
    with open(filename, 'wb') as f:
        f.write(pic)
    img = Image.open(filename)
    vcode = pytesseract.image_to_string(img)  # 使用ocr技術(shù)將圖片中的驗(yàn)證碼讀取出來(lái)
    time.sleep(0.3)  # 休息一會(huì),等待驗(yàn)證碼完全讀取完成(我在電腦上有時(shí)候讀取不完。。
    vcode_list = confirm_vcode(vcode)  # 檢驗(yàn)驗(yàn)證碼有效性,并輸出更好的驗(yàn)證碼隊(duì)列
    return s, vcode_list
  • 驗(yàn)證碼自動(dòng)識(shí)別正確性檢驗(yàn):

使用pytesseract生成的驗(yàn)證碼往往有著這樣那樣的錯(cuò)誤,所以我要對(duì)返回的驗(yàn)證碼進(jìn)行一些小小的調(diào)教,以提高效率以及降低資源的占用

def confirm_vcode(vcode):
    # 這個(gè)函數(shù)用來(lái)驗(yàn)證自動(dòng)生成的驗(yàn)證碼的有效性,并試圖優(yōu)化它
    # 學(xué)校的驗(yàn)證碼會(huì)忽略零和o的區(qū)別,都當(dāng)做同一個(gè)字符,但是這個(gè)ocr總是會(huì)把5和S搞混
    if len(vcode) != 4:  # 不是4位肯定錯(cuò)了,直接跳過(guò)吧
        return False
    vcode_list = []
    vcode_list.append(vcode)
    vcode_list.append(vcode.replace('S', '5'))  # 置換S和5,然后存入數(shù)列中
    vcode_list.append(vcode.replace('5', 'S'))
    return vcode_list
  • 登陸主體部分:

這里因?yàn)榍芭_(tái)沒(méi)搭建好,一時(shí)不知道該返回什么,目前只是做了一個(gè)登陸而已

def login(url, data):  # 未來(lái)可能要支持不同的學(xué)校,url先給出來(lái)
    i = 0
        while i == 0:
        info = get_vercode(url)
        s = info[0]  # 將前面獲取驗(yàn)證碼用的session賦予s
        if info[1] is False:  # 如果這次驗(yàn)證碼有問(wèn)題就重新取一次驗(yàn)證碼
            continue
        for x in info[1]:  # 遍歷驗(yàn)證碼列表
            data['verifyCode'] = x
            r = s.post(url+'loadData.xk?method=checkLogin', data)   # 傳輸?shù)顷憯?shù)據(jù),data是外部給的,這里寫出來(lái)也沒(méi)啥意義了 
            print(r.text)
            if r.text == '{"success":true,"message":""}':  # 成功登陸了就準(zhǔn)備跳出登陸循環(huán)吧
                print('成功了')
                i += 1
                break

選課:

就很簡(jiǎn)單了,略過(guò)吧

遇到的問(wèn)題:

無(wú)法獲取到教學(xué)計(jì)劃和本學(xué)期待選課表??戳巳齑a都沒(méi)有找到這些數(shù)據(jù)是在哪里傳輸?shù)摹U娴暮鼙罎?。但是如果用模擬瀏覽器的方法會(huì)占用大量的資源,為了能夠很好的在廉價(jià)的服務(wù)器上發(fā)布,這種方法還是先不考慮了。先做前臺(tái)頁(yè)面,然后再進(jìn)行這方面的研究吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,550評(píng)論 0 17
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,767評(píng)論 18 399
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666閱讀 1,443評(píng)論 0 6
  • 參考鏈接:http://blog.csdn.net/litiouslove/article/details/789...
    Gaolex閱讀 627評(píng)論 0 1