1. 程式人生 > 程式設計 >python實現圖書館搶座(自動預約)功能的示例程式碼

python實現圖書館搶座(自動預約)功能的示例程式碼

指令碼功能

系統開放座位時快速預約指定位置

可以設定預約的時間段

執行以後會一直幫你搶,需要手動停止

即使遇到更強的指令碼自動幫搶下一個座位

實現

首先解決登入問題,通過F12找出登入請求包,分析對比一下包可以發現一般只有使用者名稱和密碼這個引數是變化的,然後用requests.session()的例項化去請求登入介面,登入成功。

然後預約座位抓一下包,分析包找到變化的關鍵的引數,一般情況下關鍵引數只有座位id、開始時間、結束時間,其他的引數一股腦照搬就行了,接下來用剛剛登入成功的那個requests.session()例項去請求即可。

優化

既然是每天都幫搶那麼一直去請求可不行,一是給伺服器造成負擔,二是如果有什麼反爬策略容易被發現被封。所以每天到12點(系統預約開放時間)的時候發預約包就行。

萬一指令碼撞車了沒搶到自己設定的座位怎麼辦,返回預約的結果,發現已經有人了自動預約下一個座位,也可以將自己心儀的座位寫在列表裡,這個搶不到搶下一個。

程式碼

(為了不給學校系統新增負擔,程式碼僅供參考,無法直接執行)

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': '',}
 
#登入函式
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)
 #返回登入成功的例項
 return s
 
#預約函式
def yd(s,start,end,s_id):
 y_params = {
 "dialogid": "",#預定座位
 "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,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]天預約':
 return 0
 else:
 print('fail')
 return 2
 
#指令碼輸入提示資訊
def useage():
 print(
	'''
	Usage:
	 -i 學號(必填)
	 -p 密碼
	 -s 座位id
	 -b 開始時間,格式13:00,下同
	 -e 結束時間
	''')
 
if __name__ == '__main__':
 id = pwd = None
 #不填預設搶這個這個時間段的這個座位
 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
 
 #先獲取後天時間
 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())))
 #如果現在的明天等與之前的後天,即到了12點,開始搶座
 if date.isoformat(date.today() + timedelta(days=1)) == aftertomorrow:
 
  s = login(id,pwd)
 
  start = aftertomorrow + ' ' + begin
  endtime = aftertomorrow + ' ' + end
  result = yd(s,endtime,s_id)
 
  if result == 1:
  #預約成功
  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:
  #被預約,搶下一個id的座位
  s_id = str(int(s_id) - 1)
  continue
  else:
  continue
 else:
  sleep_time = (23 - hour) * 3600 + (59 - m) * 60
  time.sleep(sleep_time)

結語

不知道你們的學校圖書館預約系統是什麼樣的,但是一般學校也不會花太多錢去搞這個,所以系統比較垃圾,大部分可以按照這個思路來。而且有些學校跟我們學校用的幾乎相同的系統,肯定是出自同一個公司或者同一個模板的。如果你們學校也是類似的系統,程式碼改一下就能用。

我學校的系統主頁大概長這樣

python實現圖書館搶座(自動預約)功能的示例程式碼

到此這篇關於python實現圖書館搶座(自動預約)功能的示例程式碼的文章就介紹到這了,更多相關python圖書館預約內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!