今天你体温上报了吗?

今天你体温上报了吗?

沉寂一个学期后,终于有空折腾点东西了。不知不觉每天起床第一件事——健康打卡已经快一年了。下至-274℃上至9999999999999℃,都无人过问,有时忘了打卡还要被不停的催。身为程序猿怎么能忍受此般形式主义每天霸占我宝贵的1分钟!(所以我花了两天时间写了这个程序)

下面步入整体,本来我觉得这不就抓个包每天定时发送就行了吗。然而事情并没有想象中那么简单,这个登录状态每天都会失效,所以不能存个cookie就完事。一番研究下,学校的登录认证系统还有点东西。应该是采用客户端cookie+服务端session的方式。


参考了小猴偷米的认证代码,得知网页认证过程如下:

  1. 登录页面包含动态生成的密钥等隐藏表单信息,客户端将账号、使用动态密钥加密和的密码再次POST至登录页地址;
  2. IDS 服务器解析表单参数,判断用户成功登陆,并生成 Ticket 作为参数,请求前端 302 跳到新信息门户;
  3. 前端再次 GET 请求带 Ticket 参数的新信息门户链接;
  4. 新信息门户取 Ticket 参数,私下与 IDS 服务器进行验证,验证成功后向前端颁发统一身份认证 Cookie。

知道了原理后就好办了,依葫芦画瓢把js写的代码翻译成python就行。唯一碰到的难点就是加密算法的实现。原项目中的js代码都是经过混淆的,通过人眼辨认实在太麻烦,我又尝试几种现成的AES加密模式什么CBC,OFB等等,发现输出结果都不太像,看来这其中另有玄机。

既然翻译代码不成,那么万能的python能不能直接运行js代码呢?一查还真有!js2py模块简直是我的救星!

几行代码轻松执行js程序:

1
2
3
4
5
6
7
8
9
10
11
import js2py

context = js2py.EvalJs()
with open("./ids-encrypt.js") as f:
js_content = f.read()

def encryptAES(data, salt):
# 执行整段JS代码
context.execute(js_content)
result = context.encryptAES(data, salt)
return result

获取到登录session后,自然是我说了算了,校内接口轻松访问。

目前主要实现了 体温上报GPA计算 的功能。

具体功能介绍请见GitHub仓库

下面贴几张运行结果图:

每日上报(部署服务器定时任务后简直美滋滋~)

每日上报

GPA计算

GPA计算

今天你体温上报了吗?

https://blog.luzy.top/posts/1769612424/

作者

江风引雨

发布于

2021-01-30

更新于

2021-03-02

许可协议

CC BY 4.0

评论