自己写一个教务管理系统助手

前言

由于本人已经退休,且无法登录教务管理系统账号了(不知道是忘了密码还是账号没了…),所以秉持授人以鱼不如授人以渔的精神,分享一下我当时写教务管理系统助手的一些经验心得。

由于无法登录,自然无法写成详细的教程。不过整个过程并不难,相信大家只要肯动手尝试,你也可以很快写出来!

附上本人以前写的 Shitcode,由于穿戴教务处几乎时不时就会更换 api,所以这个仓库可能已经不可用… 但是我也无法 fix 了。大家可以自己写新的(相信你们怎么写都写的比我的 Shitcode 要好),或者给我提 PR,非常欢迎!

技术

  1. 首先你需要会基本的 Python 编写
  2. 你需要学习 Python 中的 request 库,尤其是request.session 部分的使用
  3. 我还使用了 Python QT,用的是 PySide2 这个库。我选择这个是因为图形化界面比较好操作,而且图形界面可以用选择组件然后拖动的方式来创造,前端懒人福音哈哈哈,命令行的话打字选择啥的都很麻烦。当然,你也可以自己写别的不用这个。

如果上面有你不会的知识,没有关系!我这里给一个速成我觉得还可以的教程:

里面关于 Python 的教程:https://www.byhy.net/tut/py/basic/01/

里面关于 Python request session 的教程:https://www.byhy.net/tut/auto/apitest/03/

里面关于 QT 的教程:Python Qt 简介 | 白月黑羽

这个人也有对应的B站视频,感兴趣可以看看

代码讲解

我以我的代码为例进行讲解,虽然现在来看结构写的很菜~但是希望带大家了解这个程序的原理就行~

整个网络请求部分的核心都在 SCU-URP-Helper/modules/ 里面。有一个 http_main = requests.session()utils.py 里面,由于其他所有模块都是要引入 utils.py 的,所以这个相当于一个全局通用的 session,可以理解成登录和各种请求都是它在进行

第一个重点来了!我该如何登录呢~

这个地方的解说可以对照 SCU-URP-Helper/modules/userLogin.py at master · IcyFeather233/SCU-URP-Helper · GitHub 代码来看

我们知道登录页面要输入 学号、密码、验证码。当我们点击登录按钮的时候,实际上是发送了一个 HTTP 请求(科普:https://www.runoob.com/tags/html-httpmessages.html)。然后我们需要进行“抓包”分析。“抓包”就是抓到这个 HTTP 包看看,主要就是看看请求类型、目的 URL、发送的数据内容。我们可以通过浏览器自带的“开发者工具”来实现这一点。

不会浏览器抓包的可以自行网上搜索嗷,由于不能登录所以不能详细讲解了

经过抓包我发现(我这里讲的是我当时抓的包,现在可能已经变了)是向 http://zhjw.scu.edu.cn/j_spring_security_check 发送了一个 POST 数据包,request body 的数据是一个 json,有以下字段:

post_data = {
        "tokenValue": sself.tokenval,
        "j_username": username,
        "j_password": http_hash,
        "j_captcha": captcha}

显然他们的意思从上往下代表着 token值(可能你现在还不懂这个是干啥的,不要慌),学号,密码,验证码。

然后你会发现,密码并不是你输入的那个密码,而是一个复杂的字符串。其实是因为前端发送的是进行了 md5 编码后的密码。这个很容易验证,你找个 md5 编码器试一下就知道。

那么 tokenValue 到底是个啥呢?

经过对其他包的内容进行关键字搜索,我们可以在对 http://zhjw.scu.edu.cn/login 页面的请求中发现这个字段。而且每次请求,这个字段都不一样。我们可以想到:嗷,原来这个 TokenValue 是和验证码匹配的~每次请求的 TokenValue 都不一样,每次的验证码也不一样。我们获取到 TokenValue 的同时,也获得了一个验证码,这样就保证了,如果我们必须输入当前页面的验证码才能通过验证。聪明的你可能也想到了,如果我刷新验证码,这个 TokenValue 自然也是会变的。

还有很多很多其他的细节,都在我的代码里面啦!只要你懂得基础的抓包就应该可以轻松看懂代码。不管是各种各样的页面请求,还是判断是否登录成功、选课成功,都和各种网络包分析离不开关系,而这也需要你熟练地使用浏览器的“开发者工具”进行网络抓包。

总之,这篇教务管理系统助手入门帖就到此为止了!希望我可以抛砖引玉,让你们感受到 Python 模拟网络请求的魅力 ovo