作为个人来讲非常值得纪念的,具有一定流传度的,较为正规的小项目——小爱课程表导入,于2020/9/9正式完成。审核通过时间暂未明确,测试已经完美。
2020/9/16修复已知的BUG
2020/9/21修复已知的BUG

废话不多说,讲讲体会以及开发过程遇到的坑。
由于我同样是第一次真正接触JavaScript,遇到的某些问题以及相关解决方案或许能给其他初学开发者较大的帮助。

看了官方的开发文档,我们可以明确,整个开发过程只需要编辑两个文件:
scheduleHtmlProvider.js
scheduleHtmlPasrse.js

第一个文件适配得较好,用来截取HTML片段,而你截取的片段将弹出窗口以页面的形式展现,如果你发现弹出窗口中已经包含了课程表,就可以开始编辑第二个文件了。(不要和我一样傻傻的一定要把课程表完美地抠下来,就算包含其他代码,如图就行)

第二个文件是关键中的关键,在这里,你要做到两件事:
1.从第一个文件get到的HTML中提取出自己想要的信息
2.将提取出来的信息处理加工成要求的格式
其中,官方给出的数据格式可能会让新手懵掉。我稍微解释一下。

类型Array[{},{}]
这种格式实际上就是成员为对象的数组,本质上还是数组

接下来直接说多个坑吧:
1.输出格式很重要!非常重要!如果你发现自己出现第二个js文件运行fails的情况,console.log一下自己的输出结果,仔细检查每一项(可以着重检查一下weeks数组和sections)
2.如果你在电脑端成功运行,在手机端却发现出现了如“数据验证错误”的错误,很可能是sections:[]c出了问题,因为sections出现错误不一定会导致fails,注意检查。(检查方法之一,CTRL+A全选,然后复制到记事本用查找功能查找null或者name、weeks这样的属性名)
以下是我的第二个文件的代码:

function scheduleHtmlParser(html) {//除函数名外都可编辑//传入的参数为上一步函数获取到的html//可使用正则匹配//可使用解析dom匹配,工具内置了$,跟jquery使用方法一样,直接用就可以了,参考:https://juejin.im/post/5ea131f76fb9a03c8122d6b9//以下为示例,您可以完全重写或在此基础上更改const startTime=['08:30',"09:20","10:20","11:10","14:00","14:50","15:50","16:40","18:50","19:40","20:20","21:10"]const endTime=["09:10","10:00","11:00","11:50","14:40","15:30","16:30","17:20","19:30","20:10","21:00","21:40"]const $ = cheerio.load(html);const iddi=['0E8A79655F814928BAA9F083B34EB595-','8A667F6495814122B67D8E13AF79A12A-','60BDE149ADF643939CC0C16FDDE16D0F-','ABB96948C0104A4D8EEEDBB90CC6D0CA-','5E55E2D035F3401F9DABAACFB48F8F62-','B94C126D066E4753B87DF4BE7E0494E4-']function class_get(test)//获取课程名{let m=1;let begin_a=test.split('--------')[0];let end_a=test.split('--------')[1];while(begin_a.substring(0,m+1)===end_a.substring(0,m+1)){m++;}return begin_a.substring(0,m)}function room_get(test)//获取教室名{return test[1].children[0].data}function teacher_get(test){//获取教师名return test[0].children[0].data
}function week_get(dataa){//获取周数序列//test[1].children[0].var week_str= dataa.children[0].data//console.log(week_str)let x=week_str.indexOf(',');let y=week_str.indexOf('-');let dan=week_str.indexOf('单');let shuan=week_str.indexOf('双')//console.log("x="+x)// console.log("y="+y)if(dan!=-1||shuan!=-1){week_str=week_str.substring(0,week_str.length-2)//console.log(week_str)}else{week_str=week_str.substring(0,week_str.length-1)//console.log(week_str)}if(x!=-1){//两种情况1.【8,10周】2.【8-11,11-17周】if(y!=-1){//情况2var result_1=[]let array_week=week_str.split(',') for(let i=0;i<array_week.length;i++){if(array_week[i].indexOf('-')!=-1){let begin=array_week[i].split('-')[0]let end=array_week[i].split('-')[1]for(let j=Number(begin);j<Number(end)+1;j++){result_1.push(j)}}else{console.log(array_week[i])result_1.push(Number(array_week[i]))}console.log(result_1)}}else{//情况1var result_1=[]let array_week=week_str.split(',')for(let i=0;i<array_week.length;i++){result_1.push(Number(array_week[i]))}}}else{if(y!=-1){var result_1=[]let begin=week_str.split('-')[0]let end=week_str.split('-')[1]if(dan!=-1){//单周for(let i=Number(begin);i<(Number(end)+1)/2;i++){result_1.push(2*i-1)}}else if(shuan!=-1){//双周for(let i=Number(begin);i<(Number(end)+1)/2;i++){result_1.push(2*i)}}else{for(let i=Number(begin);i<Number(end)+1;i++){result_1.push(i)}}}else{result_1=[Number(week_str)]}}return result_1
}
function section_get(n,room,section_test){var i=0;
//      console.log(section_test[3*n+2])let sth_a=section_test[3*n+2].children[0].data
//     console.log(room)
//     console.log(section_test)
//     console.log(sth_a)while(sth_a.substring(0,i+1)===room.substring(0,i+1)){i++;
//           console.log(i)
//           console.log(sth_a.substring(0,i+1))
//           console.log(room.substring(0,i+1))}//console.log(i)let a= sth_a.substring(i+1,sth_a.length-2)//console.log(a)var section_result=[]let a_a=a.split('-')for(let j=0;j<a_a.length;j++){//console.log(Number(a_a[j]))let res={"section": Number(a_a[j]),"startTime": startTime[Number(a_a[j])-1],"endTime": endTime[Number(a_a[j])-1]}//console.log(res)section_result.push(res)}
//     console.log(section_result)return section_result;}
function make_it(m,n){//m代表第几节课(第几行)//n代表星期几(第几列)id=iddi[m-1]let demo=$("div#"+id+n+"-2",":contains('教室')").text()let demo_bool=demo.indexOf('-----------');   if(demo_bool!=-1){var length_demo=demo.split('-----------')
//         console.log(length_demo.length)var courseInfos_jscr=new Array()var room_test=$("div#"+id+n+"-1").find('font')//var room_data=room_test[2*i+1].children[0].data//        console.log(room_test)var section_test=$("div#"+id+n+"-2").find('font')
//         console.log(section_test)var week_test=$("div#"+id+n+"-2").find('font')//   console.log(week_test)var teacher_test=$("div#"+id+n+"-2").find('font')//console.log(teacher_test)for(let i=0;i<length_demo.length;i++){//console.log(length_demo[i])//console.log(room_test[2*i+1].children[0].data)var array_demo={name: class_get(length_demo[i]),position: room_test[2*i+1].children[0].data,teacher: teacher_test[3*i].children[0].data,weeks:week_get(week_test[3*i+1]),day: n,sections:section_get(i,room_test[2*i+1].children[0].data,section_test),}courseInfos_jscr.push(array_demo)}}else{var room_test=$("div#"+id+n+"-1").find('font')var week_test=$("div#"+id+n+"-2").find('font')var teacher_test=$("div#"+id+n+"-2").find('font')var section_test=$("div#"+id+n+"-2").find('font')var class_test=$("div#"+id+n+"-2",":contains('教室')").text()
//         console.log(room_test)
//         console.log(section_test)var courseInfos_jscr=new Array()//console.log(week_get(week_test.test[1]))courseInfos_jscr[0]={name: class_get(class_test),position: room_get(room_test),teacher: teacher_get(teacher_test),weeks:week_get(week_test[1]),day: n,sections:section_get(0,room_get(room_test),section_test)}}return courseInfos_jscr}
//     sections: [
//           {//             "section": 2,
//             "startTime": "08:00",//可不填
//             "endTime": "08:50"//可不填
//           },
//           {//             "section": 3,
//             "startTime": "09:00",//可不填
//             "endTime": "09:50"//可不填
//           }
//         ],
//       }
//     ],var sectionTime= [{"section": 1,"startTime": startTime[0],"endTime": endTime[0]},{"section": 2,"startTime": startTime[1],"endTime": endTime[1]},{"section": 3,"startTime": startTime[2],"endTime": endTime[2]},{"section": 4,"startTime": startTime[3],"endTime": endTime[3]},{"section": 5,"startTime": startTime[4],"endTime": endTime[4]},{"section": 6,"startTime": startTime[5],"endTime": endTime[5]},{"section": 7,"startTime": startTime[6],"endTime": endTime[6]},{"section": 8,"startTime": startTime[7],"endTime": endTime[7]},{"section": 9,"startTime": startTime[8],"endTime": endTime[8]},{"section": 10,"startTime": startTime[9],"endTime": endTime[9]},{"section": 11,"startTime": startTime[10],"endTime": endTime[10]},{"section": 12,"startTime": startTime[11],"endTime": endTime[11]}];
//      var cour = new Array();
//      var num=0;
//      cour[num]=courseInfos_jscr;//console.log(make_it(1,2))function do_t(){var result_re=new Array();var resultt=new Array();var max_m=6;var max_n=7;for(var m=1;m<max_m+1;m++){for(var n=1;n<max_n+1;n++){var idn=iddi[m-1];var demo=$("div#"+idn+n+"-2",":contains('教室')").text()//console.log(demo.length)if(demo.length<10){//console.log(demo.length)}else{//console.log(make_it(m,n))resultt=make_it(m,n)result_re.push.apply(result_re,resultt)}}}return result_re;//console.log(result_re)}//******
//         var m=2;
//         var n=4;
//         make_it(m,n)//*******var wwwww=do_t();console.log(wwwww)//         var wwwww=[]//console.log(make_it(1,1))return {courseInfos:wwwww,sectionTimes:sectionTime};
}

匆匆做的,还要忙其他的。算法就没怎么优化,也不够规范。仅供参考hhh
另,如有使用代码需求请优化一下算法以及规范函数调用格式(hhh不能祸害你们)并和本人联系。

SZTU深圳技术大学教务系统小爱课程表导入——强智科技13369相关推荐

  1. 【调剂】2022年深圳技术大学-深圳大学联合培养研究生招生调剂信息

    公众号[计算机与软件考研]每天都会发布最新的计算机考研调剂信息! 点击公众号界面左下角的调剂信息或者公众号回复"调剂"是计算机/软件等专业的所有调剂信息集合,会一直更新的. 各位考 ...

  2. 期末机械复习题(深圳技术大学20级)

    期末机械复习题(深圳技术大学20级) 简答题及名词解释: 机器是人为实物的组合体,具有确定的机械运动,它可以用来转换能量.完成有用功或处理信息,以代替或减轻人的劳动:机构是人为实物的组合体,具有确定的 ...

  3. 深圳技术大学计算机专业分数线,深圳技术大学2020录取分数线(附2017-2020年分数线)...

    深圳技术大学2020录取分数线是多少,各专业录取分数线是多少,是每个填报深圳技术大学的考生最关注的问题,随着各省高考录取批次相继公布,考生也开始关心是否被深圳技术大学的录取,一品高考网整理相关信息供参 ...

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

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

  5. 新科院-小爱课程表导入使用说明

    新科院-小爱课程表导入使用说明 本方法适用于小米系统在桌面导入学校课表,方便查询以及提醒自己上下课,使用小米的小爱课程表小部件减少繁琐的今日校园课表查询. 注:由于之前学校教务系统没有适配小爱课程表功 ...

  6. python登录教务系统_强智科技教务系统python爬虫模拟登录分析(湖南)

    强智科技教务系统python爬虫模拟登录分析(湖南) 本文章仅用作于学习 前提:最近期末到来,想第一时间看到新出成绩的,于是就有了爬取学校教务系统自己的成绩并通过Qmsg酱推送到自己QQ上的想法,目前 ...

  7. python爬虫获取强智科技教务系统学科成绩(模拟登录+成绩获取)

    python爬取强智科技教务系统,以江苏科技大学为例:本人开发的系统作为参考:https://www.wjn1996.cn/estudy/tools/educationLogin.jsp?school ...

  8. 强智科技教务系统验证码识别

    强智科技验证码识别 前言 由于近期在写一个教务系统的爬虫程序,但是网站的验证码让人很头疼,所以笔者临时找了一些资料学习了一下,本人python用的很少,而且在机器学习这块也是新手,从来没有接触过,所以 ...

  9. 小爱课程表导入课程表功能开发(正方教务系统)

    前言 昨天开始了小爱课程表的开发,主要实现的功能是导入本校的教务系统课程表.今天完成并自测通过了,就等审核通过上线啦.现在就来记录一下这次开发. 具体的流程就不多说了,直接看开发者文档吧https:/ ...

最新文章

  1. 2017云计算及工业物联网论坛即将于广州开幕
  2. ansible所有模块一览
  3. Jsp 和 Servlet 有什么不同?
  4. C语言僵尸进程,C/C++网络编程8——多进程服务器端之销毁僵尸进程
  5. angularJs中ngModel的坑
  6. strictmath_Java StrictMath rint()方法与示例
  7. java方法语法_Java基础语法----方法
  8. 菜菜PyTorch深度学习框架最全笔记(第二次课)
  9. 【Scratch案例实操】scratch西游记师徒谁人气高 scratch编程案例教学 scratch创意编程 少儿编程教案
  10. 教你做系统的公众号选题规划,建立自己的选题库
  11. security实现账密、手机号和微信三种方式登陆
  12. 最新HTML完整结构
  13. android谷歌地图_Android Google地图:添加天气数据
  14. 室内眩光测量UGR测试系统
  15. 经典语录-2014330
  16. 两直线平行交叉相乘_向量平行公式和垂直公式
  17. 面试让我手写红黑树?!
  18. 计算机投诉信英语作文,投诉信英语作文(通用5篇)
  19. 新版第三方橘子/威客接单系统网站源码+有充值API接口
  20. 21考研:一研为定,定为研一

热门文章

  1. 南京信息工程大学考研计算机专业,南京信息工程大学
  2. cad怎么导出为图片?转换渠道选择
  3. tplinkac2600评测_tp-link千兆ac2600无线5g路由器好不好?全面解析真实情况如何? | 智能扫地机器人评测...
  4. 在一个程序中什么算是亮点_VASP 计算问题小结
  5. 勇敢说:「要求加薪」,不必低声下气(上)
  6. LE5010蓝牙芯片(凌思微)开发总结
  7. android 最高版本,kwgt最高版本下载-kwgt高级版下载-游戏大玩家
  8. 基于IMS网络融合的关键技术问题分析
  9. HCNP RoutingSwitching之MAC安全
  10. GetLastError简介及返回值列表