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中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
浅谈Python中range和xrange的区别
Dec 20 Python
详解python3中tkinter知识点
Jun 21 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
python使用正则筛选信用卡
Jan 27 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
python动态进度条的实现代码
Jul 03 Python
PyCharm 专业版安装图文教程
Feb 20 Python
如何在向量化NumPy数组上进行移动窗口
May 18 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
php无限极分类实现方法分析
2019/07/04 PHP
jquery 的 $("#id").html() 无内容的解决方法
2010/06/07 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
2014/09/01 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
vue脚手架及vue-router基本使用
2018/04/09 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
python使用pil生成图片验证码的方法
2015/05/08 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
Django中的session用法详解
2020/03/09 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
Python用SSH连接到网络设备
2021/02/18 Python
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
电子信息毕业生自荐信
2013/11/16 职场文书
python数字类型和占位符详情
2022/03/13 Python
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技