python實(shí)現(xiàn)圖書館搶座(自動預(yù)約)功能的示例代碼
腳本功能
系統(tǒng)開放座位時(shí)快速預(yù)約指定位置
可以設(shè)置預(yù)約的時(shí)間段
運(yùn)行以后會一直幫你搶,需要手動停止
即使遇到更強(qiáng)的腳本自動幫搶下一個座位
實(shí)現(xiàn)
首先解決登錄問題,通過F12找出登錄請求包,分析對比一下包可以發(fā)現(xiàn)一般只有用戶名和密碼這個參數(shù)是變化的,然后用requests.session()的實(shí)例化去請求登錄接口,登錄成功。
然后預(yù)約座位抓一下包,分析包找到變化的關(guān)鍵的參數(shù),一般情況下關(guān)鍵參數(shù)只有座位id、開始時(shí)間、結(jié)束時(shí)間,其他的參數(shù)一股腦照搬就行了,接下來用剛剛登錄成功的那個requests.session()實(shí)例去請求即可。
優(yōu)化
既然是每天都幫搶那么一直去請求可不行,一是給服務(wù)器造成負(fù)擔(dān),二是如果有什么反爬策略容易被發(fā)現(xiàn)被封。所以每天到12點(diǎn)(系統(tǒng)預(yù)約開放時(shí)間)的時(shí)候發(fā)預(yù)約包就行。
萬一腳本撞車了沒搶到自己設(shè)定的座位怎么辦,返回預(yù)約的結(jié)果,發(fā)現(xiàn)已經(jīng)有人了自動預(yù)約下一個座位,也可以將自己心儀的座位寫在列表里,這個搶不到搶下一個。
代碼
(為了不給學(xué)校系統(tǒng)添加負(fù)擔(dān),代碼僅供參考,無法直接運(yùn)行)
import requests from datetime import date from datetime import timedelta import json import getopt import sys import time global headers headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0', 'Host': '', } #登錄函數(shù) def login(id, pwd): l_params = { 'id': id, 'pwd': pwd, 'act': 'login', } #自己分析得到的接口,下同 login_url = '' s = requests.session() re = s.post(url=login_url, headers=headers, params=l_params) #返回登錄成功的實(shí)例 return s #預(yù)約函數(shù) def yd(s, start, end, s_id): y_params = { "dialogid": "", #預(yù)定座位 "dev_id": s_id, "room_id":"", "type":"dev", "prop":"", "number":"", "classkind":"", "test_name":"", "start": start, "end": end, "start_time": "800", "end_time": "2200", } y_url = '' re = s.get(url=y_url, headers=headers, params=y_params) print(re.text) res = json.loads(re.text) msg = res['msg'] if msg == '操作成功!': print('success') return 1 elif msg == '2020-09-11只能提前[1]天預(yù)約': return 0 else: print('fail') return 2 #腳本輸入提示信息 def useage(): print( ''' Usage: -i 學(xué)號(必填) -p 密碼 -s 座位id -b 開始時(shí)間,格式13:00,下同 -e 結(jié)束時(shí)間 ''') if __name__ == '__main__': id = pwd = None #不填默認(rèn)搶這個這個時(shí)間段的這個座位 s_id = '100458282' begin = '8:00' end = '22:00' #處理輸入 try: opts, args = getopt.getopt(sys.argv[1:], 'i:p:s:b:e:') for name, value in opts: if name == '-i': id = value if name == '-p': pwd = value if name == '-s': s_id = value if name == '-b': begin = value if name == '-e': end = value except getopt.GetoptError: useage() if not id: useage() sys.exit(3) if not pwd: pwd = id #先獲取后天時(shí)間 aftertomorrow = date.isoformat(date.today() + timedelta(days=2)) while True: hour = int(time.strftime('%H',time.localtime(time.time()))) m = int(time.strftime('%M', time.localtime(time.time()))) #如果現(xiàn)在的明天等與之前的后天,即到了12點(diǎn),開始搶座 if date.isoformat(date.today() + timedelta(days=1)) == aftertomorrow: s = login(id, pwd) start = aftertomorrow + ' ' + begin endtime = aftertomorrow + ' ' + end result = yd(s, start, endtime, s_id) if result == 1: #預(yù)約成功 aftertomorrow = date.isoformat(date.today() + timedelta(days=2)) sleep_time = (23 - hour) * 3600 + (59 - m) * 60 + 35 print('程序休眠{}s'.format(sleep_time)) print(aftertomorrow) time.sleep(sleep_time) elif result == 2: #被預(yù)約,搶下一個id的座位 s_id = str(int(s_id) - 1) continue else: continue else: sleep_time = (23 - hour) * 3600 + (59 - m) * 60 time.sleep(sleep_time)
結(jié)語
不知道你們的學(xué)校圖書館預(yù)約系統(tǒng)是什么樣的,但是一般學(xué)校也不會花太多錢去搞這個,所以系統(tǒng)比較垃圾,大部分可以按照這個思路來。而且有些學(xué)校跟我們學(xué)校用的幾乎相同的系統(tǒng),肯定是出自同一個公司或者同一個模板的。如果你們學(xué)校也是類似的系統(tǒng),代碼改一下就能用。
我學(xué)校的系統(tǒng)主頁大概長這樣
到此這篇關(guān)于python實(shí)現(xiàn)圖書館搶座(自動預(yù)約)功能的示例代碼的文章就介紹到這了,更多相關(guān)python圖書館預(yù)約內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 兩個列表的差集、并集和交集實(shí)現(xiàn)代碼
這篇文章主要介紹了Python 兩個列表的差集、并集和交集實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-09-09關(guān)于jupyter lab安裝及導(dǎo)入tensorflow找不到模塊的問題
這篇文章主要介紹了關(guān)于jupyter lab安裝及導(dǎo)入tensorflow找不到模塊的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Python機(jī)器學(xué)習(xí)之scikit-learn庫中KNN算法的封裝與使用方法
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)之scikit-learn庫中KNN算法的封裝與使用方法,結(jié)合實(shí)例形式分析了scikit-learn庫中KNN算法的相關(guān)調(diào)用與使用技巧,需要的朋友可以參考下2018-12-12基于Python實(shí)現(xiàn)超級瑪麗游戲的示例代碼
這篇文章主要介紹了利用python實(shí)現(xiàn)超級瑪麗游戲的示例代碼,幫助大家更好的理解和使用python開發(fā)游戲,感興趣的朋友可以跟隨小編一起學(xué)習(xí)一下2022-05-05讓Python程序定時(shí)執(zhí)行的8種方法整理
在日常工作中,我們常常會用到需要周期性執(zhí)行的任務(wù),一種方式是采用?Linux?系統(tǒng)自帶的?crond?結(jié)合命令行實(shí)現(xiàn),另外一種方式是直接使用Python。本文整理了一下?Python?定時(shí)任務(wù)的實(shí)現(xiàn)方式,希望對大家有所幫助2023-01-01Python yield生成器和return對比代碼實(shí)例
這篇文章主要介紹了Python yield生成器和return對比代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04VScode連接遠(yuǎn)程服務(wù)器上的jupyter notebook的實(shí)現(xiàn)
這篇文章主要介紹了VScode連接遠(yuǎn)程服務(wù)器上的jupyter notebook的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04