图书馆研习室座位自动预约

简介

现在好多学校为学生提供了非常良好的学习环境,通常体现在自习教室的设施设备上。对此不得不提一句的就是我们学校的图书馆,随着新图书馆的修建,馆内也设置了多个功能区,每层分为A、B、C、D四个区域,由南北连廊相连,中间由旋转楼梯贯通一至五层。A区为自修区;B区和C区为藏阅一体的社会科学和自然科学书库;D区为专项功能区,包含影视厅、数字媒体创客体验中心、智慧培训教室、云桌面电子阅览室等;B、C区东西连廊设有大小十二间研习室;南北连廊设有休闲阅读区。

上面那段我是从图书馆官网上抄的,不过真的得为学校的图书馆点个赞。回归本篇文章正题,学校免费为广大师生提供了舒适优良设备齐全的研习室。但是这些研习室是需要进行网上预约才能够进入使用,每天的00:00开启下一天的预约,因此要想约到一个时间段(3小时)的研习室,可谓得“挑灯夜战”。当然,在这个过程中手速快将有巨大的优势。如果晚上休息的早,手速又不快,基本上就别想预约到研习室了。刚刚好最近学了一点python爬虫,就打算用爬虫帮我完成这个艰巨的任务了。哈哈哈哈!(ps:防止恶意访问,所有链接就不放了哈)

python实现思路

想想思路还是挺简单的,无非就是登录账号、查找房间、提交预约。那就让我们试试看:

登录账号

首先打开我们研习室预约的登录界面,链接为:U2FsdGVkX19NdfJkghN54Msvy1zl7AucRur/ct0nz4orPI7uLkSDsvuFMgr0fGcO
rn9Z/f8h3bds9w==

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qgf87ktR-1571214787380)(https://i.imgur.com/eiM0X9A.png)]

好吧,这第一步登录账号就非常考验我这个新手了,不过不能怂。通过参考其他一些大佬使用的方法,就是打开firefox的firebug(ctrl+shift+e)查看网络情况,在这个情况下进行一次正常的登录。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A1acmRST-1571214787380)(https://i.imgur.com/CuX87Dz.png)]

可以看到我们这里有个post,到时便可以使用python中requests.post方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNVfK85O-1571214787381)(https://i.imgur.com/nX1KCjH.png)]

为了能够成功的登录,要隐藏自己是个爬虫的身份,在消息头中,可以看到我们的请求头,只要将参数都复制过来,组成自己的headers = {…}来欺骗服务器。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJP98LBB-1571214787381)(https://i.imgur.com/dpPAWYv.png)]

看一下参数这一页,这里的表单数据只有三个,分别对应着验证码、账号和密码。将这里的参数复制过来,就可以组成我们的data = {…}。其中需要我们的注意的就是这个验证码,无论是人工“自”能识别,还是机器自动识别,都需要将验证码保存为本地文件。如此一来,就有了一个问题,每访问一次服务器,验证码就会变换。现在让我们好好捋捋思路,首先我们得获得验证码并将其保存在本地,这就需要访问一次服务器,最后我们要提交我们的参数进行登录,这又再一次访问了服务器,这次的验证码和我们获取的验证码已经不是同一个验证码了。在刚刚开始的尝试中我无论如何无法登录服务器,就是两次的验证码不匹配。如何实现第一次获取的验证码和提交时的验证码相一致呢?

这里就需要同一个cookie在上面的几个图中,我们都能看到有个cookie值。要保证同步,这里就需要做到,我们获取验证码时的cookie值和提交账号密码时的cookie值一致。因此,在我的程序中,我先做的一个步骤时先获取一个cookie值,然后将这个cookie值作为headers中的一个参数。登录的思路就是这样了,补充一句,这里的验证码我是自己手动识别的>﹏<。

查找房间

这个步骤其实是一个无用的步骤,为什么有这个步骤,按照人为预约习惯,我们会产生怎么一个步骤,但是如果使用爬虫,只要成功登录之后就可以直接提交预约的表单。当然,如果要使得自动预约程序更加智能,便可以添加这个步骤,可以查看那些房间是还可以预约的,在这里自定义的补充一些规则。我就略过了。。。

提交预约

同登录一样,我们也手动的提交一次,去查看网络情况,便可以用python模拟这一个过程。在这里我就不在贴图进行解释,这里提交也是用requests.post的方法。不过一点要注意的是,这里的headers和登录时的headers是不一样的,所以在此提醒各位,如果在其他类似的预约程序中可以注意看看不同内容post时的headers是否一致。我在这里就被坑了一会。

Python_Code

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
#
# @Version : 1.0
# @Time    : 2018/4/10
# @Author  : 圈圈烃
# @File    : reservation_4.py  import requests
import re
import json
import datetime
import timedef get_cookies():"""获得cookies"""get_cookies_url = 'http://**************'s = requests.session()s.get(get_cookies_url)ck_dict = requests.utils.dict_from_cookiejar(s.cookies)     # 将jar格式转化为dictck = 'JSESSIONID=' + ck_dict['JSESSIONID']                  # 重组cookies"""获得二维码"""path = './code.png'get_img_headers = {'user-anget': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0','Cookie': ck}get_img_url = 'http://**************'code_image = requests.get(get_img_url , headers=get_img_headers)with open(path, 'wb') as fn:fn.write(code_image.content)fn.close()print('验证码保存成功')return ckdef login(cookies, hour, minute):login_headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Cache-Control': 'no-cache','Connection': 'keep-alive','Content-Length': '45','Content-Type': 'application/x-www-form-urlencoded','Cookie': cookies,'Host': '**************','Pragma': 'no-cache','Referer': 'http://**************','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'}login_url = 'http://**************'login_data = {'codeImage': input('请输入验证码:'),'uname': '**************','upass': '**************'}requests.post(login_url, data=login_data, headers=login_headers)res = requests.get('http://**************', headers=login_headers)reg_h = r'<option value=(.*?)>\d{4}-\d{2}-\d{2}'  # 匹配可提供预约的hashvalue_h = re.findall(reg_h, res.text)"""定时"""counter = 0while (True):now = datetime.datetime.now()  # 获取当前系统时间if now.hour == hour and now.minute == minute:breaktime.sleep(0.5)# print(now)counter = counter + 1if counter == 240:res = requests.get('http://**************', headers=login_headers)reg_h = r'<option value=(.*?)>\d{4}-\d{2}-\d{2}'  # 匹配可提供预约的hashreg_t = r'(\d{4}-\d{2}-\d{2})'  # 匹配可提供预约的日期value_h = re.findall(reg_h, res.text)value_t = re.findall(reg_t, res.text)with open('./con_log.txt', 'a') as fjs:fjs.write(eval(value_h[-1])+'  '+value_t[-1]+'  '+str(now)+'  \n')fjs.close()print('保存成功')counter = 0return str(eval(value_h[-1]))def reservation(day_hash, cookies, stime, etime):reservation_data = {'_etime': etime,  # 结束时间11点,其值为11*60=660'_roomid': '1285b3ca77594b3095c7b89d4922553c',  # 房间Id'_seatno': '','_stime': stime,    # 开始时间8点,其值为8*60=480'_subject': '学习',  # 研讨主题'_summary': '学习',  # 研讨大纲'ruleId': day_hash,'usercount': 3,     # 预约人数'users': '**************',  # 学号'UUID': '**************'}reservation_headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Cache-Control': 'no-cache','Connection': 'keep-alive','Content-Length': '239','Content-Type': 'application/json','Cookie': cookies,'Host': '**************','Pragma': 'no-cache','Referer': 'http://**************','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'}reservation_js = json.dumps(reservation_data)reservation_url = 'http://**************'status = requests.post(reservation_url, data=reservation_js, headers=reservation_headers)# print(stime, etime)# print(status)print(status.text)def main():"""预约策略一:11:20-20.40"""full_stime = ['1060', '870', '680']full_etime = ['1240', '1050', '860']"""预约策略二:10:00-13:00;13:50-16:50;17:40-20:40"""stime = ['1060', '830', '600']etime = ['1240', '1010', '780']cookies = get_cookies()day_hash = login(cookies, 0, 0)     # 设定定时时间for i in range(0, 3):reservation(day_hash, cookies, stime[i], etime[i])if __name__ == '__main__':main()

实现效果

自从学了python,妈妈再也不用担心我抢不到研习室了。在程序中加几行定时的程序之后,便可以在00:00自动帮我预约研习室了。通过测试发现,预约时很大程度上是能够约到房间的,例如在4-12号,约好三个时间段是用了7秒,但是在4-13号居然花了21秒,而且使得一个时间段被其他同学约走了。当然这个程序还需要进一步改进,实现完胜“手速”。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G86BUCSy-1571214787381)(https://i.imgur.com/OSLZ0uw.png)]

补在最后

看到好多小伙伴有类似的需求,不是经常看CSDN了,如果要交流的小伙伴,可以到我的个人博客留言评论,我将尽快回复哦:圈圈烃的博客

图书馆研习室座位自动预约相关推荐

  1. Python爬虫 | 图书馆公众号座位自动预约【从0到1】

    引言 图书馆座位太难预约了! Case 1:抢座开始时间点,网堵,页面卡顿. Case 2:疫情期间,24小时书房每天仅有50个座位可预约. Case 3:可能有其他事情耽搁了,忘记抢座,稍晚点回来, ...

  2. python图书馆预约系统_python实现图书馆研习室自动预约功能

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. python初学火车座位判断_初学Python实现学校图书馆座位自动抢座预约

    初学Python实现学校图书馆座位自动抢座预约 初学Python实现学校图书馆座位自动抢座预约 最近突然有个想利用python爬取学校图书馆预约的想法(因为图书馆单人的座位很难抢)可是没学过pytho ...

  4. python判断座位号_利用Python实现图书馆座位抓取(自动预约),python,抢座

    脚本功能 系统开放座位时快速预约指定位置 可以设置预约的时间段 运行以后会一直帮你抢,需要手动停止 即使遇到更强的脚本自动帮抢下一个座位 实现 首先解决登录问题,通过F12找出登录请求包,分析对比一下 ...

  5. 座位预约php,座位管理系统预约规则

    座位管理系统预约规则 1.每天7:00开始,读者可以预约当日或次日的座位,预约成功后读者可以使用该座位至当日闭馆.预约系统登录用户名为学号/工号,密码为公共数据库密码. 2.读者可通过以下三种方式预约 ...

  6. python 写脚本 预约课程_Python盘纪念币系列之三:自动预约脚本编写 03 系列总结...

    前一篇遗漏了"预约兑换日期"的自动输入,这篇文章将介绍如何处理.另外,将会对"Python盘纪念币系列"做一个简单的总结. 自动输入预约兑换日期 不像文本输入框 ...

  7. python+selenium+docker+飞书机器人部署自动预约程序

    python+selenium+docker+飞书机器人部署自动预约程序 项目介绍 python+selenium 滑块验证 selenium提示元素无法操作 无法定位到元素 接口+服务器部署 本地测 ...

  8. Python 能预约自动预约脚本

    这里写自定义目录标题 Python 能预约自动预约脚本 数据库结构 代码 Python 能预约自动预约脚本 记录一下 数据库结构 使用的是MySQL,结构如下: 这个数据库用于存放要预约的信息,便于批 ...

  9. 计算机毕业设计PHP高校自习室座位网上预约小程序(源码+程序+uni+lw+部署)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: phpStudy+ Vscode +Mysql5.7 + HBuilderX+Navicat11+Vue ...

最新文章

  1. python基础(7)-函数命名空间作用域闭包
  2. UITableView的动态获取高度 排版
  3. 百练2815 城堡问题
  4. Python-OpenCV基本操作
  5. 关于使用IDEA导入项目后依赖报错的解决方案
  6. FreeBSD磁盘标签实例分析
  7. 两种方式从Mac计算机上的启动板菜单中删除应用程序?
  8. 凑热闹买了个小米剃须刀
  9. matlab计算边界层厚度,边界层厚度.PPT
  10. 浅谈机器学习-分类和聚类的区别
  11. 微软雅黑有版权,UI设计有哪些免费的字体?
  12. 矩阵卷积、矩阵相乘以及频域相乘之间的关系
  13. 最新版本kindle安卓app导入mobi图书和设置自定义字体的方法2020.01.09
  14. window10 时间同步出错 超时
  15. BugKu-CTF(杂项篇MISC)--disordered_zip
  16. 中文分词技术(一):规则分词
  17. MIMO技术杂谈(四):OFDM那些事(二)
  18. Linux elf可执行文件加密
  19. 二十岁,无资本,无未来 --《意林》
  20. 灵性图书馆:好书推荐-《巫士唐望的教诲》

热门文章

  1. 配置dovecot服务(3)
  2. html第二章排列页面内容题目,HTML教程 第二章 页面布局及文字设计.doc
  3. echarts按照时间显示柱状图_echarts 不连续的柱状图 在线时间分布离散图
  4. Python为什么要使用包管理、插件化开发?
  5. 关于《佛本是道》的一些看法
  6. Codeforces round #628 C.Ehab and Path-etic MEXs
  7. Eth2.0 -合并(Merge)
  8. news_flash新闻快讯项目 Chapter 1
  9. 《左耳听风》读书心得之高手成长篇书单
  10. scrapy爬虫实战:安居客深圳二手房