脚本函数
系统开座后快速预约指定位置
您可以设置约会的时间段
运行后会一直帮你抓取,需要手动停止
即使遇到更强的脚本也会自动抢座
实施
先解决登录问题,通过F12找到登录请求包,分析对比包,可以发现一般只改了用户名和密码的参数,然后使用requests.session( ) 请求登录界面,登录成功。
然后订位抢包,分析包找出变化的关键参数。一般来说,关键参数只有席位id、开始时间和结束时间,其他参数可以复制。接下来,使用刚刚成功登录的那个。可以请求 requests.session() 实例。
优化
既然是天天帮抢,不停请求是不够的,一是给服务器增加负担,二是如果有反爬策略,很容易被发现并被阻止。所以每天到12:00(系统预约开放时间)发送预约包就行了。
如果脚本崩溃抢不到你设置的座位怎么办孤独图书馆预约可以改时间么,返回预订结果发现有人已经自动预订了下一个座位,你也可以在列表中写下你喜欢的座位,这个不能抓住下一个。
代码
(为了不给学校系统带来负担孤独图书馆预约可以改时间么,代码仅供参考,不能直接运行)
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, 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]天预约': 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, start, 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)
结论
我不知道你们学校的图书馆预约系统是怎样的,但一般学校不会在这上面花太多钱,所以系统比较垃圾,大部分可以按照这个思路走。并且有些学校使用的系统和我们几乎一样,必须来自同一家公司或同一个模板。如果你们学校有类似的系统,只要改一下代码就可以使用了。
我学校的系统主页是这样的