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

PHP 模擬登錄正方教務系統:課表與空教室查詢完整實現

     編輯:PHP 相關知識

專案背景

參考「課程格子」「超級課程表」思路,利用 PHP cURL 模擬學生登錄教務系統,自動抓取課表、空教室數據,構建個性化查詢服務。

核心難點攻克

1. 驗證碼繞過:正方系統的「特色」漏洞

正方登錄頁驗證碼圖片由單獨請求生成。若瀏覽器不請求該圖片 URL,後端就不會生成 Session 中的驗證碼值。直接提交空驗證碼即可通過驗證。可在代碼層面直接忽略驗證碼請求。

2. cURL 封裝通用請求函數

function curl_request($url, $post = '', $cookie = '', $returnCookie = 0) {
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_AUTOREFERER => 1,
        CURLOPT_REFERER => '教務系統登錄頁URL', // 必須設置
        CURLOPT_TIMEOUT => 20,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => false, // 教務系統多為 HTTP 或自簽證書
    ]);
    if ($post) {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    }
    if ($cookie) curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    if ($returnCookie) curl_setopt($ch, CURLOPT_HEADER, 1);

    $data = curl_exec($ch);
    if (curl_errno($ch)) return curl_error($ch);
    curl_close($ch);

    if ($returnCookie) {
        list($header, $body) = explode("\r\n\r\n", $data, 2);
        preg_match_all("/Set-Cookie:([^;]*);/", $header, $matches);
        return ['cookie' => substr($matches[1][0], 1), 'content' => $body];
    }
    return $data;
}

3. 隱藏字段提取:__VIEWSTATE 動態獲取

function getViewState($url, $cookie = '') {
    $html = curl_request($url, '', $cookie);
    preg_match('//i', $html, $m);
    return $m[1] ?? '';
}

4. 登錄流程整合

function login($username, $password) {
    $url = '教務系統登錄地址';
    $post = [
        '__VIEWSTATE' => getViewState($url),
        'txtUserName' => $username,
        'TextBox2' => $password,
        'txtSecretCode' => '', // 利用漏洞留空
        'RadioButtonList1' => iconv('utf-8', 'gb2312', '學生'),
        'Button1' => iconv('utf-8', 'gb2312', '登錄'),
    ];
    $result = curl_request($url, $post, '', 1);
    return $result['cookie']; // 返回帶有 Session 的 Cookie
}

功能模塊實現

課表查詢 → 結構化二維數組輸出

  1. 攜帶 Cookie 訪問課表頁 xskbcx.aspx
  2. 正則提取 #Table1 表格內容
  3. 解析 <td> 單元格,提取課程信息(含 {周一 1,2} 格式定位)
  4. 轉換為 [周一 => [1,2 => '課程名', ...], ...] 結構化數組
  5. 編碼轉換:GB2312 → UTF-8

空教室查詢 → 表格數據直出

  1. GET 進入查詢頁 xxjsjy.aspx 獲取新 __VIEWSTATE
  2. POST 提交查詢參數:學年、學期、星期、開始節次、結束節次、校區等
  3. 解析返回表格,配合模板渲染展示

關鍵技術總結

  • 編碼處理:教務系統多為 GB2312,請求發送需 iconv('utf-8','gb2312',...),響應解析需反向轉換
  • Cookie 維持:全流程攜帶登錄返回的 Cookie,保持 Session 狀態
  • 抓包調試:Firefox Firebug/Network 面板分析實際提交的所有表單字段,逐一補全
  • 異常處理:驗證密碼錯誤、教務系統維護、頁面結構變更均需捕獲並友好提示

遷移建議

不同學校教務系統頁面結構、字段名稱均有差異。核心思路不變:抓包分析 → 補全字段 → 編碼轉換 → 正則解析 → 結構化輸出。遇到問題可郵件交流:imzhongshan@126.com

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