python实现图书馆抢座(自动预约)功能的示例代码


Posted in Python onSeptember 29, 2020

脚本功能

系统开放座位时快速预约指定位置

可以设置预约的时间段

运行以后会一直帮你抢,需要手动停止

即使遇到更强的脚本自动帮抢下一个座位

实现

首先解决登录问题,通过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, 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图书馆预约内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python读写文件方法总结
Jun 09 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
Python实现最大子序和的方法示例
Jul 05 Python
python基础 range的用法解析
Aug 23 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
Python中关于浮点数的冷知识
Sep 22 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 07 Python
如何用python写个模板引擎
Jan 14 Python
Django集成富文本编辑器summernote的实现步骤
May 31 Python
python中 Flask Web 表单的使用方法
May 20 Python
Python 下载Bing壁纸的示例
Sep 29 #Python
pycharm 2020 1.1的安装流程
Sep 29 #Python
利用django创建一个简易的博客网站的示例
Sep 29 #Python
如何基于Python实现word文档重新排版
Sep 29 #Python
python实现简单贪吃蛇游戏
Sep 29 #Python
python爬虫---requests库的用法详解
Sep 28 #Python
如何在scrapy中捕获并处理各种异常
Sep 28 #Python
You might like
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
python中迭代器(iterator)用法实例分析
2015/04/29 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
Django 内置权限扩展案例详解
2019/03/04 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
python实现KNN分类算法
2019/10/16 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
python中有函数重载吗
2020/05/28 Python
django的autoreload机制实现
2020/06/03 Python
Python-for循环的内部机制
2020/06/12 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
HEMA法国:荷兰原创设计
2019/02/21 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
员工培训心得体会
2013/12/30 职场文书
司机岗位职责
2015/02/04 职场文书