` 等課表結構
反爬應對:隨機 User-Agent、請求間隔、IP 代理池、模擬真實瀏覽器 Header
Java 爬蟲核心程式碼骨架
public class ZhengfangScheduleCrawler {
private static final String LOGIN_URL = "https://jwxt.xxx.edu.cn/default2.aspx";
private static final String SCHEDULE_URL = "https://jwxt.xxx.edu.cn/xskbcx.aspx?xh={studentId}&xm={name}&gnmkdm=N121603";
private final CloseableHttpClient httpClient;
private final CookieStore cookieStore = new BasicCookieStore();
public ZhengfangScheduleCrawler() {
this.httpClient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
.build();
}
public boolean login(String studentId, String password) throws IOException {
// 1. 取得驗證碼圖片 -> OCR 識別
String captcha = recognizeCaptcha(downloadCaptchaImage());
// 2. 提交登入表單 (包含 __VIEWSTATE 等隱藏欄位)
Map form = Map.of(
"txtUserName", studentId,
"TextBox2", password,
"txtSecretCode", captcha,
"RadioButtonList1", "學生",
"Button1", ""
);
HttpPost post = new HttpPost(LOGIN_URL);
post.setEntity(new UrlEncodedFormEntity(convert(form), "UTF-8"));
try (CloseableHttpResponse resp = httpClient.execute(post)) {
return resp.getStatusLine().getStatusCode() == 200 &&
!EntityUtils.toString(resp.getEntity()).contains("驗證碼錯誤");
}
}
public List fetchSchedule(String studentId, String name) throws IOException {
String url = SCHEDULE_URL.replace("{studentId}", studentId).replace("{name}", URLEncoder.encode(name, "UTF-8"));
HttpGet get = new HttpGet(url);
try (CloseableHttpResponse resp = httpClient.execute(get)) {
String html = EntityUtils.toString(resp.getEntity(), "GB2312"); // 正方常用 GB2312
return parseScheduleHtml(html);
}
}
private List parseScheduleHtml(String html) {
Document doc = Jsoup.parse(html);
// 針對正方課表表格結構編寫選擇器
Element table = doc.selectFirst("table#Table1"); // 或其他 id/class
// ... 解析 tr/td 組裝 Course 物件
return new ArrayList<>();
}
}
微信端整合流程
- 使用者首次使用 → 綁定學號/密碼 (加密儲存)
- 點選「查課表」選單 → 後端調用上述爬蟲/API 獲取資料
- 資料轉換為微信支援格式:
- 圖文訊息:每門課一條、含時間/地點/教師
- 小程序卡片:跳轉課表小程序 (體驗最佳)
- 模板訊息/客服訊息:主動推送
重要風險與合規提醒
⚠ 合規風險:爬蟲方案可能違反《計算機信息網路國際聯網管理暫行規定》、學校資安政策、正方系統使用條款。**強烈建議優先協調教務處開放官方 API**,若必須爬蟲,請:
- 嚴格限制請求頻率 (如每用戶每天 ≤ 5 次)
- 密碼加密儲存 (AES-GCM)、定期輪換金鑰
- 記錄完整存取日誌、接受審計
- 獲取學校資安處書面授權
進階優化:快取與異步
- 課表資料**半靜態** (一學期內極少變動) → Redis 快取 24 小時或按學期快取
- 爬蟲耗時較長 (驗證碼+請求+解析) → 使用**非同步任務佇列** (RabbitMQ/Redis Stream) + WebSocket/長輪詢/模板訊息推送結果
- 支援**手動刷新**按鈕清除快取重抓
總結
微信查課表核心在於**資料來源整合**。**官方 Web API 為首選**,穩定合規;無 API 時可採用**爬蟲模擬登入** (Jsoup + HttpClient + OCR),但需嚴格評估法律與資安風險。微信端以**小程序卡片或圖文訊息**呈現,搭配**Redis 快取 + 異步處理**提升回應速度與使用者體驗。
- 上一篇文章: Java 與異語言資料交互完整指南:Web Service、Socket、JNI、JACOB、共享儲存
- 下一篇文章: C 語言遞迴輸出費波那契數列前 10 項:完整程式碼與原理詳解
Copyright ©
程式碼之家 All Rights Reserved