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的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
django富文本编辑器的实现示例
Apr 10 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 Python
python 统计文件中的字符串数目示例
Dec 24 Python
Python获取对象属性的几种方式小结
Mar 12 Python
openCV提取图像中的矩形区域
Jul 21 Python
python中turtle库的简单使用教程
Nov 11 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(4) php 函数 补充2
2010/02/15 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
python实现图片批量剪切示例
2014/03/25 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
python中常用的九种预处理方法分享
2016/09/11 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
tensorflow之并行读入数据详解
2020/02/05 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
介绍下Java中==和equals的区别
2013/09/01 面试题
Java语言的优势
2015/01/10 面试题
党纪处分决定书
2015/06/24 职场文书
宿舍管理制度范本
2015/08/07 职场文书
校园之声广播稿
2015/08/18 职场文书
python异常中else的实例用法
2021/06/15 Python
Java线程的6种状态与生命周期
2022/05/11 Java/Android