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 合并文件的具体实例
Aug 08 Python
python通过post提交数据的方法
May 06 Python
Python聚类算法之基本K均值实例详解
Nov 20 Python
python如何读写csv数据
Mar 21 Python
python3解析库lxml的安装与基本使用
Jun 27 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
Python 生成VOC格式的标签实例
Mar 10 Python
python os模块常用的29种方法使用详解
Jun 02 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
浅谈python中的多态
Jun 15 Python
Python中22个万用公式的小结
Jul 21 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作的文本留言本的例子(四)
2006/10/09 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
php批量修改表结构实例
2017/05/24 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
JavaScript知识点整理
2015/12/09 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python 递归函数详解及实例
2016/12/27 Python
浅谈Python peewee 使用经验
2017/10/20 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python pygame模块编写飞机大战
2018/11/20 Python
python用post访问restful服务接口的方法
2018/12/07 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
简单了解python反射机制的一些知识
2019/07/13 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
创业计划书的写作技巧及要点
2014/01/31 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
升职自荐书
2019/05/09 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang