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的发展史
Sep 26 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 Python
使用python实现生成用户信息
Mar 20 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
python实现年会抽奖程序
Jan 22 Python
python flask中动态URL规则详解
Nov 22 Python
python实现3D地图可视化
Mar 25 Python
解决reload(sys)后print失效的问题
Apr 25 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
python的html标准库
Apr 29 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
PHP中cookies使用指南
2007/03/16 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
调试php程序的简单步骤
2019/10/04 PHP
经验几则 推荐
2006/09/05 Javascript
window.open的功能全解析
2006/10/10 Javascript
javascript 流畅动画实现原理
2009/09/08 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
js行号显示的文本框实现效果(兼容多种浏览器 )
2015/10/23 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
需要牢记的JavaScript基础知识
2016/09/25 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
Python单例模式实例分析
2015/01/14 Python
Django中使用locals()函数的技巧
2015/07/16 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
护理专业毕业生推荐信
2013/10/31 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
建党伟业的观后感
2015/06/01 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
Python道路车道线检测的实现
2021/06/27 Python