正方教務管理系統是國內高校廣泛採用的教務平台。本文完整展示如何使用 Java 模擬瀏覽器行為,實現自動登入(含驗證碼識別/手動輸入)、查詢學期成績、查詢個人課表、查詢空教室四大核心功能。專案採用 HttpClient + Jsoup 技術棧,採 DAO 設計模式分層,程式碼結構清晰,易於擴展維護。
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
}
__VIEWSTATE 隱藏表單欄位(ASP.NET WebForm 關鍵)。Jwgl.java封裝登入驗證、攜帶 Cookie 維持 Session、POST 表單提交、Jsoup 解析 HTML 表格等完整流程。
__VIEWSTATE__VIEWSTATE,編碼為 GB2312public 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 |
com.ican.yueban
├── jwgl
│ └── Jwgl.java # 核心業務邏輯
├── utils
│ ├── DateUtils.java # 日期/周次/節次計算
│ ├── GlobalConstant.java # 系統常數配置
│ ├── IOUtils.java # HTTP/圖片/VIEWSTATE 工具
│ └── ParseUtils.java # 參數轉換
└── test
└── Main.java # 測試入口
聲明:本程式碼僅供學習交流使用,請勿用於非法用途或對教務系統造成壓力。實際部署請遵守學校相關規定與《網絡安全法》。