CC NU搶課指令碼

2021-08-14 11:34:23 字數 2733 閱讀 4161

本文章僅對 web 開發,python 開發進行**,進行實驗時請遵守學校的規章制度。

任務自動化本來就是程式設計師的一大樂趣,無關價值觀。

很多人有誤區,以為搶課指令碼就是像遊戲外掛程式一樣,利用什麼教務處系統漏洞去搞到課,而事實上搶課指令碼只是模擬瀏覽器和伺服器進行互動而已。而它們之間互動的方式是使用 http 協議,換言之你的程式只要通過 http 協議與伺服器進行互動,就可以模擬瀏覽器能完成的事情。

當然,最樸素的搶課指令碼應當數按鍵精靈。但是按鍵精靈依賴於瀏覽器的渲染速度,而使用 http 協議互動的指令碼可以忽略一切 css js 檔案的解析,直接發請求,資源占用和速度都優化了乙個量級。

簡而言之,由於 http 是無狀態協議,所以每次提交請求,伺服器無法判斷你是否是之前的使用者,因此在動態網頁中常用 cookies 來鑑別使用者身份,cookies 是附加在每次 http 請求中用來識別使用者身份的資料。

在 python 中,直接使用 urllib2 預設的 urlopen 是不能處理好 cookies 的,這裡的 urlopen 可以看成是乙個能向目標 url 發請求的物件。所以我們使用 cookielib 來構造乙個能處理 cookies 的 opener。

以後,我們使用 opener.open(url) 就可以帶 cookies 去發 get 請求了。

首先用 chrome 分析一下教務系統的邏輯是怎樣的,開啟 inspect 然後開啟教務處**

可以看出,前端一點都不簡潔,估計編寫**的人技術不是很高,從檔名可以簡單地看出 cas.js 應該是雜湊函式,應該是處理密碼用的。

然後我們手動登入一下,看看登入的請求是怎樣的。

可以看出傳送了乙個 post 請求,請求位址是 表單內容有 username、password、j_code 和一堆不知道含義的東西。顯然 username 是學號了,password 有經驗的可以看出來是的 md5 雜湊之後的結果,j_code 是驗證碼結果。

直接對應填上即可。

post_data = {}

post_data['username'] = username

post_data['password'] = pasw_cas

post_data['lt'] = ''

post_data['_eventid'] = 'submit'

post_data['submit'] = '登入'

post_data = urllib.urlencode(post_data)

opener.open(login_url, post_data)

既然知道了和 cas 有關係,可以用 python 的 cas 模組進行嘗試。

pasw_cas = cas.new()

pasw_cas.update(password)

pasw_cas = pasw_cas.hexdigest().upper()

一測試發現,提交的就是密碼的 cas 雜湊,問題就輕易解決了。當然如果不對,一般來說可以嘗試使用者名稱+密碼的組合,還有是加上時間戳的組合,最後不行就去逆向 js 檔案吧。

相信到這裡很多人已經摸到套路了,無非就是抓乙個請求,分析,然後偽造這個請求。

這裡發現選課只需要發乙個 post 請求到 當然也有帶上 sid,此外還有乙個引數,想必就是課程編號了。

和登入一樣,我們構造乙個字典,然後用 urllib 中的 urlencode 功能進行編碼,最後使用 opener.open(res, elect_post_data) 傳送請求即可。

elect_post_data = {};

elect_post_data['sid'] = sid

res = urllib2.request(elect_url)

opener.open(res, elect_post_data)

如果再套上乙個死迴圈,這個搶課指令碼就寫完了。當然,肯定是有很多問題的,我們慢慢來解決

如果直接死迴圈而不加上延時,伺服器多半會掛掉。因為客戶端的乙個請求對應伺服器的一次資料庫查詢,多半這樣的壓力學校伺服器是受不了的。而且過高的發包很容易被查水表,一般來說 0.5s 到 0.3s 的延時已經足夠超越極大部分單身二十年少年的手速。

一般的 web 都是會對 http 的請求頭進行檢測,以防止一些最簡單的爬蟲,很幸運的是,教務系統並沒有。但是一旦對方的 web server 開啟了訪問記錄,很容易把這些 http 請求頭為空的請求篩選出來,然後慢慢查水表之類的,所以為了安全起見,我們需要偽造瀏覽器的請求頭。

上面的**我們只處理了傳送請求,而並沒有理會響應,這樣即使搶到了課,程式還是會繼續執行下去。

caoruiy

搶課啦 (排序)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 沒有選上課的孩子,或者還有?救救孩子 又又又到了選修課搶課的時間了 集訓隊成員全心備戰亞洲區域賽,居然忘記了選課.緩過神來的集訓隊成員現在很想知道,每門課人數從小到大的...

華農js搶課神器

又到了華農選課的時候,伺服器估計就受不了,每天奔潰幾次,這次選課貪心了點,竟然選了5門,好吧,我承認我只中了1門,什麼?剛剛換課給同學馬上就被人搶了?我來告訴你原因吧,最近發現一位大神寫了乙份js指令碼,用來插入瀏覽器來刷選修課,可惜啊,沒怎麼學好js,不過還是挺有興趣以後研究下,以後也弄個來造福師...

關於12306搶票指令碼記錄

1.首先從如何查票開始做 qeury ticket.py獲取車次在程式中的簡寫 station.py 查詢車票 station.py coding utf 8 該檔案主要是獲取車站的資訊 import re,requests from requests.packages.urllib3.except...