前言

昨天开始了小爱课程表的开发,主要实现的功能是导入本校的教务系统课程表。今天完成并自测通过了,就等审核通过上线啦。现在就来记录一下这次开发。

具体的流程就不多说了,直接看开发者文档吧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 审核通过啦

小爱课程表导入课程表功能开发(正方教务系统)相关推荐

  1. 新版小爱课程表正方教务系统课表适配

    新版小爱课程表正方教务系统课表适配 前言 之前写过一篇小爱课程表的教务系统适配,但是是比较老的版本开发者工具适配了,最近看到小爱课程表开发者工具更新了,就想着写一篇新的博客,顺便优化一下之前的代码,还 ...

  2. 我的第一个开源项目:Java爬虫爬取旧版正方教务系统课程表、成绩表

    Java爬虫爬取旧版正方教务系统课程表.成绩表 一.项目展示 1.正方教务系统 首页 2.爬虫系统 首页: 成绩查询: 课表查询: 二.项目实现 1.爬取思路描述 无论是成绩查询或课表查询亦或者其它的 ...

  3. 用Python登陆新版正方教务系统获取课程表(及RSA加密密码实现)

    前言 最近做一个微信小程序,需要登录教务系统.提前用python尝试一下登录接口,并获取到课表打印出来. 我们学校用到新版正方教务系统,长这个样子. 相比旧版的教务系统,唯一好处是不用输入二维码方便爬 ...

  4. 新版正方教务系统导出课程表-油猴脚本

    https://www.cnblogs.com/31415926535x/p/12244461.html 简介 这个油猴脚本主要是针对新版的正方教务系统,实现将课程表转化为一个 courses.ics ...

  5. JAVA使用HttpClient模拟登录正方教务系统,爬取学籍信息和课程表成绩等,超详细登录分析和代码注解

    目录 前言 分析 代码实现 第一次GET POST登录 第二次Get 第三次GET 第四次GET 第五次GET 测试 完整代码 前言 最近在做一个APP,需要获取我们学校--武汉纺织大学皇家停水断电断 ...

  6. php正方系统抓取课表,以正方教务系统为例,用php模拟登陆抓取课表、空教室,抓取课表...

    以正方教务系统为例,用php模拟登陆抓取课表.空教室,抓取课表 课程格子和超级课程表这两个应用,想必大学生都很熟悉,使用自己的学号和教务系统的密码,就可以将自己的课表导入,随时随地都可以在手机上查看. ...

  7. 用java模拟登录正方教务系统,抓取课表和个人成绩等数据

    之前学了一些java web的编程,理解了web应用的原理后,就突然想到,可以用java模拟登录吉珠的教务系统,然后爬取里面的课表.成绩.个人信息等等数据,然后就可以写成一个简易的课表APP. 一.第 ...

  8. nodejs模拟登陆旧版正方教务系统

    nodejs模拟登陆旧版正方教务系统 nodejs模拟登陆学校教务系统 1.分析教务系统地址 2.分析请求头和请求数据 3.对Cookie.__VIEWSTATE数据的获取 (1)获取cookie ( ...

  9. 基于Python 3.11.0版本模拟登录并爬取西安理工大学正方教务系统的学分绩点并计算

    目录 使用软件以及运行环境 对于环境的搭建 代码思路 需要导入的包 模拟登录 爬取数据 绩点计算器 功能一 功能二 完整代码 使用软件以及运行环境 win10系统,Vs Code软件,Python 3 ...

  10. Java--使用httpClient模拟登陆正方教务系统获取课表

    最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢.于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程. 首先,我们先了解一下网站登录的原理:当我们输入学号, ...

最新文章

  1. 37、C++ Primer 4th笔记,特殊工具与技术,类成员指针
  2. cocos2d-x游戏开发(十)执行单元场景CCScene
  3. CRM的使用是讲究技巧的
  4. C/C++,Qt,Python,OpenCV小项目实战-实时桌面颜色查询
  5. File类和各种io类会不会自动创建文件
  6. 计算机软件技术基础_「连载」信息技术基础题型归纳之计算机软件2
  7. java泛型方法实现数值类型加法
  8. python代码价格_在Python中如何用代码求出超过某价格的且受欢迎程度top5的菜品名?...
  9. IEEE 会议论文 Latex模板
  10. HTML制作简易个人简历(表单)
  11. 微信公众平台二次开发技术文档
  12. VMware 14 Pro 虚拟机下CentOS 7操作系统安装教程
  13. Appsec在RSA 2013上
  14. 穿越NAT的p2p通信方法研究
  15. 单片机并行口开发——双数码管显示
  16. 老毛桃u盘重装win7教程|老桃毛U盘重装系统图文步骤
  17. 【学习日志】2022.10.16 万用头文件 sstream C++进制转换
  18. Harris Corner
  19. mybatis(java持久层框架)
  20. 分数加减法 java,Java练习 SDUT-2253_分数加减法

热门文章

  1. 使用Stabel Diffusion
  2. 百度软件中心权威认证!免费OCR软件下载体验!!!
  3. 宝石与石头(C语言)
  4. PCL K4PCS点云粗配准
  5. 分析化学在计算机行业的应用,计算机在分析化学的应用,Computer Application in Analytical Chemistry,音标,读音,翻译,英文例句,英语词典...
  6. Css background背景语法
  7. 家用什么牌子投影仪好?国产投影仪品牌
  8. 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 9月27日
  9. android路由表位置,知乎上已获千赞,已拿到offer
  10. 如何理解对连续系统传递函数Z变换