首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 模擬登入正方教務系統:爬取成績、課表與空教室完整實戰

     編輯:Java 相關知識

專案背景與架構概覽

正方教務管理系統是國內高校廣泛採用的教務平台。本文完整展示如何使用 Java 模擬瀏覽器行為,實現自動登入(含驗證碼識別/手動輸入)、查詢學期成績、查詢個人課表、查詢空教室四大核心功能。專案採用 HttpClient + Jsoup 技術棧,採 DAO 設計模式分層,程式碼結構清晰,易於擴展維護。

核心模組設計

1. 常數配置層 GlobalConstant.java

集中管理所有 URL、學期代碼、校區標識、課程節次映射等配置,便於不同學校環境快速遷移適配。

public interface GlobalConstant {
    String INDEX_URL = "https://jwgl2.ujn.edu.cn";
    String SECRETCODE_URL = "https://jwgl2.ujn.edu.cn/CheckCode.aspx";
    String LOGIN_URL = "https://jwgl2.ujn.edu.cn/default2.aspx";
    String MAIN_URL = "https://jwgl2.ujn.edu.cn/xs_main.aspx?xh=";
    // 空教室、成績、課表等業務 URL 與 gnmkdm 參數
    String QUERY_CLASSROOM_URL = "https://jwgl2.ujn.edu.cn/xxjsjy.aspx?xh=";
    String QUERY_STU_GRADE_URL = "https://jwgl2.ujn.edu.cn/xscjcx.aspx?xh=";
    String QUERY_STU_COURSE_URL = "https://jwgl2.ujn.edu.cn/xskbcx.aspx?xh=";
    // 校區代碼
    String XIXIAOQU = "1"; String DONGXIAOQU = "2"; String ZHANGQIUXIAOQU = "3";
    // 課程節次映射(關鍵:正方系統使用特殊編碼)
    String CLASS1 = "'1'|'1','0','0','0','0','0','0','0','0'"; // 1-2節
    // ... CLASS2 至 CLASS11
}

2. 工具類層

  • DateUtils:計算當前周次、星期、課程節次(依據開學日期動態推算)。
  • IOUtils:HTTP 響應流轉字串、驗證碼圖片下載/儲存、提取 __VIEWSTATE 隱藏表單欄位(ASP.NET WebForm 關鍵)。
  • ParseUtils:將課程節次轉換為正方系統專用的編碼字串。

3. 核心業務邏輯 Jwgl.java

封裝登入驗證、攜帶 Cookie 維持 Session、POST 表單提交、Jsoup 解析 HTML 表格等完整流程。

登入流程關鍵步驟

  1. GET 取得驗證碼圖片與初始 Cookie
  2. GET 取得登入頁面 __VIEWSTATE
  3. 人工輸入驗證碼(或接入 OCR 識別服務)
  4. POST 提交:學號、密碼、驗證碼、身份、__VIEWSTATE,編碼為 GB2312
  5. 判斷 302 重導向,攜帶 Cookie 訪問主頁提取學生姓名,確認登入成功

查詢空教室範例

public void queryClassroom(String xiaoqu, String xqj, String sjd) throws Exception {
    // 1. 構建請求 URL 與參數
    String url = QUERY_CLASSROOM_URL + stuNumber + "&xm=" + stuName + QUERY_CLASSROOM_GNMKDM;
    String viewState = IOUtils.getViewState(url, Cookie, MAIN_URL + stuNumber);
    
    // 2. 封裝表單參數(周次、校區、節次、單雙周等)
    List<NameValuePair> params = new ArrayList<>();
    params.add(new BasicNameValuePair("__VIEWSTATE", viewState));
    params.add(new BasicNameValuePair("xiaoq", xiaoqu));
    params.add(new BasicNameValuePair("ddlKsz", nowWeek)); // 開始周
    params.add(new BasicNameValuePair("ddlJsz", nowWeek)); // 結束周
    params.add(new BasicNameValuePair("xqj", xqj));        // 星期
    params.add(new BasicNameValuePair("sjd", parseSjd));   // 節次編碼
    // ... 其他固定參數
    
    // 3. 發送 POST、解析響應表格
    HttpPost post = new HttpPost(url);
    post.setEntity(new UrlEncodedFormEntity(params, "GB2312"));
    post.setHeader("Cookie", Cookie);
    // ... 執行請求、Jsoup 解析 td 標籤、提取教室名稱
}

關鍵技術難點與解決方案

難點解決方案
ASP.NET __VIEWSTATE 動態驗證每次請求前 GET 取得最新值,攜帶 Cookie 與 Referer
GB2312 編碼強制要求所有 UrlEncodedFormEntity、HTML 解析統一指定 GB2312
驗證碼圖片處理下載至本地人工輸入,或整合 Tesseract/商業 OCR API 自動識別
課程節次特殊編碼預先定義映射表(CLASS1~CLASS11),查詢時動態轉換
Session 維持全流程共享 CloseableHttpClient 實例,手動管理 Cookie Header

擴展建議

  • 整合 Spring Boot + Scheduler 實現定時自動爬取、微信/郵件推送成績變動
  • 引入 Headless Chrome (Puppeteer/Playwright) 替代 HttpClient,應對更複雜的 JS 渲染、動態驗證碼、加密參數
  • 封裝為 RESTful API,前端對接 Vue/React 開發個人教務小程式
  • 支援多校區、多學期、歷史成績匯出 Excel/PDF

完整程式碼結構

com.ican.yueban
├── jwgl
│   └── Jwgl.java           # 核心業務邏輯
├── utils
│   ├── DateUtils.java      # 日期/周次/節次計算
│   ├── GlobalConstant.java # 系統常數配置
│   ├── IOUtils.java        # HTTP/圖片/VIEWSTATE 工具
│   └── ParseUtils.java     # 參數轉換
└── test
    └── Main.java           # 測試入口

聲明:本程式碼僅供學習交流使用,請勿用於非法用途或對教務系統造成壓力。實際部署請遵守學校相關規定與《網絡安全法》。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved