写了一个预约东南大学体育场馆的python脚本,目前刚刚实现功能,后续会继续完善

看到git上有人写了一个自动预约的脚本,正好前段时间在学python爬虫和脚本,索性也写了一个,大佬直接略过。

目前没有做图形化,账号和预约信息也是手动输入的,我也只写了羽毛球和乒乓球,其实就是一个属性的值。嫌麻烦的同学可以写一个文本文件,保存这些信息,然后倒入到脚本里,每次稍作修改就可以了。如果基友固定的话,也可以写死在脚本里。

本篇博客只说下博主写脚本的时候遇到的问题和心路历程,只是想要代码的可以直接忽略下文,代码已经上传github:https://github.com/CooperXxx/seuScript。

本脚本需要urllib、PIL、pytesseract等模块,没有的同学先安装一下。

 

第一步:登陆个人信息门户 

首先是登陆个人门户,一般是从和这个接口登陆,https://newids.seu.edu.cn/authserver/login?goto=http://my.seu.edu.cn/index.portal,但是发现这个登陆接口的表单密码是加密处理的,还有一些属性不知道是什么,也猜测不出来。

所以博主找到了另一个预约场馆的登陆接口:http://ids1.seu.edu.cn/amserver/UI/Login,这个表单就非常简单了,每个key也都可以猜测到是什么意思。

使用urllib构建POST请求,并模拟浏览器登陆:

//构建POST请求中的提交信息和URL

url='http://ids1.seu.edu.cn/amserver/UI/Login'

userid = input("输入学号:")
password = input("输入密码:")

postdata1 = urllib.parse.urlencode({
'IDToken1':userid, 
'IDToken2':password,
'IDButton':'Submit',
'goto':'http://yuyue.seu.edu.cn/eduplus/order/initOrderIndex.do?sclId=1',
'gx_charset':'utf-8'
}).encode('utf-8')

//构建Request,模拟浏览器请求,登陆

req = urllib.request.Request(url,postdata1)

req.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36")

cjar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
urllib.request.install_opener(opener)

data = opener.open(req).read()

注意:登陆需要验证证书,不然会出错,所以之前加上:

ssl._create_default_https_context = ssl._create_unverified_context

且ssl需要引用。

 

第二步:识别验证码和构建预约表单

使用google浏览器的开发者工具寻找表单页面: 

这里发现了可以直接打开的预约表单页面:

http://yuyue.seu.edu.cn/eduplus/order/order/initEditOrder.do?sclId=1&dayInfo=2018-11-23&itemId=7&time=12:00-13:00

和验证码的URL:

http://yuyue.seu.edu.cn/eduplus/control/validateimage

 

验证码获取和识别:

urllib.request.urlretrieve('http://yuyue.seu.edu.cn:80/eduplus/control/validateimage', 'validateimage.jpg') 
img = Image.open('validateimage.jpg')
s = pytesseract.image_to_string(img)

使用urllib获取到了验证码图片,再用pytesseract识别。因为验证码实在是太简单了,所以直接就能识别。(不知道pytesseract是什么的童鞋,自行百度)

才发现自己吧验证码down到本地了,不过懒得改了,嘻嘻。下次再说。

 

还是用开发者工具寻找处理表单请求的URL:

judgeUseUser.do:这个请求是用来判断表单信息是否合法的,其实在脚本里可以跳过。

insertOrder.do:这才是真正的处理表单信息的请求,URL:http://yuyue.seu.edu.cn/eduplus/order/order/order/insertOredr.do?sclId=1

表单里面的属性,大家自己去看吧,注意其中有个邀请人ID和学号是不一样的,比如我的室友的ID是120542,但是这个属性又是必须有的,所以你要自己用谷歌开发者工具或者抓包软件自己去找一下。

 

下面构建表单请求并且执行:

reservetime = input("输入想要预约的时间(格式:2018-11-25 09:00-10:00):")

item = input("输入数字7或者9(7代表乒乓球,10代表羽毛球):")
inuserid = input("输入被邀请人ID(不是学号,需要自己去查,例如120542代表谢龙龙):")
phone = input("输入手机号:")

postdata2 = urllib.parse.urlencode({
'orderVO.useTime':reservetime,
'orderVO.itemId':item,
'orderVO.useMode':'2',
'useUserIds':inuserid,
'orderVO.phone':phone,
'validateCode':s,
}).encode('utf-8')

url2="http://yuyue.seu.edu.cn/eduplus/order/order/order/insertOredr.do?sclId=1"
req2 = urllib.request.Request(url2,postdata2)
req2.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36")
data = opener.open(req2).read()

print(data)

 

 

最后如果打印出没有空余场地就是没场地了,

print出success就是成功预约啦,拿来玩的童鞋记得去系统里取消预约哦,

print其他东西就是出错了哦。

 

最后的最后,有问题的可以给博主留言,

有问题的妹子,可以加博主的微信(xwd2363)哦。嘻嘻。

 

 

本脚本只作为学习练习的试手,不做任何其他目的。

 

posted @ 2018-11-23 11:57  Cooper_Xia  阅读(2647)  评论(4编辑  收藏  举报