Closed RexYuan closed 8 years ago
考慮到 session 機制,嘗試研究識別用戶的 session id,並在 Chrome 中發現 cos2.ntnu.edu.tw 中有一個 cookie 名為 JSESSIONID,不過注意到該 cookie 的 expire 時間在 When the browsing session ends,path 在多次嘗試時不一定,也開了 HttpOnly。目前仍無法在任何地方重現直接以 browser 進行 request 的回傳,不管是利用 php curl 或是其他的程式。
此問題理論上可用cURL進行模擬解決,瓶頸在於伺服器有Captcha機制,目前未知是否有方法可識別或繞過
@RexYuan 發現,可以由無障礙輸入輔助功能獲得驗證碼的純文字形式, 分析後發現,向http://cos1.ntnu.edu.tw/AasEnrollStudent/ImageBoxFromIndexCtrl 送出請求,即可獲得包含驗證碼之JSON資料。 範例如下:
{success:true,msg:"rqku"}
師大的Captcha根本形同虛設Orz
太 hack 啦XDDDD
一路試到天亮算是成功了,先貼code去睡覺, https://gist.github.com/jaidTw/0f65496b054f35ccf12f 明天醒來再整理和補充…
觀察來自選課系統資料,並使用來自選課系統資料節錄和來自開課系統節錄,可以發現,關於人數有以下幾點
選課系統顯示名稱 | 名稱 | 使否會變動 | 可能為開課系統資料重複 | (cond.)Courses 名稱 |
---|---|---|---|---|
限修人數 | limitCountH | :heavy_multiplication_x: | limit_count_h | TotalMaxSize |
授權碼人數 | authorizeP | :heavy_multiplication_x: | authorize_p | AuthMaxSize |
保留新生人數 | v_reserve_count | :heavy_multiplication_x: | :heavy_multiplication_x: | 無儲存 |
選課人數 | v_stfseld | :heavy_check_mark: | counter_exceptAuth | CourseSize |
已分發人數 | v_stfseld_deal | :heavy_check_mark: | counter | 無儲存 |
未分發人數 | v_stfseld_undeal | :heavy_check_mark: | authorize_using | AuthUsed |
授權碼選課人數 | v_stfseld_auth | :heavy_check_mark: | :question: | 無儲存 |
交換生選課人數 | v_stfseld_exchange | :heavy_check_mark: | :question: | 無儲存 |
不佔名額生人數 | v_stfseld_unfull | :heavy_check_mark: | :question: | 無儲存 |
目前計劃將會變動的資料(:heavy_check_mark: )在 temporal_scraper.php 更新,不會變動的資料(:heavy_multiplication_x:)在 semestral_scraper.php 更新。
對原先 Courses 的更新:
欄位 | 動作 |
---|---|
CourseSize | 遷移至 Enrolled |
AuthUsed | 遷移至 Unassigned |
FreshReserve | 至選課系統刮 v_reserve_count |
Distributed | 刪除 |
新增一個 TABLE CoursesStates:
欄位 | 原資料名稱 | 型別 | 意義 | 範例 | 備註 |
---|---|---|---|---|---|
CourseStateId | N/A | u_INT AUTO_INCREMENT PRIMARY KEY | 識別碼 | 1,32,6334 | Courses(CourseStateId) 映射至此 |
Enrolled | v_stfseld | u_INT | 選課人數 | 123,122,100 | |
Assigned | v_stfseld_deal | u_INT | 已分發人數 | 115,41,59 | |
Unassigned | v_stfseld_undeal | u_INT | 未分發人數 | 196,82,82 | |
AuthAssigned | v_stfseld_auth | u_INT | 授權碼選課人數 | 0 | 目前尚未到加退選時間,無法確定 |
ExAssigned | v_stfseld_exchange | u_INT | 交換生選課人數 | 0 | 無法確定 |
PtAssigned | v_stfseld_unfull | u_INT | 不佔名額生人數 | 0 | 無法確定 |
我不知道怎麼辦 所以我就最後還是給他存 Courses 了 ... 在 ad89af30ce9d72e4d78f0aa4fe9935d84665e4cc,已經有一個可以搭配新版 Schema(尚未更新至 Wiki)的 scraper 了。打算確定完成後才會更新
為了能夠順利刮到人數相關資料,如:限修人數、授權碼人數、保留新生人數、選課人數、已分發人數、未分發人數、授權碼選課人數、交換生選課人數、不佔名額生人數,不能再以開課查詢系統搜索,必須以選課系統才能得到所有資訊,而同時這也代表即時更新人數的可能性。參考以下範例:
TIME: 2015/8/21(Fri.) 1:54 P.M. 查詢資工系本學期開課,辨識出選課系統資料來源為
經分析解讀後,可以看到以上皆帶來非常多有趣的暗示,包含學習選課模擬的方法,而其回傳值也非常易解讀,其中一門資訊安全的課程節錄如下:
其中許多資料在開課系統之中就以能夠取得,不過依然能夠從中發現到我們感興趣的人數部分,甚至其他意義不明的,以下為這些變數列表和部分意義臆測:
問題是 ...
不過,經嘗試後很快地發現,選課系統有某種拒絕未登入 client 直接對其作 query 的機制。如果以 Chrome 無痕式頁面嘗試,馬上發現到選課系統會回傳「錯誤訊息 不合法執行選課系統」,@jaidTw 提到這是因為其的 session 設計。必須解決該問題所有上述提到的可能才能實現。