您的位置:首页 > 编程语言 > Python开发

[Python] Mua.cm 中大自动选课系统课书CourseBook建立总结

2016-02-17 21:40 1486 查看

Mua 我们一路与你同行

网站首页: http://mua.cm 因为是国外服务器,所以比较慢,国内可以访问备用站点:http://sysu.iego.cn

该项目已开源,Github地址https://github.com/iFe1er/mua

(注意:fork后需要重新配置wechat公众号接口和email接口)

配置环境

Python 2.7.10
MySQL
Chrome
Fiddler4
Ubuntu 14.04 + supervisor + virtualenv 平台
Nginx + gunicorn 部署

module:
requests
flask
flask-bootstrap
gunicorn
MySQLdb
SQLAlchemy
flask-sqlalchemy
lxml
wechat-sdk
Pillow(PIL)
pytesser


基本原理

总: 前端Bootstrap + 后台flask + 后台循环 requests

1. 利用requests库模拟登录教务系统

这一点不多赘述,参见zing大大的这篇文章。通过requests可以轻松完成

http://blog.csdn.net/mr_zing/article/details/46835325

2. 利用pytesser识别验证码

使用的是google的开源OCR库tesseract, 在linux下的部署也比较简单,要求环境中已经安装了PIL(PIL库建议使用pillow库)

pip install Pillow

安装完增加其他文件格式的环境,例如本次需要jpeg格式的

然后sudo apt-get install tesseract-ocr 安装图片识别库,接着用pip install pytesser 安装python环境的识别支持。

3. 小麦的冷笑话+匿名树洞

mua.cm这个页面目前有多个标签页,例如匿名树洞在/annoy,小麦的冷笑话在/jokes。

匿名树洞无非就是把用户的nickname+留言存在数据库里,然后展示出来(注意分页功能的实现)

至于冷笑话是怎么抓取的,技术上不难,可以参见我之前的博客,不过这次我不是抓的糗百因为糗百太污了。。这次我用的是lengxiaohua.com/random这个源

抓笑话具体的方法可以看我之前的博客:

http://blog.csdn.net/xiaomai_sysu/article/details/49284901

4.课书-选课和退课

利用Chrome的审查元素Network+Fiddler4,抓取发送的http包,然后注意到用的身份认证不再是帐号密码,而是登陆后系统分发的cookie以及对应的sid编号,如下



原理就是如此,要结合模拟登陆步骤1的cookie和匹配的sid号,把这些信息,对应用ORM保存在mysql的不同列中,方便后台程序的刷课。

5. 关于“选课”和“退课”的页面显示

抓取到课程列表是不难的,难就难在把课程列表用合适的方式显示出来。这里用到一个小技巧,利用正则匹配,直接修改掉对应课程链接的地址,返链到flask监听的一个地址上,利用jinja2模板,可以获得用户所点击的选课和退课编号。

这样做的好处在于,不仅不需要费时费力把全部信息(包括课程名、老师名、上课时间等等)抓取下来,然后自己慢慢写前端;而且可以直接把这些信息以用户熟悉的方式显示出来,从而避免错误,一举两得。

用户点击后把所需登录信息+选课退课课程编号保存在数据库中,用于后台程序刷课

6. 后台监视程序刷课

结合requests,抓取【已选课程列表】、【可选课程及空位人数列表】

判断逻辑:

【先退后抢】,1 检查是否有空位 没有跳过 2 有空位,退课,立刻选课 3.检查是否选课成功,如果成功更新状态 4选课失败,选回原课程

【直接抢课】,如果有空位,选课,并检查.获取新的列表。如果选课成功,更新状态status为2(成功),否则不更新状态,返回继续监视。

(结合第四步实现监视功能)

7. 微信公众号接入

申请公众号-进入开发者模式

感觉微信这个安全意识还是比较到位的,利用flask完成服务器地址的认证,就可以接收消息了,验证方式

L = [request.args.get('timestamp'), request.args.get('nonce'), token]
L = sorted(L)
s = L[0] + L[1] + L[2]
hashlib.sha1(s).hexdigest()==request.args.get('signature'):
#do someting: process and reply


想偷懒也可以用wechat-sdk模块,详见wechat-sdk的文档,不多赘述

然后根据用户输入的学号,把用户id、选课编号、退课编号、状态信息等构造出来,然后发送给微信用户。

7.总体逻辑

分四层:前端、后台、数据库、刷课程序,每一层功能与相邻的层息息相关。一图胜千言,请点开下面的大图查看逻辑



8. 未来改进

1. 查询界面不够友善和详细;查询结果增加历史查询功能;增加web页面的查询功能;

2. 没有实现体育课选课

3. 目前仅适用于在第三阶段“先到先得”阶段

4. 可以改进选课页面美观度,没办法..还没学jquery和ajax

Mua

网站目前正处于构思当中,目标是做一个大家喜欢的网站。网站内容将会但不限于包括匿名留言板、微博段子、微公益、高校二手交易、匿名社交、选课抢课系统、学校/学院最新资讯等。亲爱的你,如果有任何想法(ideas)与建议(suggestions),或者您也有兴趣一同合作建设MUA社区,都可以按下面方式联系我们。我们收到消息后,会尽快与你联系。让我们携手共进,建设一个人人都喜欢,人人都爱用的综合网站平台。

Contact me:

中山大学东校区-数据科学与计算机学院

广东省广州市广州大学城外环东路132号

Mail: 1341414814@qq.com

或者在http://mua.cm/contact 给我留言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息