python实现图书馆抢座(⾃动预约)功能的⽰例代码
脚本功能
系统开放座位时快速预约指定位置
可以设置预约的时间段
运⾏以后会⼀直帮你抢,需要⼿动停⽌
即使遇到更强的脚本⾃动帮抢下⼀个座位
实现
⾸先解决登录问题,通过F12出登录请求包,分析对⽐⼀下包可以发现⼀般只有⽤户名和密码这个参数是变化的,然后⽤requests.session()的实例化去请求登录接⼝,登录成功。
然后预约座位抓⼀下包,分析包到变化的关键的参数,⼀般情况下关键参数只有座位id、开始时间、结束时间,其他的参数⼀股脑照搬就⾏了,接下来⽤刚刚登录成功的那个requests.session()实例去请求即可。
优化
既然是每天都帮抢那么⼀直去请求可不⾏,⼀是给服务器造成负担,⼆是如果有什么反爬策略容易被发现被封。所以每天到12点(系统预约开放时间)的时候发预约包就⾏。
万⼀脚本撞车了没抢到⾃⼰设定的座位怎么办,返回预约的结果,发现已经有⼈了⾃动预约下⼀个座位,也可以将⾃⼰⼼仪的座位写在列表⾥,这个抢不到抢下⼀个。
代码
(为了不给学校系统添加负担,代码仅供参考,⽆法直接运⾏)
关于python的书
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)
)
res = json.)
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 = pt(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()
if not pwd:
pwd = id
#先获取后天时间
aftertomorrow = date.day() + 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.day() + 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.day() + 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图书馆预约内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。