贵州大学小爱课程表适配

偶然看到学校小爱课程表没有适配,于是仿照别的学校的适配代码做了点修改。

贵州大学教务系统使用的是正方教务

本文对应代码已经发布在小米的系统上了,可以直接在小爱课程表中使用,写出代码只是如果后面教务系统发生变动,方便更改

开始

请参考Document (xiaomi.com),进行软件安装

教务链接填写为学校教务新加的域名:https://jw.gzu.edu.cn/

代码

注意:代码仅对CSDN文章作了少许修改,因此本文投转载。代码对贵州大学教务系统而言有较多冗余。

provider

function scheduleHtmlProvider(iframeContent = "", frameContent = "", dom = document) {
    return dom.querySelector('#iframeautoheight').contentWindow.document.body.innerHTML;
}

parser

var jsonArray = [];

function scheduleHtmlParser(html) {
    var $ = cheerio.load(html, { decodeEntities: false });
    if ($("#Table6").length > 0) {//班级课表查询界面适配
        $("#Table6 tr").each(
            function (i) {
                if (i > 1) {
                    $(this).children('td').each(function (j) {
                        if ((i - 1) == 3 || (i - 1) == 7) {
                            if (j > 0) {
                                var classA = [].concat(getClass($(this).html(), j, (i - 1)));
                                for (var k = 0; k < classA.length; k++) {
                                    jsonArray.push(classA[k]);
                                }
                                //                         console.log("第"+(i-1)+"节课,周"+(j)+"课程名称:"+$(this).html());
                            }
                        } else if ((i - 1) == 1 || (i - 1) == 5 || (i - 1) == 9) {
                            if ((j - 1) > 0) {
                                var classA = [].concat(getClass($(this).html(), (j - 1), (i - 1)));
                                for (var k = 0; k < classA.length; k++) {
                                    jsonArray.push(classA[k]);
                                }
                                //                         console.log("第"+(i-1)+"节课,周"+(j-1)+"课程名称:"+$(this).html());
                            }
                        }
                    })
                }
            }
        )
    }
    else {//个人课表查询界面适配
        $("#Table1 tr").each(
            function (i) {
                if (i > 1) {
                    $(this).children('td').each(function (j) {
                        if ((i - 1) == 3 || (i - 1) == 7) {
                            if (j > 0) {
                                var classA = [].concat(getClassUser($(this).html(), j, (i - 1)));
                                if (classA.length === 1) {
                                    jsonArray.push(classA[0]);
                                } else if (classA.length === 2) {
                                    jsonArray.push(classA[0]);
                                    jsonArray.push(classA[1]);
                                }
                                //                         console.log("第"+(i-1)+"节课,周"+(j)+"课程名称:"+$(this).html());
                            }
                        } else if ((i - 1) == 1 || (i - 1) == 5 || (i - 1) == 9) {
                            if ((j - 1) > 0) {
                                var classA = [].concat(getClassUser($(this).html(), (j - 1), (i - 1)));
                                if (classA.length === 1) {
                                    jsonArray.push(classA[0]);
                                } else if (classA.length === 2) {
                                    jsonArray.push(classA[0]);
                                    jsonArray.push(classA[1]);
                                }
                                //                         console.log("第"+(i-1)+"节课,周"+(j-1)+"课程名称:"+$(this).html());
                            }
                        }
                    })
                }
            }
        )
    }
    return jsonArray;
}

/**
    得到单科课程信息(班级课表)
*/
function getClass(classHtml, day, section) {
    var classA = [];
    var classs = classHtml.split('<br><br><br>');
    if (classs.length >= 1) { //防止空课表
        for (var i = 0; i < classs.length; i++) { //遍历所有课程
            if (classs[i].indexOf("<br>") != -1) { //判断课程信息是否正常
                var classObj = {};
                var classsObj = classs[i].split("<br>"); //对课程进行分割
                if (classs[1] && classs[1] != "" && classs[1] != undefined) { //如果存在index为1的索引
                    if (classs[1] && classs[1] != "" && classs[0].split("<br>")[1] != classs[1].split("<br>")[1]) { //如果当前课程前两节小课时间不相同,则是单双周课,而不是专修课
                        classObj.name = classsObj[0];
                        classObj.position = classsObj[3];
                        classObj.teacher = classsObj[2];
                        classObj.weeks = [].concat(getWeeks(classsObj[1]));
                        classObj.day = day;
                        classObj.sections = [];
                        classObj.sections.push(section);
                        classObj.sections.push(section + 1);
                        classA.push(classObj);
                    } else { //如果当前课程前两节小课时间不相同,则不是单双周课,而是专修课
                        if (i == 0) { //第一次添加值
                            classObj.name = classsObj[0];
                            classObj.position = classsObj[3];
                            classObj.teacher = classsObj[2];
                            classObj.weeks = [].concat(getWeeks(classsObj[1]));
                            classObj.day = day;
                            classObj.sections = [];
                            classObj.sections.push(section);
                            classObj.sections.push(section + 1);
                            classA.push(classObj);
                        } else if (i == classs.length - 1) { //最后一次添加值
                            classA[classA.length - 1].name = classA[classA.length - 1].name + "," + classsObj[0];
                            classA[classA.length - 1].position = classA[classA.length - 1].position + "," + classsObj[3];
                            classA[classA.length - 1].teacher = classA[classA.length - 1].teacher + "," + classsObj[2];
                        } else { //正常添加值
                            classA[classA.length - 1].name = classA[classA.length - 1].name + "," + classsObj[0];
                            classA[classA.length - 1].position = classA[classA.length - 1].position + "," + classsObj[3];
                            classA[classA.length - 1].teacher = classA[classA.length - 1].teacher + "," + classsObj[2];
                        }
                    }
                } else {//如果不存在,则为单个课程
                    classObj.name = classsObj[0];
                    classObj.position = classsObj[3];
                    classObj.teacher = classsObj[2];
                    classObj.weeks = [].concat(getWeeks(classsObj[1]));
                    classObj.day = day;
                    classObj.sections = [];
                    classObj.sections.push(section);
                    classObj.sections.push(section + 1);
                    classA.push(classObj);
                }

            }
        }
    }
    return classA;
}

/**
    周次解析(班级课表)
*/
function getWeeks(weeksHtml) {
    var weeksStr = weeksHtml;
    var weeksA = [];
    if (weeksStr) {
        var weekArr = weeksStr.split(',')
        if (weekArr.length > 2) { //不正常周次
            for (var j = 0; j < weekArr.length - 1; j++) { //循环所有周次区间
                if (weekArr[j].indexOf("单") != -1) { //单周
                    if (weekArr[j]) {
                        var weeksA1 = weekArr[j].split('-');
                        for (var i = parseInt(weeksA1[0]); i <= parseInt(weeksA1[1]); i = i + 2) {
                            weeksA.push(i);
                        }
                    }
                }
                else if (weekArr[j].indexOf("双") != -1) { //双周
                    if (weekArr[j]) {
                        var weeksA1 = weekArr[j].split('-');
                        for (var i = parseInt(weeksA1[0]); i <= parseInt(weeksA1[1]); i = i + 2) {
                            weeksA.push(i);
                        }
                    }
                } else {
                    if (weekArr[j].indexOf("-") != -1) { //带有-符号的周次
                        if (weekArr[j]) {
                            var weeksA1 = weekArr[j].split('-');
                            for (var i = parseInt(weeksA1[0]); i <= parseInt(weeksA1[1]); i++) {
                                weeksA.push(parseInt(i))
                            }
                        }
                    } else {//不带有-符号的周次
                        weeksA.push(parseInt(weekArr[j]))
                    }
                }

            }
        } else { //正常周次
            if (weeksStr.indexOf('单') != -1) {
                if (weeksHtml) {
                    var weeksA1 = weeksHtml.split('-');
                    for (var i = parseInt(weeksA1[0]); i <= parseInt(weeksA1[1]); i = i + 2) {
                        weeksA.push(i);
                    }
                }
            } else if (weeksStr.indexOf('双') != -1) {
                if (weeksHtml) {
                    var weeksA1 = weeksHtml.split('-');
                    for (var i = parseInt(weeksA1[0]); i <= parseInt(weeksA1[1]); i = i + 2) {
                        weeksA.push(i);
                    }
                }
            } else {
                if (weeksStr.indexOf("-") != -1) { //带有-符号的周次
                    if (weeksHtml) {
                        var weeksA1 = weeksHtml.split('-');
                        for (var i = parseInt(weeksA1[0]); i <= parseInt(weeksA1[1]); i++) {
                            weeksA.push(parseInt(i))
                        }
                    }
                } else {//不带有-符号的周次
                    weeksA.push(parseInt(weekArr[0]))
                }
            }
        }
    }
    return weeksA;
}

/**
    得到单科课程信息(个人课表)
*/
function getClassUser(classHtml, day, section) {
    var classA = [];
    var classs = classHtml.split('<br>');

    if (classs.length > 1) {//防止空课程
        if (classs.length <= 6) {//当课程为标准课程
            var classObj = {};
            classObj.name = classs[0];
            classObj.position = classs[3];
            classObj.teacher = classs[2];
            classObj.weeks = [].concat(getWeeksUser(classs[1]));
            classObj.day = day;
            classObj.sections = [];
            classObj.sections.push(section);
            classObj.sections.push(section + 1);
            classA.push(classObj);
        } else {//当课程为双课程
            //第一节课
            var classObj = {};
            classObj.name = classs[0];
            classObj.position = classs[3];
            classObj.teacher = classs[2];
            classObj.weeks = [].concat(getWeeksUser(classs[1]));
            classObj.day = day;
            classObj.sections = [];
            classObj.sections.push(section);
            classObj.sections.push(section + 1); //
            classA.push(classObj);

            //第二节课
            if (classs[5].indexOf('调') != -1) {
                var classObj1 = {};
                classObj1.name = classs[7];
                classObj1.position = classs[10];
                classObj1.teacher = classs[9];
                classObj1.weeks = [].concat(getWeeksUser(classs[8]));
                classObj1.day = day;
                classObj1.sections = [];
                classObj1.sections.push(section); //
                classObj1.sections.push(section + 1);
                classA.push(classObj1);
            } 
              else if (classs[4].indexOf('日') != -1){
                var classObj1 = {};
                classObj1.name = classs[7];
                classObj1.position = classs[5];
                classObj1.teacher = classs[9];
                classObj1.weeks = [].concat(getWeeksUser(classs[8]));
                classObj1.day = day;
                classObj1.sections = [];
                classObj1.sections.push(section); //
                classObj1.sections.push(section+1);
                classA.push(classObj1);
            }
              else {
                var classObj1 = {};
                classObj1.name = classs[5];
                classObj1.position = classs[8];
                classObj1.teacher = classs[7];
                classObj1.weeks = [].concat(getWeeksUser(classs[6]));
                classObj1.day = day;
                classObj1.sections = [];
                classObj1.sections.push(section); //
                classObj1.sections.push(section + 1);
                classA.push(classObj1);
            }
        }
    }
    return classA;
}

/**
    周次解析(个人课表)
*/
function getWeeksUser(weeksHtml) {
    var weeksStr = weeksHtml;
    var weeksA = [];
    if (weeksStr.indexOf('-') != -1) {
        var weeksA1 = weeksHtml.split('-');
        var start = 0;
        var end = 0;
        if (weeksA1[0][weeksA1[0].length - 2] != '第') {
            start = parseInt(weeksA1[0][weeksA1[0].length - 2] + weeksA1[0][weeksA1[0].length - 1])
        } else {
            start = parseInt(weeksA1[0][weeksA1[0].length - 1])
        }

        if (weeksA1[1][1] != '周') {
            end = parseInt(weeksA1[1][0] + weeksA1[1][1])
        } else {
            end = parseInt(weeksA1[1][0])
        }

        if (weeksStr.indexOf('单') != -1) {
            for (var i = start; i <= end; i = i + 2) {
                weeksA.push(i);
            }
        } else if (weeksStr.indexOf('双') != -1) {
            for (var i = start; i <= end; i = i + 2) {
                weeksA.push(i);
            }
        } else {
            for (var i = start; i <= end; i++) {
                weeksA.push(parseInt(i))
            }
        }
    }
    return weeksA;
}

timer

本部分可用于修改一天有多少节课,每天每节课上课的默认起始结束时间

/**
 * 时间配置函数,此为入口函数,不要改动函数名
 */
 async function scheduleTimer({
    providerRes,
    parserRes
} = {}) {
    return {
        totalWeek: 20, // 总周数:[1, 30]之间的整数
        startSemester: '', // 开学时间:时间戳,13位长度字符串,推荐用代码生成
        startWithSunday: false, // 是否是周日为起始日,该选项为true时,会开启显示周末选项
        showWeekend: true, // 是否显示周末
        forenoon: 4, // 上午课程节数:[1, 10]之间的整数
        afternoon: 4, // 下午课程节数:[0, 10]之间的整数
        night: 3, // 晚间课程节数:[0, 10]之间的整数
        sections: [
            { section: 1, startTime: "08:00", endTime: "08:50" },
            { section: 2, startTime: "09:00", endTime: "09:50" },
            { section: 3, startTime: "10:10", endTime: "11:00" },
            { section: 4, startTime: "11:10", endTime: "12:00" },
            { section: 5, startTime: "14:30", endTime: "15:20" },
            { section: 6, startTime: "15:30", endTime: "16:20" },
            { section: 7, startTime: "16:40", endTime: "17:30" },
            { section: 8, startTime: "17:40", endTime: "18:30" },
            { section: 9, startTime: "19:00", endTime: "19:50" },
            { section: 10, startTime: "20:00", endTime: "20:50" },
            { section: 11, startTime: "21:00", endTime: "21:50" }
        ], // 课程时间表,注意:总长度要和上边配置的节数加和对齐
    }
}

测试

本代码我做了几次试验,发现我所有的课程表都可以正常导入

使用方法

呼叫小爱--打开课程表

课程表导入选择 教务系统导入 搜索“贵州大学” 选择2023年发布的那个即可

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值