Convenient SZU

【使用前先看介绍/有问题可反馈】【欢迎一键三连(好评+打赏+收藏),你的支持是作者维护下去的最大动力!】便捷深大 (Convenient SZU):为深圳大学本科生准备的便捷工具脚本。内部网首页左上角增加 宿舍用电查询/校园网络续费/登录(不可用)Dr.com/体育场馆预订/百度文库/下载专区/师资队伍 入口;免去进入 Blackboard 的繁琐步骤;自动登录(不可用) Blackboard/办事大厅/Dr.com/校园网络续费 等页面;自动填写需要登陆内部网账号的网页的账号密码;办事大厅页面增加修读课程统计下载;成长记录页面增加单学期专业排名。

当前为 2021-01-11 提交的版本,查看 最新版本

// ==UserScript==
// @name         Convenient SZU
// @name:en      Convenient SZU
// @namespace    http://tampermonkey.net/
// @version      0.9.0
// @description  【使用前先看介绍/有问题可反馈】【欢迎一键三连(好评+打赏+收藏),你的支持是作者维护下去的最大动力!】便捷深大 (Convenient SZU):为深圳大学本科生准备的便捷工具脚本。内部网首页左上角增加 宿舍用电查询/校园网络续费/登录(不可用)Dr.com/体育场馆预订/百度文库/下载专区/师资队伍 入口;免去进入 Blackboard 的繁琐步骤;自动登录(不可用) Blackboard/办事大厅/Dr.com/校园网络续费 等页面;自动填写需要登陆内部网账号的网页的账号密码;办事大厅页面增加修读课程统计下载;成长记录页面增加单学期专业排名。
// @description:en  【使用前先看介绍/有问题可反馈】【欢迎一键三连(好评+打赏+收藏),你的支持是作者维护下去的最大动力!】便捷深大 (Convenient SZU):为深圳大学本科生准备的便捷工具脚本。内部网首页左上角增加 宿舍用电查询/校园网络续费/登录(不可用)Dr.com/体育场馆预订/百度文库/下载专区/师资队伍 入口;免去进入 Blackboard 的繁琐步骤;自动登录(不可用) Blackboard/办事大厅/Dr.com/校园网络续费 等页面;自动填写需要登陆内部网账号的网页的账号密码;办事大厅页面增加修读课程统计下载;成长记录页面增加单学期专业排名。
// @author       cc
// @match        https://elearning.szu.edu.cn/*
// @match        https://authserver.szu.edu.cn/*
// @match        https://drcom.szu.edu.cn/*
// @match        https://self.szu.edu.cn/*
// @match        https://www1.szu.edu.cn/*
// @match        http://ehall.szu.edu.cn/*
// @match        http://bkxk.szu.edu.cn/*
// @match        172.30.255.2/*
// @grant        GM_setValue
// @grant        GM_getValue
// @require      https://gf.qytechs.cn/scripts/418193-coder-utils.js
// ==/UserScript==

(function() {
    'use strict';
    // 在此修改您的账号密码
    var CARD_ID = 'Your card id';
    var STUDENT_ID = 'Your student id';
    var PASSWORD = 'Your password';
    // 往后的代码不需要修改
    const RECURSION_DURATION = 250;
    var extra_times = 0;
    var account = GM_getValue('account');
    if (account) {
        if (CARD_ID != 'Your card id' && STUDENT_ID != 'Your student id' && PASSWORD != 'Your password' && (CARD_ID != account.CARD_ID || STUDENT_ID != account.STUDENT_ID || PASSWORD != account.PASSWORD)) {
            GM_setValue('account', {
                'CARD_ID': CARD_ID,
                'STUDENT_ID': STUDENT_ID,
                'PASSWORD': PASSWORD,
            });
            account = GM_getValue('account');
        };
    } else {
        if (CARD_ID == 'Your card id' || STUDENT_ID == 'Your student id' || PASSWORD == 'Your password') {
            alert('【来自SZU Auto】:\n请前往脚本编辑页更新您的账号密码并保存\n进入脚本编辑页方式请查看脚本介绍页的使用说明\n这是为了往后脚本更新时不需要您再手动修改内容\n若不更新则脚本不会启用\n更新完毕后该弹窗不再出现\n以后若需要重新更新账号密码请前往脚本编辑页编辑保存');
            CARD_ID = prompt('请输入六位数字的卡号:');
            while (!CARD_ID || !CARD_ID.match(/^\d{6}$/))
                CARD_ID = prompt('请输入合法的六位数字的卡号:');
            STUDENT_ID = prompt('请输入十位数字的学号:');
            while (!STUDENT_ID || !STUDENT_ID.match(/^\d{10}$/))
                STUDENT_ID = prompt('请输入合法的十位数字的学号:');
            PASSWORD = prompt('请输入统一认证登录(不可用)密码:');
            while (!PASSWORD)
                PASSWORD = prompt('请输入合法的统一认证登录(不可用)密码:');
        };
        GM_setValue('account', {
            'CARD_ID': CARD_ID,
            'STUDENT_ID': STUDENT_ID,
            'PASSWORD': PASSWORD,
        });
        account = GM_getValue('account');
    };
    CARD_ID = account.CARD_ID;
    STUDENT_ID = account.STUDENT_ID;
    PASSWORD = account.PASSWORD;
    function recursion () {
        if (location.host == 'elearning.szu.edu.cn') {
            if (location.href == 'https://elearning.szu.edu.cn/' || location.href == 'https://elearning.szu.edu.cn/webapps/login/') {
                let span = document.querySelector('table table table tr td a span');
                if (span) {
                    span.click();
                };
            } else if (location.href.includes('webapps/portal/')) {
                let button_1 = document.querySelector('.button-1');
                if (button_1) {
                    button_1.click();
                };
            };
        } else if (location.host == 'authserver.szu.edu.cn') {
            let username = document.getElementById('username');
            let password = document.getElementById('password');
            let captchaResponse = document.querySelector('p#cpatchaDiv #captchaResponse');
            let button = document.querySelector('button');
            if (username && password && button && !captchaResponse) {
                username.value = CARD_ID;
                password.value = PASSWORD;
                extra_times = 750;
                button.click();
                setTimeout(() => { extra_times = 0; }, RECURSION_DURATION);
            };
        } else if (location.host == 'ehall.szu.edu.cn') {
            let ampHasNoLogin = document.getElementById('ampHasNoLogin');
            if (ampHasNoLogin) {
                ampHasNoLogin.click();
            };
            if (location.href.indexOf('/jwapp/sys/czjl') >= 0) {
                let el = document.getElementsByClassName('czjl-sixItem-container')[0];
                if (el) {
                    let innerHTML = el.innerHTML.replace(/<!\-\-\s*/g, '').replace(/\s*\-\->+/g, '');
                    if (el.innerHTML !== innerHTML)
                        el.innerHTML = innerHTML;
                };
            };
            if (location.href.indexOf('/jwapp/sys/jwwspj') >= 0) {
                if (document.getElementsByClassName('timu-title')[0] && !document.getElementById('quick-set')) {
                    let title = document.getElementsByClassName('timu-title')[0];
                    let btn = document.createElement('button');
                    btn.innerHTML = '一键五星+评价'
                    btn.id = 'quick-set';
                    btn.style.border = '0';
                    btn.style.width = '300px';
                    btn.style.height = '40px';
                    btn.style.marginLeft = '10px';
                    btn.style.fontWeight = 'bold';
                    btn.style.fontSize = '16px';
                    btn.style.color = 'white';
                    btn.style.backgroundColor = '#d22e2e';
                    btn.onclick = function() {
                        let rotate = document.getElementsByClassName('rotate')[0];
                        if (rotate && rotate.innerHTML.indexOf('已') >= 0) {
                            alert('你已经评教过了');
                            return false;
                        };
                        $('[data-x-bl=100]').toArray().forEach(s => s.firstElementChild.click());
                        $('textarea').val(prompt('请提供一个默认的教师评价'));
                        return false;
                    };
                    title.parentNode.insertBefore(btn, title);
                };
            };
            if (location.href.indexOf('/new/index.html') >= 0) {
                if (!document.getElementById('download-training-program')) {
                    function courseClassSorted(courses) {
                        function getCourseClassPriority(course) {
                            let priority = ['基本通识', '专业核心', '专业限选', '专业选修', '扩展通识', '自然科学', '生命科学', '社会科学', '中华文化', '人文艺术', '创新创业', '个性课程', '基本实践'];
                            for (let i = 0; i < priority.length; i++)
                                if (course.indexOf(priority[i]) >= 0)
                                    return i;
                            return priority.length;
                        };
                        let courseInfo = courses.map(c => {
                            return {
                                course: c,
                                priority: getCourseClassPriority(c),
                            };
                        });
                        courseInfo = utils.arr.sorted(courseInfo, 'priority');
                        courses = utils.obj.map(courseInfo, 'course');
                        return courses;
                    };
                    function exec() {
                        $.ajax({
                            method: 'POST',
                            url: 'http://ehall.szu.edu.cn/jwapp/sys/xywccx/modules/xywccx/cxscfakz.do',
                            data: {
                                BYNJDM: '-',
                            },
                        }).then(res => {
                            let extendedCourseClasses = ['自然科学类', '生命科学类', '社会科学类', '中华文化类', '人文艺术类', '创新创业类'];
                            let numChinese = ['一', '二', '三', '四', '五', '六', '七', '八'];
                            let courseClassesObj = res.datas.cxscfakz.rows;
                            courseClassesObj = utils.obj.map(courseClassesObj, ['KZM', 'KZH', 'PYFADM', 'YQXF', 'WCXF', 'YQMS', 'WCMS', 'YQWCKZS', 'WCKZS', 'FKZH']);
                            let allCourseClasses = utils.obj.map(courseClassesObj.filter(c => c.FKZH !== '-1'), 'KZM');
                            let statCourseClasses = allCourseClasses.filter(c => !extendedCourseClasses.includes(c));
                            let extendedCourseClass = allCourseClasses.filter(c => c.indexOf('扩展通识') >= 0)[0];
                            let cmap = Object.fromEntries([[extendedCourseClass, courseClassesObj.filter(c => c.KZM.indexOf('扩展通识') >= 0)[0]]]);
                            allCourseClasses = allCourseClasses.filter(c => c.indexOf('扩展通识') < 0);
                            let recommendClasses = statCourseClasses.filter(c => c.indexOf('个性课程') < 0);
                            courseClassesObj = courseClassesObj.filter(c => allCourseClasses.includes(c.KZM) && c.FKZH !== '-1');
                            cmap = Object.assign(cmap, Object.fromEntries(courseClassesObj.map(c => [c.KZM, c])));
                            let keys = ['课程类型', '要求学分', '已修学分', '要求门数', '已修门数', '要求类别数', '已修类别数'];
                            let progressContent = '课程类型,要求学分,已修学分,要求门数,已修门数,要求类别数,已修类别数\n';
                            statCourseClasses = courseClassSorted(statCourseClasses);
                            statCourseClasses.map(statCourseClass => {
                                let c = cmap[statCourseClass];
                                return {
                                    '课程类型': statCourseClass,
                                    '要求学分': c.YQXF,
                                    '已修学分': c.WCXF,
                                    '要求门数': c.YQMS === null ? '0' : String(c.YQMS),
                                    '已修门数': c.WCMS === null ? '0' : String(c.WCMS),
                                    '要求类别数': c.YQWCKZS === null ? '0' : String(c.YQWCKZS),
                                    '已修类别数': c.WCKZS === null ? '0' : String(c.WCKZS),
                                };
                            }).forEach(p => progressContent += keys.map(k => p[k]).join(',') + '\n');
                            let reqs = [];
                            courseClassesObj.forEach(courseClass => {
                                reqs.push($.ajax({
                                    method: 'POST',
                                    url: 'http://ehall.szu.edu.cn/jwapp/sys/xywccx/modules/xywccx/cxscfakzkc.do',
                                    data: {
                                        BYNJDM: '-',
                                        KZH: courseClass.KZH,
                                        PYFADM: courseClass.PYFADM,
                                        pageSize: 999,
                                        pageNumber: 1,
                                    },
                                }).then(res => {
                                    let courseList = res.datas.cxscfakzkc.rows;
                                    courseList = utils.obj.map(courseList, ['KCM', 'CJ', 'XF', 'SFTG_DISPLAY', 'XNXQDM', 'KCXZDM_DISPLAY', 'KCH', 'BZ']);
                                    courseList = utils.obj.rename(courseList, {'KCM': '课程名', 'CJ': '成绩', 'XF': '学分', 'SFTG_DISPLAY': '是否通过', 'XNXQDM': '学年学期', 'KCXZDM_DISPLAY': '课程性质', 'BZ': '备注'});
                                    let clreqs = [];
                                    courseList.forEach(course => {
                                        course['课程类型'] = courseClass.KZM;
                                        course['成绩'] = course['成绩'] || '';
                                        course['学年学期'] = course['学年学期'] || '';
                                        course['备注'] = course['备注'] || '';
                                        if (course['备注'].match(/[^\d\s\:a-zA-z\-]/g) === null || course['备注'].match(/见.*?备注.*/) !== null)
                                            course['备注'] = '';
                                        clreqs.push($.ajax({
                                            method: 'POST',
                                            url: 'http://ehall.szu.edu.cn/jwapp/sys/qxfacx/modules/pyfacxepg/kzkccx.do',
                                            data: {
                                                KZH: courseClass.KZH,
                                                PYFADM: courseClass.PYFADM,
                                                KCH: course.KCH,
                                                pageSize: 1,
                                                pageNumber: 1,
                                            },
                                        }).then(res => {
                                            let recSem = '';
                                            if (res.datas.kzkccx.rows.length > 0) {
                                                let remark = res.datas.kzkccx.rows[0].BZ;
                                                recSem = res.datas.kzkccx.rows[0].XDXQ || '';
                                                if (typeof remark === 'string' && remark.length > 0 && !course['备注'].length && (remark.match(/[^\d\s\:a-zA-z\-]/g) !== null && remark.match(/见.*?备注.*/) === null)) {
                                                    course['备注'] = remark;
                                                };
                                            };
                                            course['建议修读学期'] = recSem;
                                            delete course.KCH;
                                            return course;
                                        }).fail(err => {
                                            console.info(err);
                                        }));
                                    });
                                    return Promise.all(clreqs).then(res => {
                                        return [courseClass.KZM, res];
                                    });
                                }).fail(err => {
                                    console.info(err);
                                }));
                            });
                            Promise.all(reqs).then(res => {
                                let courses = Object.fromEntries(res);
                                let gradeMap = {'A+': 4.5, 'A': 4.0, 'B+': 3.5, 'B': 3.0, 'C+': 2.5, 'C': 2.0, 'D': 1.0, 'F': 0.0};
                                let semester = Array.from(new Set(utils.obj.map(utils.obj.merge(Object.values(courses)), '学年学期'))).filter(s => Boolean(s));
                                semester.sort();
                                let earliestYear = new Date().getFullYear();
                                if (semester.length)
                                    earliestYear = Number(semester[0].slice(0, 4));
                                let semesterIndexToDate = (year, semesterIndex) => {
                                    semesterIndex = Number(semesterIndex);
                                    let reccommendYear = year + ((semesterIndex - 1) >> 1);
                                    let reccommendGrade = 2 - (semesterIndex & 1);
                                    return `${reccommendYear}-${reccommendYear + 1}-${reccommendGrade}`;
                                };
                                let semesterDateToChinese = (year, semesterDate) => {
                                    let allNums = semesterDate.match(/\d+/g);
                                    let yearIndex = Number(allNums[0]) - year;
                                    let gradeChinese = `大${numChinese[yearIndex]}${['上', '下'][Number(allNums[2]) - 1]}`;
                                    return `${semesterDate} (${gradeChinese})`;
                                };
                                let semesterGrade = {};
                                semester.forEach(s => semesterGrade[s] = {semester: s, allScore: 0, getScore: 0, avgScore: 0, acaScore: 0, acgScore: 0, acvScore: 0});
                                utils.obj.merge(Object.values(courses)).forEach(course => {
                                    if (course['学年学期']) {
                                        semesterGrade[course['学年学期']]['allScore'] += course['学分'];
                                        semesterGrade[course['学年学期']]['getScore'] += course['学分'] * gradeMap[course['成绩']];
                                    };
                                });
                                semesterGrade = utils.arr.sorted(Object.values(semesterGrade), 'semester');
                                for (let i = 0; i < semesterGrade.length; i++) {
                                    semesterGrade[i].avgScore = parseFloat(semesterGrade[i].getScore / semesterGrade[i].allScore).toFixed(2);
                                    semesterGrade[i].acaScore = semesterGrade[i].allScore;
                                    semesterGrade[i].acgScore = semesterGrade[i].getScore;
                                    for (let j = 0; j < i; j++) {
                                        semesterGrade[i].acaScore += semesterGrade[j].allScore;
                                        semesterGrade[i].acgScore += semesterGrade[j].getScore;
                                    };
                                    semesterGrade[i].acvScore = parseFloat(semesterGrade[i].acgScore / semesterGrade[i].acaScore).toFixed(2);
                                    semesterGrade[i].semester = semesterDateToChinese(earliestYear, semesterGrade[i].semester);
                                };
                                recommendClasses.forEach(recommendClass => {
                                    let courseClassesIndex = utils.arr.indexOf(courseClassesObj, x => x.KZM === recommendClass);
                                    if (courseClassesIndex >= 0) {
                                        courses[recommendClass].forEach(c => {
                                            let reccommendSemester = '';
                                            if (c['建议修读学期'])
                                                reccommendSemester = semesterIndexToDate(earliestYear, c['建议修读学期']);
                                            c['建议修读学期'] = reccommendSemester;
                                        });
                                    };
                                });
                                let orderedCourses = [];
                                allCourseClasses = courseClassSorted(allCourseClasses);
                                allCourseClasses.forEach(courseClass => {
                                    if (utils.type.isIterable(courses[courseClass]) && courses[courseClass].length > 0) {
                                        courses[courseClass] = utils.arr.sorted(courses[courseClass], ['课程名', '建议修读学期', '学年学期', '是否通过'], [false, false, false, true]);
                                        orderedCourses = orderedCourses.concat(courses[courseClass]);
                                    };
                                });
                                let suggestCourses = [];
                                let notPassCourses = orderedCourses.filter(c => c['是否通过'] !== '通过');
                                recommendClasses = courseClassSorted(recommendClasses);
                                recommendClasses.forEach(recommendClass => {
                                    let tmpCourseList = notPassCourses.filter(c => c['课程类型'] === recommendClass);
                                    tmpCourseList = utils.arr.sorted(tmpCourseList, '建议修读学期');
                                    if (recommendClass === '专业选修课') {
                                        let tmpLimitCourseList = tmpCourseList.filter(c => c['备注'].indexOf('限选') >= 0);
                                        let tmpFreeCourseList = tmpCourseList.filter(c => c['备注'].indexOf('限选') < 0);
                                        tmpCourseList = tmpLimitCourseList.concat(tmpFreeCourseList);
                                    };
                                    suggestCourses = suggestCourses.concat(tmpCourseList);
                                });
                                orderedCourses.forEach(c => {
                                    if (c['学年学期'])
                                        c['学年学期'] = semesterDateToChinese(earliestYear, c['学年学期']);
                                    if (c['建议修读学期'])
                                        c['建议修读学期'] = semesterDateToChinese(earliestYear, c['建议修读学期']);
                                });
                                let gradeContent = '学年学期,学期学分,学期GPA,累计学分,累计GPA\n';
                                for (let grade of semesterGrade)
                                    gradeContent += `${grade.semester},${grade.allScore},${grade.avgScore},${grade.acaScore},${grade.acvScore}\n`;
                                let courseContent = '课程名,学分,成绩,是否通过,学年学期,建议修读学期,课程类型,课程性质,备注\n';
                                for (let course of orderedCourses)
                                    courseContent += `${course['课程名']},${course['学分']},${course['成绩']},${course['是否通过']},${course['学年学期']},${course['建议修读学期']},${course['课程类型']},${course['课程性质']},${course['备注']}\n`;
                                let suggestContent = '以下是根据数据自动生成的推荐修读课程,仅供参考\n';
                                suggestContent += '课程名,学分,成绩,是否通过,学年学期,建议修读学期,课程类型,课程性质,备注\n';
                                for (let course of suggestCourses)
                                    suggestContent += `${course['课程名']},${course['学分']},${course['成绩']},${course['是否通过']},${course['学年学期']},${course['建议修读学期']},${course['课程类型']},${course['课程性质']},${course['备注']}\n`;
                                let prompts = [
                                    `【通知】修读课程统计表格生成成功`,
                                    `【提示】通过 Excel 打开表格后,选中多列(即选中多个连续的字母索引),点击 "开始"->"单元格选项卡"->"样式"->"自动调整列宽" 就能更清楚地查看表格的整体内容。`,
                                    `【提示】通过 Excel 打开表格后,选中单个表格的数据(即选中多行多列的单元格),点击 "开始"->"编辑选项卡"->"排序和筛选"->"筛选" 就能对表格的内容进行排序和筛选。`
                                ];
                                let csvContent = `${courseContent}\n${gradeContent}\n${progressContent}\n${suggestContent}\n`;
                                utils.download.downloadCsv(csvContent, '修读课程统计.csv');
                                prompts.forEach(p => console.warn(p));
                                alert(prompts.join('\n'));
                            });
                        }).fail(err => {
                            console.info(err);
                        });
                    };
                    (function set() {
                        let ampDesktopNav = $('#ampDesktopNav')[0];
                        if (!ampDesktopNav || !ampDesktopNav.firstElementChild)
                            return;
                        let stuServeCenter = ampDesktopNav.firstElementChild;
                        let div = document.createElement('div');
                        div.className = stuServeCenter.className.replace(/\s?amp\-active/, '');
                        div.id = 'download-training-program';
                        div.title = '修读课程统计下载';
                        div.innerHTML = div.title;
                        div.onclick = function() {
                            $.ajax({
                                method: 'POST',
                                url: 'http://ehall.szu.edu.cn/jwapp/sys/xywccx/modules/xywccx/cxscfakz.do',
                                data: {
                                    BYNJDM: '-',
                                },
                            }).then(res => {
                                let rows = res.datas.cxscfakz.rows;
                                let i = 0;
                                while (rows[i].KZM.indexOf('基本通识课') < 0 && i < rows.length)
                                    i++;
                                let courseClass = rows[i];
                                $.ajax({
                                    method: 'POST',
                                    url: 'http://ehall.szu.edu.cn/jwapp/sys/qxfacx/modules/pyfacxepg/kzkccx.do',
                                    data: {
                                        KZH: courseClass.KZH,
                                        PYFADM: courseClass.PYFADM,
                                        pageSize: 10,
                                        pageNumber: 1,
                                        BYNJDM: '-',
                                    },
                                }).then(res => {
                                    setTimeout(() => {
                                        $('#ampDesktopNav')[0].firstElementChild.click();
                                    }, 50);
                                    exec();
                                }).fail(err => {
                                    console.log('fail (code: -2)');
                                    alert(`将跳转至"全校培养方案查询",跳转后请手动关闭打开的页面`);
                                    let btn = $('[amp-title=全校培养方案查询]')[0];
                                    btn.setAttribute('amp-unviewabledescription', 'true');
                                    btn.click();
                                    setTimeout(() => {
                                        div.click();
                                    }, 50);
                                });
                            }).fail(err => {
                                console.log('fail (code: -1)');
                                alert(`将跳转至"学业完成查询",跳转后请手动关闭打开的页面`);
                                let btn = $('.card-bus-content [amp-title=学业完成查询]')[0];
                                btn.setAttribute('amp-unviewabledescription', 'true');
                                btn.click();
                                setTimeout(() => {
                                    div.click();
                                }, 50);
                            });
                        };
                        stuServeCenter.parentElement.insertBefore(div, stuServeCenter.nextElementSibling);
                    })();
                };
            };
        } else if (location.host == '172.30.255.2') {
            if (location.href.includes('.htm')) {
                let username = document.getElementById('username');
                let password = document.getElementById('password');
                let submit = document.querySelector('#submit[type=submit]');
                if (username && password && submit) {
                    username.value = CARD_ID;
                    password.value = PASSWORD;
                    submit.click();
                };
            };
        } else if (location.host == 'drcom.szu.edu.cn') {
            if (location.href.includes('.htm')) {
                let username = document.querySelector('input[name=DDDDD]');
                let password = document.querySelector('input[name=upass]');
                let submit = document.querySelector('input[type=submit]');
                if (username && password && submit) {
                    username.value = CARD_ID;
                    password.value = PASSWORD;
                    submit.click();
                };
            };
        } else if (location.host == 'www1.szu.edu.cn') {
            if (location.href == 'https://www1.szu.edu.cn/') {
                let td = document.querySelector('table table table tbody tr td');
                let a_drcom_dom = document.getElementById('drcom_dom');
                if (td && !a_drcom_dom) {
                    td.querySelectorAll('img').forEach(e => e.remove());
                    td.firstChild.remove();
                    td.firstChild.remove();
                    td.style.padding = '5px 20px';
                    td.innerHTML += '<br>';
                    let a = document.createElement('a');
                    a.href = 'http://192.168.84.3:9090/cgcSims/';
                    a.id = 'electricity';
                    a.innerHTML = '宿舍用电查询';
                    td.appendChild(a);
                    a = document.createElement('a');
                    a.href = 'https://self.szu.edu.cn/self/';
                    a.id = 'network';
                    a.innerHTML = '|校园网络续费';
                    td.appendChild(a);
                    a = document.createElement('a');
                    a.href = 'http://172.30.255.2/0.htm';
                    a.id = 'drcom_dom';
                    a.innerHTML = '|登录(不可用) Dr.com';
                    td.appendChild(a);
                    td.innerHTML += '<br>';
                    a = document.createElement('a');
                    a.href = 'http://ehall.szu.edu.cn/publicapp/sys/tycgyyxt/index.do';
                    a.id = 'venue_yh';
                    a.innerHTML = '体育场馆预订(粤海校区)';
                    td.appendChild(a);
                    a = document.createElement('a');
                    a.href = 'http://ehall.szu.edu.cn/publicappxl/sys/xlxqtycgyy/index.do';
                    a.id = 'venue_lh';
                    a.innerHTML = '|体育场馆预订(丽湖校区)';
                    td.appendChild(a);
                    td.innerHTML += '<br>';
                    a = document.createElement('a');
                    a.href = 'http://www.lib.szu.edu.cn/zh-hans/er/baidu-wenku';
                    a.id = 'wenku';
                    a.innerHTML = '百度文库';
                    td.appendChild(a);
                    a = document.createElement('a');
                    a.href = 'https://www1.szu.edu.cn/nc/view.asp?id=64';
                    a.id = 'download';
                    a.innerHTML = '|下载专区';
                    td.appendChild(a);
                    a = document.createElement('a');
                    a.href = 'http://xzfc.szu.edu.cn/rsfw/sys/szdxxzfc/login/index.do';
                    a.id = 'teacher';
                    a.innerHTML = '|师资队伍';
                    td.appendChild(a);
                    let tbody = document.querySelectorAll('table table table tbody')[4];
                    tbody.querySelector('tr:nth-child(2)').style.height = '415px';
                };
            };
        } else if (location.host == 'bkxk.szu.edu.cn') {
            let loginName = document.getElementById('loginName');
            let loginPwd = document.getElementById('loginPwd');
            if (loginName && loginPwd) {
                loginName.value = STUDENT_ID;
                loginPwd.value = PASSWORD;
            };
        } else if (location.host == 'self.szu.edu.cn') {
            let account = document.getElementById('account');
            let pass = document.getElementById('pass');
            let submit = document.querySelector('input[type=submit]');
            if (account && pass && submit) {
                account.value = CARD_ID;
                pass.value = PASSWORD;
                submit.click();
            };
        };
        setTimeout(recursion, RECURSION_DURATION + extra_times);
    };
    document.onreadystatechange = function () {
        if(document.readyState=="complete") {
            recursion();
        };
    };
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址