华工IamOK自动打卡机

受够了每天进入微信按一键打卡了,尤其是今天不知道为啥企业号打不开网页。干脆在写代码的时候顺便写一下原理吧。

代码戳这里:https://github.com/qhgz2013/useless_scripts/tree/master/05-i-am-not-ok-scut(用python写的)

在填报之前,需要在统一认证平台上登录,根据抓包的顺序,首先会发出GET https://iamok.scut.edu.cn请求,然后会重定向到认证页面https://sso.scut.edu.cn/cas/login?service=https%3A%2F%2Fiamok.scut.edu.cn%2Fcas%2Flogin

登录发出的东西也很简单易懂,一共就6个字段:ulplltrsaexecution以及_eventId

然后研究每个登录字段,根据网页的代码,登录的js来自https://sso.scut.edu.cn/cas/common/js/login2.js?v=2.0,没有混淆以及uglify,非常简单易懂。最后两个字段的内容是固定的,ulpl分别是用户名及密码的长度,也非常容易理解。lt可以从网页的表单变量中获得。剩下就是一坨长长的rsa字段需要仔细研究了。

不过获得这个字段也不难,直接对js debug就会跳到来自https://sso.scut.edu.cn/cas/common/js/des.js的一个strEnc函数上。data就是拼接了用户名、密码以及lt的字符串,剩下的3个key都是写死在js上的了:firstKey永远是"1"secondKey永远是"2"thirdKey永远是"3",无论是重写代码还是直接调用js解释器都能直接获得这个字段的值。

登录过程就很简单了,直接POST到https://sso.scut.edu.cn/cas/login?service=https%3A%2F%2Fiamok.scut.edu.cn%2Fcas%2Flogin上,如果登录成过就会跳转到https://iamok.scut.edu.cn/xxx,登录失败则留在sso页面上,这个可以根据response的url进行判断。

登录完成后,剩下就只有打卡这操作了。看抓包发现GET和POST的JSON都差不多,有一些字段会有些不同(比如空字符串/0/null会互相替换),其他就没细看了,所以直接GEThttps://iamok.scut.edu.cn/mobile/recordPerDay/getRecordPerDay,获取上次填写的JSON,然后再把整个POST到https://iamok.scut.edu.cn/mobile/recordPerDay/submitRecordPerDay,应该就好了。

最后就剩下定时任务了,这个百度一下基本不成问题。

目前正在绝赞测试中。