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 FTP操作类代码分享
May 13 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
Python获取数据库数据并保存在excel表格中的方法
Jun 12 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
Mar 19 Python
python 实现波浪滤镜特效
Dec 02 Python
python爬取代理ip的示例
Dec 18 Python
python Scrapy框架原理解析
Jan 04 Python
使用pipenv管理python虚拟环境的全过程
Sep 25 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
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
jquery 插件学习(五)
2012/08/06 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
jQuery多级弹出菜单插件ZoneMenu
2014/12/18 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
python分析网页上所有超链接的方法
2015/05/08 Python
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
Python的时间模块datetime详解
2017/04/17 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
python 同时运行多个程序的实例
2019/01/07 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
党课培训主持词
2014/04/01 职场文书
商务助理求职信范文
2014/04/20 职场文书
房地产推广策划方案
2014/05/19 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
卖房协议书样本
2014/10/30 职场文书
2014年学生工作总结
2014/11/20 职场文书
涨价通知怎么写
2015/04/23 职场文书
教师节感想
2015/08/11 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
工作一年自我鉴定
2019/06/20 职场文书
MySQL学习必备条件查询数据
2022/03/25 MySQL