看到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)哦。嘻嘻。
本脚本只作为学习练习的试手,不做任何其他目的。
原文地址:https://www.cnblogs.com/CooperXia-847550730/p/10006205.html