Posted on 

学习通登录接口改动与应对

说来也神奇,前几天刚吐槽过学习通的登录接口简单粗暴,对密码只是进行base64编码的处理,今天就发现原本的登录方式无效了——好在存了cookie,没影响现有的各个任务。

通过JS,可以看到学习通舍弃了原本的加密方式,改为了DES加密:

1
2
3
4
5
if(t == "true"){
var transferKey = "u2oh6Vu^HWe40fj";
pwd = encryptByDES(pwd, transferKey);
//pwd = $.base64.btoa(pwd,"UTF-8");
}

查看encryptByDES 函数:

1
2
3
4
5
6
7
8
function encryptByDES(message, key){
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.ciphertext.toString();
}

不过由于对加密这块不太了解,Python上实现也遇到了些小麻烦,在这里我选择了直接用nodejs写成一个接口,部署到vercel

编写接口

需求很简单:从学习通的这个JS中获取 transferKey , 结合传入接口的密码, 返回加密后的结果。

加密需要用到 crypto-js , 网络请求使用 axios

加密函数直接照搬学习通的即可。

获取key:

1
2
3
4
5
6
async function getKey(){
var url = "https://passport2.chaoxing.com/js/fanya/login.js";
var rg = /transferKey\s*?=\s*?['"](.+?)['"]/;
var req = await axios.get(url);
return req.data.match(rg)[1];
}

最后根据 vercel文档 返回解析结果即可。

1
2
3
4
5
6
7
8
9
10
module.exports = (req, res) => {
const reqs = req.query;
res.setHeader('content-type', 'application/json');
if (reqs.pwd == undefined){
res.send({"code": 1, "msg": "No password."});
}
else {
getKey().then(key => res.send({"code": 0, "result": encryptByDES(reqs.pwd, key)}));
}
}
开往-友链接力
A member of 开往-友链接力

This site was deployed by @OasisLee using Stellar.

本站由Vercel提供托管与Serverless支持 | PlanetScale提供数据库支持