niit.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // 文件: courseImportApi.js
  2. // 南京工业职业技术大学(jwxt.niit.edu.cn)「我的课表」API 方案适配脚本(金智教育 WIS 平台)
  3. // 全自动:自动确定当前学期,直接调用教务后端接口获取课表并导入,无任何人工输入。
  4. const SCHOOL = {
  5. api: "https://jwxt.niit.edu.cn/jwapp/sys/wdkb/modules/xskcb/cxxszhxqkb.do"
  6. };
  7. // 本校作息时间表(11 节)
  8. const PRESET_TIME_SLOTS = [
  9. { number: 1, startTime: "08:00", endTime: "08:45" },
  10. { number: 2, startTime: "08:55", endTime: "09:40" },
  11. { number: 3, startTime: "10:00", endTime: "10:45" },
  12. { number: 4, startTime: "10:55", endTime: "11:40" },
  13. { number: 5, startTime: "13:30", endTime: "14:15" },
  14. { number: 6, startTime: "14:25", endTime: "15:10" },
  15. { number: 7, startTime: "15:30", endTime: "16:15" },
  16. { number: 8, startTime: "16:25", endTime: "17:10" },
  17. { number: 9, startTime: "18:15", endTime: "19:00" },
  18. { number: 10, startTime: "19:10", endTime: "19:55" },
  19. { number: 11, startTime: "20:05", endTime: "20:50" }
  20. ];
  21. // 自动确定当前学期,优先取页面学期标签,其次取当前日期
  22. function currentTerm() {
  23. try {
  24. var t = document.querySelector("#dqxnxq2");
  25. if (t && t.getAttribute("value")) return t.getAttribute("value");
  26. } catch (e) { }
  27. var y = new Date().getFullYear();
  28. return (new Date().getMonth() >= 1 && new Date().getMonth() <= 6)
  29. ? (y - 1) + "-" + y + "-2"
  30. : y + "-" + (y + 1) + "-1";
  31. }
  32. // POST 请求教务接口(复用登录 Cookie)
  33. async function fetchCourseRows() {
  34. var resp = await fetch(SCHOOL.api, {
  35. method: "POST",
  36. headers: {
  37. "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
  38. "x-requested-with": "XMLHttpRequest"
  39. },
  40. body: "XNXQDM=" + currentTerm(),
  41. credentials: "include"
  42. });
  43. return (await resp.json()).datas;
  44. }
  45. // 从 datas 中定位课程 rows(键名可能不同,做兜底)
  46. function pluckRows(datas) {
  47. for (var k in datas) {
  48. var v = datas[k];
  49. if (v && Array.isArray(v.rows)) return v.rows;
  50. if (Array.isArray(v)) return v;
  51. }
  52. return [];
  53. }
  54. // 解析一条排课;周次串"111...000..."逐位为1即在第i+1周上课
  55. function parseCourse(r) {
  56. var day = parseInt(r.SKXQ, 10);
  57. var startSection = parseInt(r.KSJC, 10);
  58. var endSection = parseInt(r.JSJC, 10);
  59. if (!r.KCM || isNaN(day) || isNaN(startSection) || isNaN(endSection)) return null;
  60. var weeks = [];
  61. (r.SKZC || "").split("").forEach(function (c, i) { if (c === "1") weeks.push(i + 1); });
  62. if (!weeks.length) return null;
  63. var name = r.KCM;
  64. var teacher = (r.SKJS || "待定").split("/")[0];
  65. var position = r.JASMC || "待定";
  66. // 去重 key:星期+节次+课程+教师+教室;并合并同 key 的周次
  67. var key = day + "|" + startSection + "|" + endSection + "|" + name + "|" + teacher + "|" + position;
  68. return { key: key, course: { name: name, teacher: teacher, position: position, day: day, startSection: startSection, endSection: endSection, weeks: weeks } };
  69. }
  70. // 主流程
  71. (async function () {
  72. if (!(window.AndroidBridgePromise && window.AndroidBridgePromise.saveImportedCourses)) return;
  73. var datas = await fetchCourseRows();
  74. var rows = pluckRows(datas);
  75. console.log("[课程API导入] 接口返回行数:", rows.length, rows);
  76. var index = {}, courses = [];
  77. for (var i = 0; i < rows.length; i++) {
  78. var p = parseCourse(rows[i]);
  79. if (!p) continue; // 只识别完整学期课表,不做调课/补课/停课过滤
  80. if (index[p.key] === undefined) {
  81. index[p.key] = courses.length;
  82. courses.push(p.course);
  83. } else {
  84. var ex = courses[index[p.key]];
  85. p.course.weeks.forEach(function (w) { if (ex.weeks.indexOf(w) === -1) ex.weeks.push(w); });
  86. }
  87. }
  88. courses.forEach(function (c) { c.weeks.sort(function (a, b) { return a - b; }); });
  89. if (!courses.length) return;
  90. var totalWeeks = 0;
  91. for (var j = 0; j < rows.length; j++) totalWeeks = Math.max(totalWeeks, String(rows[j].SKZC || "").length);
  92. await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(PRESET_TIME_SLOTS));
  93. await window.AndroidBridgePromise.saveCourseConfig(JSON.stringify({ semesterStartDate: null, semesterTotalWeeks: totalWeeks || 20, firstDayOfWeek: 1 }));
  94. await window.AndroidBridgePromise.saveImportedCourses(JSON.stringify(courses));
  95. try { window.AndroidBridge.notifyTaskCompletion(); } catch (e) { }
  96. })();