Browse Source

Merge pull request #277 from XingHeYuZhuan/pending

pending
星河欲转 3 hours ago
parent
commit
36b2de2753
1 changed files with 37 additions and 53 deletions
  1. 37 53
      resources/GDUST/gdust.js

+ 37 - 53
resources/GDUST/gdust.js

@@ -168,65 +168,49 @@ function getSemesterCode(semesterIndex) {
  * 请求和解析课程数据
  */
 async function fetchAndParseCourses(academicYear, semesterIndex) {
-    AndroidBridge.showToast("正在请求课表数据...");
-
     const semesterCode = getSemesterCode(semesterIndex);
+    const requestBody = `xnm=${academicYear}&xqm=${semesterCode}&kzlx=ck&xsdm=&kclbdm=`;
     
-    // API URL 和请求体
-    const xnmXqmBody = `xnm=${academicYear}&xqm=${semesterCode}&kzlx=ck&xsdm=&kclbdm=`; 
-    const url = "https://webvpn.gdust.edu.cn/http/77726476706e69737468656265737421a1a013d2766626022b5cc7fd/kbcx/xskbcx_cxXsgrkb.html?vpn-12-o1-172.16.254.1&gnmkdm=N2151";
-
-    console.log(`JS: 发送请求到 ${url}, body: ${xnmXqmBody}`);
-
-    const requestOptions = {
-        "headers": {
-            "content-type": "application/x-www-form-urlencoded;charset=UTF-8", 
-        },
-        "body": xnmXqmBody,
-        "method": "POST",
-        "credentials": "include"
-    };
-
-    try {
-        const response = await fetch(url, requestOptions);
-
-        if (!response.ok) {
-            throw new Error(`网络请求失败。状态码: ${response.status} (${response.statusText})`);
-        }
-        
-        const jsonText = await response.text();
-        let jsonData;
+    // 定义可能的入口地址:1. WebVPN 穿透地址 2. 内网直连地址
+    // 该学校反馈内网环境下 webvpn的入口会被跳转为内网地址 因此特别调整为存在多个链接获取,没有这个问题的适配参考可以简化逻辑
+    const targetUrls = [
+        "https://webvpn.gdust.edu.cn/http/77726476706e69737468656265737421a1a013d2766626022b5cc7fd/kbcx/xskbcx_cxXsgrkb.html?vpn-12-o1-172.16.254.1&gnmkdm=N2151",
+        "http://172.16.254.1/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N2151"
+    ];
+
+    for (const url of targetUrls) {
         try {
-            jsonData = JSON.parse(jsonText);
+            const response = await fetch(url, {
+                method: "POST",
+                headers: { 
+                    "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" 
+                },
+                body: requestBody,
+                credentials: "include"
+            });
+
+            if (response.ok) {
+                const jsonText = await response.text();
+                const jsonData = JSON.parse(jsonText);
+                if (jsonData && jsonData.kbList) {
+                    const parsedCourses = parseJsonData(jsonData.kbList);
+                    if (parsedCourses.length > 0) {
+                        return {
+                            courses: parsedCourses,
+                            config: {
+                                semesterStartDate: null,
+                                semesterTotalWeeks: 20
+                            }
+                        };
+                    }
+                }
+            }
         } catch (e) {
-            console.error('JS: JSON 解析失败,可能是会话过期:', e);
-            AndroidBridge.showToast("数据返回格式错误,可能是您未成功登录或会话已过期。");
-            return null;
+            console.error(`Entry failed: ${url}`);
         }
-
-        const courses = parseJsonData(jsonData); 
-
-        if (courses.length === 0) {
-            AndroidBridge.showToast("未找到任何课程数据,请检查所选学年学期是否正确或本学期无课,或教务系统需要二次登录。");
-            return null;
-        }
-
-        console.log(`JS: 课程数据解析成功,共找到 ${courses.length} 门课程。`);
-        
-        // 默认总周数为 20,周一为一周第一天。
-        const config = {
-            semesterTotalWeeks: 20,
-            firstDayOfWeek: 1 
-        };
-
-        // 返回课程列表和配置信息
-        return { courses: courses, config: config }; 
-
-    } catch (error) {
-        AndroidBridge.showToast(`请求或解析失败: ${error.message}`);
-        console.error('JS: Fetch/Parse Error:', error);
-        return null;
     }
+    AndroidBridge.showToast("未能获取课表数据,请检查网络环境或登录状态。");
+    return null;
 }
 
 async function saveCourses(parsedCourses) {