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的迭代器、生成器以及相关的itertools包
Apr 02 Python
Python WEB应用部署的实现方法
Jan 02 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
python超时重新请求解决方案
Oct 21 Python
Python实现密码薄文件读写操作
Dec 16 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
简单了解Django项目应用创建过程
Jul 06 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 Python
numba提升python运行速度的实例方法
Jan 25 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 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函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
php实现的ping端口函数实例
2014/11/12 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
文本加密解密
2006/06/23 Javascript
Javascript select下拉框操作常用方法
2009/11/09 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
简单理解Python中的装饰器
2015/07/31 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
python中dict使用方法详解
2019/07/17 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
Net Remoting把服务器端激活两种模式
2014/01/22 面试题
公务员培训心得体会
2013/12/28 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
委托公证书
2014/04/08 职场文书
村干部培训方案
2014/05/02 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
党支部工作总结2015
2015/04/01 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript