python实现东南大学体育馆自动预约

0. 项目github地址https://github.com/kimixuchen/GymAutoOrder

1. 背景

东南大学体育馆场地可以从网上进行预约,包括羽毛球场,乒乓球场,健身房等。预约系统早上8点开放,晚间关闭,而且当天只能预约未来2天内的场地。在所有场馆中,室内羽毛球场最为抢手,经常出现早上8点系统刚开放所有场地就被“秒杀”的情况。本人碰巧是个学习计算机的羽毛球爱好者,况且前段时间在学习python,所以就在思考能不能用python制作一个“抢场地机器人”,使其在系统开放预约时准时启动,代替人完成预约任务。
下图为羽毛球预约界面,可见已没有空余场地
python实现东南大学体育馆自动预约_第1张图片

2. 工具

本程序主要使用了python的urllib,urllib2,cookielib,以及PIL等,类似一个agent,具体如下:
1. python2.7
2. PIL(用于处理图形验证码)
3. windows 10平台

3. 程序执行细节

1. 登陆自助平台

平台登录页面认证框如下:
python实现东南大学体育馆自动预约_第2张图片
通过浏览器的后台监控,可以看到提交了一个POST请求,内容主要包含用户名和密码,所以实现比较简单,大致代码如下:

req = urllib2.Request(    
        url = self.loginUrl,    
        data = self.loginPostdata,
        headers = self.headers
)
self.cookie = cookielib.CookieJar()    
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
result = self.opener.open(req)

2.场地预约

下图为预约场地界面:
python实现东南大学体育馆自动预约_第3张图片
可以看到,这也是一个表单,而且最后将以POST的形式提交到http://yuyue.seu.edu.cn/eduplus/order/order/insertOredr.do?sclId=1这个地址。界面上必填内容为邀请好友,手机号,和验证码,但后台真正提交的信息还包括场馆和时间等,代码如下:

orderPostdata = urllib.urlencode({
               'orderVO.useTime':self.orderday.strftime(DATEFORMAT_Ymd)+self.starttime,
    'orderVO.itemId':'10',
    'orderVO.useMode':'2',
    'useUserIds':'77400',
    'orderVO.phone':'13736542156',
    'orderVO.remark':'',
    'validateCode':validateNum
})
req = urllib2.Request(    
    url = self.postOrderUrl,    
    data = orderPostdata,
    headers = self.headers
)
result = self.opener.open(req)

3. 图片验证码处理

在上一步中可以看到,提交的过程需要用户填写验证码,所以这就要求我们的程序具备验证码自动识别功能。由于这个系统的验证码比较简单,为4个数字,而且没有变形与干扰元素,所以识别起来也不太麻烦,具体流程如下:
python实现东南大学体育馆自动预约_第4张图片
在具体实现方面,我使用了PIL库,它可以很方便的操作图片,而且我专门把验证码的识别做成了一个模块,详见github源码。

4. 使用方式

现在万事俱备,只需在电脑上通过命令行启动程序,然后保持电脑开机,程序将会在第二天预约系统开放时迅速抢到场地,完全战胜人类手速!

你可能感兴趣的:(python实现东南大学体育馆自动预约)