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实现socket客户端和服务端简单示例
Feb 24 Python
简单介绍Python中的几种数据类型
Jan 02 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
Windows下将Python文件打包成.EXE可执行文件的方法
Aug 03 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
Django的Modelforms用法简介
Jul 27 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
python绘制规则网络图形实例
Dec 09 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
Python生成九宫格图片的示例代码
Apr 14 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生成文件
2007/01/15 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
php上传图片类及用法示例
2016/05/11 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
Django 中 cookie的使用
2017/08/17 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
JQuery toggle使用分析
2009/11/16 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
Bootstrap基础学习
2015/06/16 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
python实现Virginia无密钥解密
2019/03/20 Python
python文件写入write()的操作
2019/05/14 Python
python十进制转二进制的详解
2020/02/07 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
关于工作时间玩手机的检讨书
2014/09/18 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
趣味运动会加油词
2015/07/18 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android
实操Python爬取觅知网素材图片示例
2021/11/27 Python
Golang 结构体数据集合
2022/04/22 Golang