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 Web框架Flask下网站开发入门实例
Feb 08 Python
Python爬取三国演义的实现方法
Sep 12 Python
详解Python中的type和object
Aug 15 Python
实例介绍Python中整型
Feb 11 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
在Python中append以及extend返回None的例子
Jul 20 Python
Python的条件锁与事件共享详解
Sep 12 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
python中从for循环延申到推导式的具体使用
Nov 29 Python
linux 下selenium chrome使用详解
Apr 02 Python
Keras 使用 Lambda层详解
Jun 10 Python
Python filter过滤器原理及实例应用
Aug 18 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 Hash算法:Times33算法代码实例
2015/05/13 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
python梯度下降算法的实现
2020/02/24 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
UNIX文件类型
2013/08/29 面试题
工作保证书怎么写
2015/02/28 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
如何写好竞聘报告
2019/04/03 职场文书
优秀创业计划书分享
2019/07/19 职场文书
Java设计模式之享元模式示例详解
2022/03/03 Java/Android
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL