在我们学校的教务系统里,如果你想查成绩,那得先把这学期的老师都评价完。在旧版教务系统中,教师评价一直是一个很烦人的东西:一个教师就要填10个左右的问题,而且同一个教师可能出现多次(课程和实验分开)。那个时候有一个APP叫做“广工校园通”,应该是出自某个工作室之手。但今年寒假我开始发现它不能用了,不知道是因为教务系统改版,他们没有精力做,还是据说这个APP是当时他们参加比赛做的,比完就没人维护了。于是寒假前一段时间我花了点时间抓新教务系统的包,把教师评价做了出来。当时只支持对所有教师评价,无论之前有没有评价过。这里要吐槽一点:后来评价的内容将覆盖之前评价的内容。这阵子突发奇想:不如把这个功能弄进小程序吧,反正正好体验下这么久以来都没碰过的小程序。于是乎就有了这篇东西~

img

抓包

工具选择

  • 这里我用的是Firefox的拓展:HttpFox

img

开始捉包吧

登录

  • 打开非常炫酷的教务系统登录界面

img

  • 打开httpfox的窗口,点击开始。

然后教务系统输入账号密码登录吧~登录进去后把HttpFox暂停了,以免一直通讯的包都捉进来,我们现在要的是登录的包。

  • 就下来我们看到如下的登录包

img

  • 恩,这就是我们要的东西。之后要什么东西,拿着下面这个Cookies就有了通行证啦~

img

微信小程序

注册完小程序后,我直接跳过了官网文档的设计部分,毕竟先实现功能嘛,界面什么的后面再改。开发过程中遇到了一些坑,下面来说下这些坑。

1. 请求必须是Https

仔细看看国内的很多网站,其实都没有使用https。这里不能怪教务系统吧不使用https,毕竟用了的话我们也不好通过捉包来干这事。所以才有了后文的后台程序,提供一个https转发请求的功能。也就是使用自己的服务器来接收小程序的https请求,再用http请求与教务系统通讯。 img

2. 设置页面的后台数据 setData

这里想用setData({})修改后台数据中某个数组中的值。于是乎有了下面的代码。

Page({
  data: {
    strs: [
      'abc',
      'def',
      'ghj',
      'klm'
    ],
    temp: ''
  },
  //事件处理函数
  ...
  changeStrs: function(e){
    var index = e.currentTarget.id;
    this.data.strs[index] = str;
    this.setData({
       strs: this.data.strs
    });
  }
})

后台

其实我也不会什么后台,PHP、NodeJs、Javaweb、Asp.net之流什么的也没玩过。只是因为最近"Py交易"多,所以才用了Python里的Flask框架。这里就没什么技术问题了。都是很简单的请求。这里贴上些简单的代码。

登录请求

  1. 登录
@app.route('/api/gdut/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':                       
        if valid_login(request.form['un'], request.form['pd']):
            return '1'
        else:
            return '0'
    else:
        return "This is Login's API page.~~~"
  1. 获取登录者名字
@app.route('/api/gdut/name', methods=['GET', 'POST'])
def name():
    if request.method == 'POST':                          
        if lg.canLogin(request.form['un'], request.form['pd']):
            return lg.getName(lg.getSession(request.form['un'], request.form['pd']))
        else:
            return '0'
    else:
        return "This is Name's API page.~~~"

后言

总的来说,这个东西并没有什么技术含量。但是经过这次对新教务系统的捉包与api测试,发现有太多吐槽点了。除了之前说的一点:后提交的数据可以覆盖之前提交的数据。大概有这么几点:

  • 教师评价中提交的内容不需要与系统提供的数据相符合 比如有这么个问题“授课过程是否充满热情”,有以下可以提交的内容:很热情、一般、不热情。但是你可以提交一个“十分激情”,甚至把题目提交成你想要的题目。
  • 上面这些数据都是可以重复写入的
  • 登录不触发验证码 本来这个系统是有验证码的,如果你在浏览器上(非隐身模式)登录教务系统,输入几次错误密码,验证码就出来了。但我每次使用的都是一个新的Session,所以没有触发验证码。

时效

学校正在把旧的教务系统上的内容逐步转移到新的教务系统。这期间API会不会变动就不知道了,毕竟做出这玩意来还是得维护的,若之后新教务系统上有了更多功能,这玩意也会更进一下。