Python实现图书馆座位自动预约脚本解析

不晚
不晚
发布时间:2026-10-14| 4人浏览过
原创

本文介绍使用Python实现图书馆座位自动预约的脚本逻辑。通过F12分析登录与预约接口,利用requests.session保持会话状态。核心优化包括定时在系统开放时发送请求以减轻服务器压力,以及处理撞车情况下的自动顺延策略。代码仅供参考,旨在提供同类系统的开发思路。

脚本功能概述

脚本功能概述

该系统旨在系统开放座位时,快速执行指定位置的预约操作。

用户可自定义设置预约的具体时间段。

脚本运行后将持续执行抢座任务,直至用户手动停止程序。

即使遭遇其他竞争脚本抢占目标,本脚本也具备自动处理机制。

实现原理

实现原理

首先解决身份验证问题。通过浏览器F12开发者工具捕获登录请求包,对比分析发现通常仅有用户名和密码为动态参数。随后,利用requests库的session对象实例化并调用登录接口,完成身份验证。

接着进行座位预约。通过抓包分析预约请求,识别关键动态参数,通常包括座位ID、开始时间及结束时间,其余静态参数可直接复用。使用之前登录成功的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, 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)

结语

结语

尽管各校图书馆预约系统界面各异,但多数学校因预算限制,往往采用成本较低的通用系统或同一厂商提供的模板。因此,若贵校系统与此类似,只需调整部分参数即可复用此思路。

我所在学校的系统主页大致如下所示:

本文关于Python实现图书馆自动预约功能的示例代码介绍至此。如需了解更多Python图书馆预约相关内容,建议搜索本站往期文章或继续浏览后续内容,感谢支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。