python實(shí)現(xiàn)圖書館搶座(自動(dòng)預(yù)約)功能的示例代碼
腳本功能
系統(tǒng)開放座位時(shí)快速預(yù)約指定位置
可以設(shè)置預(yù)約的時(shí)間段
運(yùn)行以后會(huì)一直幫你搶,需要手動(dòng)停止
即使遇到更強(qiáng)的腳本自動(dòng)幫搶下一個(gè)座位
實(shí)現(xiàn)
首先解決登錄問題,通過F12找出登錄請(qǐng)求包,分析對(duì)比一下包可以發(fā)現(xiàn)一般只有用戶名和密碼這個(gè)參數(shù)是變化的,然后用requests.session()的實(shí)例化去請(qǐng)求登錄接口,登錄成功。
然后預(yù)約座位抓一下包,分析包找到變化的關(guān)鍵的參數(shù),一般情況下關(guān)鍵參數(shù)只有座位id、開始時(shí)間、結(jié)束時(shí)間,其他的參數(shù)一股腦照搬就行了,接下來用剛剛登錄成功的那個(gè)requests.session()實(shí)例去請(qǐng)求即可。
優(yōu)化
既然是每天都幫搶那么一直去請(qǐng)求可不行,一是給服務(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)有人了自動(dòng)預(yù)約下一個(gè)座位,也可以將自己心儀的座位寫在列表里,這個(gè)搶不到搶下一個(gè)。
代碼
(為了不給學(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é)號(hào)(必填)
-p 密碼
-s 座位id
-b 開始時(shí)間,格式13:00,下同
-e 結(jié)束時(shí)間
''')
if __name__ == '__main__':
id = pwd = None
#不填默認(rèn)搶這個(gè)這個(gè)時(shí)間段的這個(gè)座位
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ù)約,搶下一個(gè)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é)校也不會(huì)花太多錢去搞這個(gè),所以系統(tǒng)比較垃圾,大部分可以按照這個(gè)思路來。而且有些學(xué)校跟我們學(xué)校用的幾乎相同的系統(tǒng),肯定是出自同一個(gè)公司或者同一個(gè)模板的。如果你們學(xué)校也是類似的系統(tǒng),代碼改一下就能用。
我學(xué)校的系統(tǒng)主頁大概長這樣

到此這篇關(guān)于python實(shí)現(xiàn)圖書館搶座(自動(dòng)預(yù)約)功能的示例代碼的文章就介紹到這了,更多相關(guān)python圖書館預(yù)約內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python pandas軸旋轉(zhuǎn)stack和unstack的使用說明
這篇文章主要介紹了Python pandas軸旋轉(zhuǎn)stack和unstack的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Python中UserWarning:The NumPy module was
在 Python 項(xiàng)目中,我們經(jīng)常需要導(dǎo)入許多庫來完成各種任務(wù),NumPy 作為一個(gè)核心的科學(xué)計(jì)算庫,被廣泛應(yīng)用于數(shù)據(jù)處理和分析,然而,有時(shí)我們會(huì)遇到 NumPy 重載的警告,本文將詳細(xì)講解這一警告的原因,并提供解決方案,需要的朋友可以參考下2024-07-07
Python Selenium破解滑塊驗(yàn)證碼最新版(GEETEST95%以上通過率)
這篇文章主要介紹了Python Selenium破解滑塊驗(yàn)證碼最新版(GEETEST95%以上通過率),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
pandas常用表連接merge/concat/join/append詳解
使用python的pandas庫可以很容易幫你搞定,而且性能也是很出色的;百萬級(jí)的表關(guān)聯(lián),可以秒出,本文給大家分享pandas常用表連接merge/concat/join/append詳解,感興趣的朋友跟隨小編一起看看吧2023-02-02
django自帶的server 讓外網(wǎng)主機(jī)訪問方法
今天小編就為大家分享一篇django自帶的server 讓外網(wǎng)主機(jī)訪問方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Python爬取網(wǎng)站圖片并保存的實(shí)現(xiàn)示例
這篇文章主要介紹了Python爬取網(wǎng)站圖片并保存的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

