完美适配小爱课程表(河南科技学院)

1.前言:

前文请参照我的以前的博客:

  1. 青果教务系统适配小爱课程表

本文代码现已开源:

  1. 小爱课程表适配gitee
  2. 小爱课程表适配github

去年的时候试着适配了我们学校的小爱课程表,但是由于水平不够,直接把接口以及参数照搬,代码如下面所示,没有动态修改接口基本意味着接口只能用一学期,这不符合程序员优雅的代码特点。

function scheduleHtmlProvider(iframeContent = "", frameContent = "", dom = document) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://jwgl.hist.edu.cn/wsxk/xkjg.ckdgxsxdkchj_data10319.jsp?params=eG49MjAyMiZ4cT0wJnhoPTIwMjEwMDAwNTExMg==', false);
    xhr.send();
    return xhr.responseText;

}

2.解析接口:

我们的已知条件:

  1. 课程表的接口地址。
  2. 课程表的解析代码。(可参考上篇博客->青果教务系统适配小爱课程表
  1. 我们的目的是了解传递什么参数,并且我们手动传递。

  2. 一般如果参数进行了加密,我们是很难解析的(开始我以为进行了加密)

xhr.open('GET', 'http://jwgl.hist.edu.cn/wsxk/xkjg.ckdgxsxdkchj_data10319.jsp?params=eG49MjAyMiZ4cT0wJnhoPTIwMjEwMDAwNTExMg==', false);
  1. 我们从这个接口中知道传递了一个params参数。

其实我开始并不知道这个参数是啥,但是最近写了一个二维码的程序,后面两个“==”太像base64了,然后。。。。,我就试着用base64反向解析一下。

在这里插入图片描述

然后就发现这其实是三个参数的转码,也没有任何其他的加密。

  1. 这三个参数简单就可以字面猜测
xn = 2022 //2022-2023学年
xq = 1 //0: 1学期, 1: 2学期
xh = 2021000005123 // 这个学号和我的学号不一样,我猜测是uid
  1. 手动获取参数:
    学年学期很好获取,上半年就是第二学期,下半年就是第一学期。学年也是类似算法。
function getParam(){
    const date = new Date();
    let year = date.getFullYear();//获取完整的年份(4位)
    const month = date.getMonth() + 1; //获取当前月份(0-11,0代表1月)
    let xq = 0;
    if(month < 7){
        xq = 1;
        year = year - 1;
    }
    return btoa('xn='+year+'&xq='+xq);
}

学号我获取折腾了半天,因为不是自己真实的学号,而是数据库的uid,所以我在js数据中一直找,发现唯一一次回传是在课程表页面,那个页面是嵌入式的,也许的小米的api的问题,使用js很难定位到。

  1. 也许不用学号就能获取。

最后我放弃传输学号参数,仅仅传递学年,学期参数,发现也可以获取课程表。我猜测服务器端可能认为这个是可有可无的参数(会话中已保存),没有做验证或者其他处理吧。

  1. 将学年和学期打包参数发送请求
 return await request('get', 'gbk','http://jwgl.hist.edu.cn/wsxk/xkjg.ckdgxsxdkchj_data10319.jsp?params='+getParam());

这里我使用btoa()函数进行base64转码

3. 结果:

在这里插入图片描述

我最终通过手动传递,xh,xq的参数,完善了课程表的信息获取接口。

本文旨在记录获取接口参数一样的过程。

完整信息获取代码如下:

  1. 小爱课程表适配gitee
  2. 小爱课程表适配github
async function scheduleHtmlProvider(iframeContent = "", frameContent = "", dom = document) {
    return await request('get', 'gbk','http://jwgl.hist.edu.cn/wsxk/xkjg.ckdgxsxdkchj_data10319.jsp?params='+getParam());
}
async function request(tag, encod, url) {
    let formatText = (text, encoding) => {
        return new Promise((resolve, reject) => {
            const fr = new FileReader()
            fr.onload = (event) => {
                resolve(fr.result)
            }

            fr.onerror = (err) => {
                reject(err)
            }

            fr.readAsText(text, encoding)
        })
    }
    return await fetch(url, { method: tag })
        .then((rp) => rp.blob().then((v) => formatText(v, encod)))
        .then((v) => v)
        .catch((er) => er)
}
function getParam(){
    const date = new Date();
    let year = date.getFullYear();//获取完整的年份(4位)
    const month = date.getMonth() + 1; //获取当前月份(0-11,0代表1月)
    let xq = 0;
    if(month < 7){
        xq = 1;
        year = year - 1;
    }
    return btoa('xn='+year+'&xq='+xq);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会写bug的靓仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值