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私有属性和方法实例分析
Jan 15 Python
定制FileField中的上传文件名称实例
Aug 23 Python
Python动态导入模块的方法实例分析
Jun 28 Python
Python 保持登录状态进行接口测试的方法示例
Aug 06 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
Python 迭代,for...in遍历,迭代原理与应用示例
Oct 12 Python
Python 依赖库太多了该如何管理
Nov 08 Python
python爬虫之遍历单个域名
Nov 20 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
Python读取表格类型文件代码实例
Feb 17 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
教你怎么用python爬取爱奇艺热门电影
May 20 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
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
详解webpack2+React 实例demo
2017/09/11 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python流程控制常用工具详解
2020/02/24 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
python3中布局背景颜色代码分析
2020/12/01 Python
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
公司门卫管理制度
2014/02/01 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
《荷花》教学反思
2014/04/16 职场文书
2014年党支部工作总结
2014/11/13 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL