1. 程式人生 > >選修課有很多有趣的!用Python模擬登入學校教務系統搶課!

選修課有很多有趣的!用Python模擬登入學校教務系統搶課!

最近學校開始選課,但是如果選課時間與自己的事情衝突,這時候就可以使用Python指令碼自助搶課,搶課的第一步即是模擬登入,需要模擬登入後儲存登入資訊然後再進行操作。

把css 圖片之類的過濾掉,發現了default.aspx這個東西

如果你們學校教務系統不使用Cookie則會是這樣

我們可以發現,真實的請求地址為 http://110.65.10.xxx/(bdq1aj45lpd42o55vqpfgpie)/default2.aspx

隨後我們發現這個網址括號圍起來的一串資訊有點詭異,而且每次進入的時候資訊都不一樣,經過資料查詢,這是一種http://ASP.NET不使用Cookie會話管理的技術。

伺服器會返回一個Cookie值,然後在本地儲存,這與下面的會不相同。

獲取會話資訊(不使用Cookie)

這裡我們要使用requests庫,並且要偽造header的UA資訊

而requests中使用Cookie很簡單

只需要這樣

由於我們學校採用的是無Cookie方案,所以下面的程式碼均沒有傳送Cookie,如果你的學校採用了Cookie,只需要像我上面這樣傳送Cookie就行了。

而如果你們學校使用Cookie,就不必獲取帶有會話資訊的地址了,直接儲存Cookie即可。

而如果你們學校使用Cookie,就不必獲取帶有會話資訊的地址了,直接儲存Cookie即可。

驗證碼的處理

分析r返回的文字資訊

發現驗證碼的標籤的資源地址為 src="CheckCode.aspx" ,我們可以直接requests然後下載驗證碼圖片,下載圖片的一種優雅的方式如下

發現有資訊無法被解碼,應該是gb2312編碼,檢視解碼前的編碼

然後將不能解碼的程式碼複製能夠解碼的地方

發現%D1%A7%C9%FA編碼解碼後為學生

這也就對應了學生選項的登入

學號和密碼和驗證碼能夠顯而易見地知道是哪些資訊,但是我們發現有__VIEWSTATE這一項

查詢一下,這是一個表單隱藏資訊,我們可以用BeautifulSoup庫解析可以得出該一項資料的值

這是完整的登入資料包,

登入

如果登入完成了,如何判斷是否登入成功呢?我們從登入成功返回的介面發現有姓名這一標籤,而我們等一下也是需要學生姓名,所以我們用這個根據來判斷是否登入成功。

程式碼如下,進行了驗證碼使用者名稱和密碼的提示資訊判別

獲取選課資訊

接下來就是獲取選課資訊了,這裡我們以校公選課為例子,點選進去,進行抓包,headers沒有什麼好注意的,我們只用關注get傳送的包即可

發現有學號與姓名與gnmkdm這一項,姓名我們需要編碼為gb2312的形式才能進行傳送

這裡我們注意headers需要新增Referer項也就是當前訪問的網址,才能進行請求

注意到上面有一個設定VIEWSTATE值的函式,這裡等下在選課構造資料包的時候會講

模擬選課

隨便選一門課,然後提交,抓包,看一下有什麼資料傳送

前三個值可以在原網頁中input標籤中找到,由於前兩項為空,就不獲取了,而第三項我們使用soup解析獲取即可,由於這個操作是每請求一次就變化的,我們寫成一個函式,每次請求完成就設定一次。

進行選課

選課我們只要將lesson_list傳入即可,這就是我們之前建立的Lesson類的例項的列表,'Button'的內容為' 提交 ',這兩邊各有一個空格,完事後我們可以進行傳送請求進行選課。

這裡我們用正則提取了錯誤資訊,比如選課時間未到、上課時間衝突這些錯誤資訊來提示使用者,我們還解析了網頁的已選課程,這裡也不細講了,都是基礎的網頁解析。

總結

這次我們完成了模擬正方教務系統選課的過程,由於這個教務系統技術比較陳舊,所以比較好弄,事實上搶課的時候用Fiddler即可完成操作,因為我們只需要提前登入然後記錄網址即可。

由於不同學校的正方教務系統有可能不同,所以上面很多細節都是需要修改的。

進群:125240963   即可獲取原始碼或者十套PDF書籍哦!