小爱课程表导入课程表功能开发(正方教务系统)
前言
昨天开始了小爱课程表的开发,主要实现的功能是导入本校的教务系统课程表。今天完成并自测通过了,就等审核通过上线啦。现在就来记录一下这次开发。
具体的流程就不多说了,直接看开发者文档吧https://ldtu0m3md0.feishu.cn/docs/doccnhZPl8KnswEthRXUz8ivnhb#line-38
主要记录一下我的代码和思路
代码
主要是写scheduleHtmlProvider.js和scheduleHtmlParser.js这两文件
Provider 是用来获取html的函数,将获取到的html传给 Parser 进行数据处理,截取出对应的课程信息,再封装为规定的json格式数据返回。最后执行函数,便可以导入成功啦!
function scheduleHtmlProvider(iframeContent = "", frameContent = "", dom = document) {return dom.querySelector('#iframeautoheight').contentWindow.document.body.innerHTML;
}
执行函数后弹出了的窗口包括了课程表信息,就代表截取成功啦!如下图
接下来就可以编写 Parser 函数了,最后按指定格式返回就行了
注意:Parser函数里不能使用document和window对象,因为这部分是在服务端解析的,用到了cheerio的环境,这点很重要,昨天搞了很久没成功,找不到原因,就是因为用了document(泪目)
所以开发之前仔细看文档真的很重要!
既然用不了原生的,那就只能用Cheerio了,附上Cheerio官方文档翻译 https://juejin.im/post/6844904135767097352
scheduleHtmlParser.js
function scheduleHtmlParser(html) {var jsonArray = [];var $ = cheerio.load(html, { decodeEntities: false });$("#Table1 tr").each(function(i){if(i > 1){$(this).children('td').each(function(j){if($(this).text().length <= 4 && $(this).text().length > 0){} else{jsonArray = getCourseInfos($(this).html(),jsonArray)}})}})var jsonArray1 = JSON.stringify(jsonArray);var time = [{"section": 1,"startTime": "08:30","endTime": "09:15"},{"section": 2,"startTime": "09:30","endTime": "10:10"},{"section": 3,"startTime": "10:30","endTime": "11:15"},{"section": 4,"startTime": "11:25","endTime": "12:10"},{"section": 5,"startTime": "14:30","endTime": "15:15"},{"section": 6,"startTime": "15:25","endTime": "16:10"},{"section": 7,"startTime": "16:25","endTime": "17:10"},{"section": 8,"startTime": "17:20","endTime": "18:05"},{"section": 9,"startTime": "19:30","endTime": "20:15"},{"section": 10,"startTime": "20:25","endTime": "21:10"},]var time1 = JSON.stringify(time);var conss = new Object();conss.courseInfos = JSON.parse(jsonArray1);conss.sectionTimes = JSON.parse(time1);var json2 = JSON.stringify(conss);console.info(JSON.parse(json2));return JSON.parse(json2);
}function getJson(s) {var str = (s||'').split("<br>")if(str.length == 1)return null;var num = (str[2]||'').split(",")[1].substring(0,1)var name = str[0];var cDay = ""if(str[0]!="")cDay = str[2].substring(1,2);var day=0;var position=str[4];var teacher=str[3];var matchReg = /(?<={).*?(?=})/; //截取{}之间的内容var cWeek = "";if(str[0]!="")cWeek = str[2].match(matchReg);var cWeeks = (cWeek[0]||'').split("|");var startWeek = ""var endWeek = ""if(cWeeks[0]!=""){startWeek = parseInt((cWeeks[0]||'').split("-")[0].replace(/[^0-9]/ig,""));endWeek = parseInt((cWeeks[0]||'').split("-")[1].replace(/[^0-9]/ig,""));}var singleOrDouble = cWeeks[1];var weekArray = [];for (var j = startWeek,k=0;j <= endWeek;j++,k++) {if(singleOrDouble=="单周"){if(j % 2 == 0) {k--;continue;}} else if(singleOrDouble=="双周"){if(j % 2 == 1) {k--continue;}}weekArray[k] = j;}switch (cDay) {case '一':day = 1;break;case '二':day = 2;break;case '三':day = 3;break;case '四':day = 4;break;case '五':day = 5;break;case '六':day = 6;break;case '七':day = 7;break;}for (var i = 0;i < str.length;i++) {if (str[i]=="")continue;}var con = new Object();con.name = name;con.position = position;con.teacher = teacher;con.weeks = weekArray;con.day = day;if(num-1 == 1)con.sections = [{"section":num-1 ,"startTime": "08:30","endTime": "09:15"},{"section":num-1+1,"startTime": "09:25","endTime": "10:10"}]if(num-1 == 3)con.sections = [{"section":num-1 ,"startTime": "10:30","endTime": "11:15"},{"section":num-1+1,"startTime": "11:25","endTime": "12:10"}]if(num-1 == 5)con.sections = [{"section":num-1 ,"startTime": "14:30","endTime": "15:15"},{"section":num-1+1,"startTime": "15:25","endTime": "16:10"}]if(num-1 == 7)con.sections = [{"section":num-1 ,"startTime": "16:25","endTime": "17:10"},{"section":num-1+1,"startTime": "17:20","endTime": "18:05"}]if(num-1 == 9)con.sections = [{"section":num-1 ,"startTime": "19:30","endTime": "20:15"},{"section":num-1+1,"startTime": "20:25","endTime": "21:10"}]var json = JSON.stringify(con)return JSON.parse(json);}function getCourseInfos(s,jsonArray) {var lesson = (s||'').split("<br><br>");var json1 = new Object();for(var i = 0;i < lesson.length;i++) {json1 = getJson(lesson[i],3);if(json1 != null && json1.name != "")jsonArray.push(json1);}return jsonArray;
}
最后弹出所返回的json数据,并且控制台显示 All run successfully 代表成功
测试
接下来就可以上传然后在手机上进行导入测试啦
测试了好几个不同专业同学的课程表,都导入成功啦!
坐等审核通过上线(生怕有bug又打回来)
2020/09/19 审核通过啦
小爱课程表导入课程表功能开发(正方教务系统)相关推荐
- 新版小爱课程表正方教务系统课表适配
新版小爱课程表正方教务系统课表适配 前言 之前写过一篇小爱课程表的教务系统适配,但是是比较老的版本开发者工具适配了,最近看到小爱课程表开发者工具更新了,就想着写一篇新的博客,顺便优化一下之前的代码,还 ...
- 我的第一个开源项目:Java爬虫爬取旧版正方教务系统课程表、成绩表
Java爬虫爬取旧版正方教务系统课程表.成绩表 一.项目展示 1.正方教务系统 首页 2.爬虫系统 首页: 成绩查询: 课表查询: 二.项目实现 1.爬取思路描述 无论是成绩查询或课表查询亦或者其它的 ...
- 用Python登陆新版正方教务系统获取课程表(及RSA加密密码实现)
前言 最近做一个微信小程序,需要登录教务系统.提前用python尝试一下登录接口,并获取到课表打印出来. 我们学校用到新版正方教务系统,长这个样子. 相比旧版的教务系统,唯一好处是不用输入二维码方便爬 ...
- 新版正方教务系统导出课程表-油猴脚本
https://www.cnblogs.com/31415926535x/p/12244461.html 简介 这个油猴脚本主要是针对新版的正方教务系统,实现将课程表转化为一个 courses.ics ...
- JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解
目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...
- php正方系统抓取课表,以正方教务系统为例,用php模拟登陆抓取课表、空教室,抓取课表...
以正方教务系统为例,用php模拟登陆抓取课表.空教室,抓取课表 课程格子和超级课程表这两个应用,想必大学生都很熟悉,使用自己的学号和教务系统的密码,就可以将自己的课表导入,随时随地都可以在手机上查看. ...
- 用java模拟登录正方教务系统,抓取课表和个人成绩等数据
之前学了一些java web的编程,理解了web应用的原理后,就突然想到,可以用java模拟登录吉珠的教务系统,然后爬取里面的课表.成绩.个人信息等等数据,然后就可以写成一个简易的课表APP. 一.第 ...
- nodejs模拟登陆旧版正方教务系统
nodejs模拟登陆旧版正方教务系统 nodejs模拟登陆学校教务系统 1.分析教务系统地址 2.分析请求头和请求数据 3.对Cookie.__VIEWSTATE数据的获取 (1)获取cookie ( ...
- 基于Python 3.11.0版本模拟登录并爬取西安理工大学正方教务系统的学分绩点并计算
目录 使用软件以及运行环境 对于环境的搭建 代码思路 需要导入的包 模拟登录 爬取数据 绩点计算器 功能一 功能二 完整代码 使用软件以及运行环境 win10系统,Vs Code软件,Python 3 ...
- Java--使用httpClient模拟登陆正方教务系统获取课表
最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢.于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程. 首先,我们先了解一下网站登录的原理:当我们输入学号, ...
最新文章
- 37、C++ Primer 4th笔记,特殊工具与技术,类成员指针
- cocos2d-x游戏开发(十)执行单元场景CCScene
- CRM的使用是讲究技巧的
- C/C++,Qt,Python,OpenCV小项目实战-实时桌面颜色查询
- File类和各种io类会不会自动创建文件
- 计算机软件技术基础_「连载」信息技术基础题型归纳之计算机软件2
- java泛型方法实现数值类型加法
- python代码价格_在Python中如何用代码求出超过某价格的且受欢迎程度top5的菜品名?...
- IEEE 会议论文 Latex模板
- HTML制作简易个人简历(表单)
- 微信公众平台二次开发技术文档
- VMware 14 Pro 虚拟机下CentOS 7操作系统安装教程
- Appsec在RSA 2013上
- 穿越NAT的p2p通信方法研究
- 单片机并行口开发——双数码管显示
- 老毛桃u盘重装win7教程|老桃毛U盘重装系统图文步骤
- 【学习日志】2022.10.16 万用头文件 sstream C++进制转换
- Harris Corner
- mybatis(java持久层框架)
- 分数加减法 java,Java练习 SDUT-2253_分数加减法
热门文章
- 使用Stabel Diffusion
- 百度软件中心权威认证!免费OCR软件下载体验!!!
- 宝石与石头(C语言)
- PCL K4PCS点云粗配准
- 分析化学在计算机行业的应用,计算机在分析化学的应用,Computer Application in Analytical Chemistry,音标,读音,翻译,英文例句,英语词典...
- Css background背景语法
- 家用什么牌子投影仪好?国产投影仪品牌
- 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 9月27日
- android路由表位置,知乎上已获千赞,已拿到offer
- 如何理解对连续系统传递函数Z变换