python实现图书馆、体育馆自动预约功能

python实现图书馆、体育馆⾃动预约功能
武汉⼤学体育馆场地可以从⽹上进⾏预约,包括⽻⽑球场,乒乓球场等。预约系统最近是晚上6点开始,可以预约未来2天内的场地。在所有场馆中,室内⽻⽑球场最为抢⼿,经常出现系统刚开放所有场地就被“秒杀”的情况。我有⼏天很想去打⽻⽑球但是是死活约不到场地,对此我很⽣⽓啊,所以就在思考能不能⽤python制作⼀个“抢场地机器⼈”,使其在系统开放预约时准时启动,代替⼈完成预约任务。
在开始之前,请确保你已经准备好:
Python 3.5 或以上;
⼀个顺⼿的编辑器 / IDE,如PyCharm、Sublime Text;
Python基本语法知识
⼏个第三⽅库,requests,剩下time、json、smtplib、email、sys好像是标准库,⾃带了,⽆需安装
这篇教程适⽤于武汉⼤学体育馆预约系统,。
python实现思路
电子蜂毒采集器
正常⼿动预约⾮常简单,先登录然后查对应时间可⽤的场地,点击预约即可,这⾥还有⼀步⽐较关键是⽀付,调⽤⽀付并完成⽀付还是⽐较⿇烦的,但是如果本省在系统中有⾜够的余额便可以⼀键⽀付。转换成python来看就更简单了了,⾸先登陆,在保证账户余额⾜够的情况下,可以跳过查位置的问题,直接对向预约的场地发起预约请求,使⽤余额⽀付即可。接下来就让我们试试看:
⾸先是登陆⽤户,很简单,这个登陆界⾯链验证码都没有,⾮常easy,打开浏览器的F12,切换到⽹络界⾯,勾选持续⽇志,输⼊⽤户名和密码,就登⼊了系统,在浏览器的⽹络界⾯中(Firefox和Chrome皆可),就可以看到有⼀个POST请求的参数就是你的⽤户名和密码,⽤这个地址就可以⽤python登陆咯。这是登录后的界⾯。
登录其实就是你把⽤户名密码提交过去,服务器给你返回⼀个Token或者Session,使⽤这个作为cookie的⼀部分后续服务器就知道你是谁了,所以使⽤python第⼀步登录然后就是获取这个Token或者Session。这个服务器使⽤的是session,登录并获取session的代码这样写。这⾥注意⼀点,进⾏post访问的时候需要⼀个⽂件头,来伪装⾃⼰的⾝份,否则原始程序的⾝份可能会不能访问哦。
def Login(name,pass):
url = 'gym.whu.edu/loginAction!UserLogin'
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0'}
param = {'name':name, 'password':pass}
session = requests.Session().post(url, headers = head, data = param)
_dict())
登录之后,并成功获取了Session,接下来正常操作应该是可⽤场地,但是我们是直接预约嘛,其实是可以跳过场地这个过程的,直接看看提交预约时,你给服务器发送的数据即可。在浏览器中进⾏⼀次提交,到这个关键的post,可以看到以下⼏个参数
fdId=32
beginTime=2019-09-21+12:30:00
endTime=2019-09-21+13:30:00
ffId=4
ggId=2
usrId=990
money=7.00
ordTime=2019-09-19+19:30:00车载厨房
payType=2
研究了下,fdid应该是预定的场地编号,后⾯是起⽌时间,然后ffid是运动类型编号,ggid是场馆编号,usrId应该是使⽤cookie的⽤户账户,尝试登陆其他账户也是990,就不⽤了管了,接下来花钱的⾦额,后⾯ordtime应该就是请求发出的时间,最后⽀付类型,使⽤python把这些参数发出即可。函数
这么写
def Res(JSESSIONID, fdId):
Time = '2019-09-21'
url = 'gym.whu.edu/OrderAction!bookOrder?deposit=0.00'
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0',
低频声波吹灰器'Host': 'gym.whu.edu',
修鞋技术
'Accept': 'application/json, text/javascript, */*; q=0.01',
'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',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Content-Length': '150',
'Connection': 'keep-alive',
'Referer': 'gym.whu.edu/wechat/booking/gymHome.jsp?ggId=4',
'Cookie': 'iPlanetDirectoryPro=kZtrSgx3gCXpsQecF4Elfb; JSESSIONID=' + JSESSIONID}
strtime = time.strftime('%Y-%m-%d+%H%%3A%M%%3A%S',time.localtime(time.time()))
param = 'fdId=' + fdId + '&beginTime=' + Time +'+19%3A30%3A00&endTime=' + Time +\
'+20%3A30%3A00&ffId=18&ggId=4&usrId=990&money=10.00&ordTime=' + strtime + '&payType=2'
res = requests.post(url, data = param, headers = head, verify=False)
return(res)
这⼉我把头写的完善了点, 把乱起⼋糟的东西都加上了,还有最重要的session。仔细看代码,有些不⼀样
这⾥敲⿊板,这⾥坑害了我好久,让我尝试⽆数遍的地⽅。
哪⾥不⼀样呢?在参数中的时间那,本来是冒号的地⽅我改成了%3A,参数直接写成冒号传⼊,报错Struts Problem Report,这个错误害的我好苦,⽹上并没有解决⽅案。最后试了许久想到是不是编码的问题,所以换了下编码⽅式,具体想了解Unicode和UTF-8以及ANSI 的同学可以⾃⾏百度。换成这个传⼊参数柳暗花明⼜⼀村,终于成功了,击掌
最后,预定成功了,我得知道啊,上⽹查了下,我QQ都不如发邮件⽅便,这个都是⽹上查的,直接上代码吧。
def send(flag, mess): #传⼊flag(成功与否的标志),mess(预定的位置时间)
mail = smtplib.SMTP()
mail.login("x1@qq", "xxxx")  # 账号和授权码
if flag == 1:
print('预定成功')
message = MIMEText(mess)  # 邮件内容
message['Subject'] = Header('⽻⽑球场预定成功提醒')  # 邮件主题
mail.sendmail("x1@qq", ["x2@qq"], message.as_string())  # 发送账号、接收账号和邮件信息
授权码查⽅法如上所⽰。
好了,基本主要功能就完成了,在指定时间把程序跑起来就可以了,不需要掐好时间,我的想法是没到时间代码就沉睡,每10s判断⼀下到时间没,到开始预约的前⼀分钟,开始登陆预约操作,直到预约成功,发送邮件并跳出循环,结束程序,代码就完成了。
if __name__ == '__main__':
print('sleep_now', end = '') #未到时间,休眠
while True:
strtime = time.strftime('%H%M',time.localtime(time.time()))
if strtime == '1759':
print('Start Booking')
res = Res(jsid, '36')
trytime = 1桥梁钢模
while res.headers['Content-Length'] != '1':
trytime += 1
res = Res(jsid, '36')
time.sleep(1)
if trytime > 20:
send(0, '预定失败')
print(trytime)
send(1, '预定成功')
break
else:
time.sleep(10)
print('.', end = '')
最后,放⼀个全部代码吧,⽅便⼤家使⽤
import time
import json
import smtplib
from import MIMEText
from email.header import Header
import sys
def Login(name,pass):
url = 'gym.whu.edu/loginAction!UserLogin'
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0'} param = {'name':name, 'password':pass}
session = requests.Session().post(url, headers = head, data = param)
_dict())
def Res(JSESSIONID, fdId):
Time = '2019-09-21'
url = 'gym.whu.edu/OrderAction!bookOrder?deposit=0.00'
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0',  'Host': 'gym.whu.edu',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'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',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Content-Length': '150',
'Connection': 'keep-alive',
'Referer': 'gym.whu.edu/wechat/booking/gymHome.jsp?ggId=4',
'Cookie': 'iPlanetDirectoryPro=kZtrSgx3gCXpsQecF4Elfb; JSESSIONID=' + JSESSIONID}
strtime = time.strftime('%Y-%m-%d+%H%%3A%M%%3A%S',time.localtime(time.time()))
param = 'fdId=' + fdId + '&beginTime=' + Time +'+19%3A30%3A00&endTime=' + Time +\
'+20%3A30%3A00&ffId=18&ggId=4&usrId=990&money=10.00&ordTime=' + strtime + '&payType=2'
res = requests.post(url, data = param, headers = head, verify=False)
return(res)
def Send(flag, mess): #传⼊flag(成功与否的标志),mess(预定的位置时间)
mail = smtplib.SMTP()
mail.login("x1@qq", "xxxx")  # 账号和授权码
if flag == 1:
print('预定成功')
message = MIMEText(mess)  # 邮件内容
message['Subject'] = Header('⽻⽑球场预定成功提醒')  # 邮件主题
mail.sendmail("x1@qq", ["x2@qq"], message.as_string())  # 发送账号、接收账号和邮件信息
if __name__ == '__main__':
print('sleep_now', end = '') #未到时间,休眠
while True:
strtime = time.strftime('%H%M',time.localtime(time.time()))
if strtime == '1759':
print('Start Booking')
res = Res(jsid, '36')
trytime = 1
while res.headers['Content-Length'] != '1':
trytime += 1
摩根轧机res = Res(jsid, '36')
time.sleep(1)
if trytime > 20:
Send(0, '预定失败')
print(trytime)
Send(1, '预定成功')
break
else:
time.sleep(10)

本文发布于:2024-09-22 15:47:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/260623.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:预约   时间   预定   完成   账号   参数   程序
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议