大學搶課插件如何實現搶課的?

每年選課的時候都要等好久,我想做個搶課插件,我們學校用的是方正教務系統,希望大家給點建議


謝萌妹子邀

你這個問題有兩個方面

第一個是怎麼開開選課那網頁【也就是連接伺服器】

第二個是怎麼讓伺服器知道你選了這課

好吧這就是HTTP協議的問題了

氖可以先去看一下餵雞百科 HTTP1.1協議

當然你要像樓上這樣真的讓電腦渲染一個網頁然後再提交這麼麻煩也不是不可以……但是比較消耗資源對吧

這時候我們只需要假裝是個人看到這個網頁做出反應讓伺服器知道就好了= ̄ω ̄=【這就是驗證碼的任務】

那麼呢……我們首先要知道……當我們點擊網頁時候瀏覽器做了什麼→_→

明天填坑→_→

2015.3.3 update

氖可以先去下一個fiddler→_→來研究一下

等會回宿舍我開電腦截圖= ̄ω ̄=

2015.3.8

太忙了而且病了一段時間

現在開始填大坑

首先可以看到,這是一個平淡無奇的選課系統登陸界面

然後打開fiddler,刷新一下~

得到這個

紅框部分是重點,因為其他的304回應什麼的都是gif……顯然……我看不懂嗯所以我就忽略了╮( ̄▽ ̄")╭ 接下來,我們就要看一下登陸時候發生了什麼,首先呢,我們正常地登陸一下

賬號密碼什麼的都是瞎編的╮( ̄▽ ̄")╭

然後我們看一下fiddler告訴我們發生了什麼呢~

往外post了一行

post的數據能從Fiddler裡面看到,我就複製下來了……看圖挺費勁的

POST http://222.30.32.10/stdloginAction.do HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Referer: http://222.30.32.10/
Accept-Language: zh-CN
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
Host: 222.30.32.10
Content-Length: 96
Connection: Keep-Alive
Pragma: no-cache
Cookie: JSESSIONID=8F34D3E1F3068B6D213D10523F6A2827

operation=usercode_text=123456userpwd_text=123456checkcode_text=7727submittype=%C8%B7+%C8%CF

於是呢~我們就會發現,我們在網頁上填的三個數據,用戶名,密碼,驗證碼都被post上去了

所以寫軟體的時候,我們可以這麼構造

logindata="operation=usercode_text="+ID+"userpwd_text="+passwd+"checkcode_text="+v_code+"submittype=%C8%B7+%C8%CF"

ID,passwd,vcode讓用戶輸入嘛

但是呢~只有這些還不夠~伺服器君表示你這麼登一次我怎麼知道下次這個ip發過來的還是不是你呀╮( ̄▽ ̄")╭ 所以伺服器君給了我們一個cookie,這個cookie是在第一個get登陸頁面時候就收到了的,所以寫代碼的時候請記得拿出來~

conn=httplib.HTTPConnection("222.30.32.10")
conn.request("GET","/")
res=conn.getresponse()
cookie=res.getheader("Set-Cookie")
conn.close()

於是我們有了cookie,有了用戶名,密碼,但是驗證碼總不會是每次都一樣的呀~所以還需要get一下驗證碼的圖片~

但是,伺服器君表示,我怎麼知道這個驗證碼和這個ip是什麼關係o( ̄ヘ ̄o#),於是我們要記得帶上cookie,當然,還得加上其他的請求頭,這些可以照抄的

headers= {
"Accept":" application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*",
"Referer":" http://222.30.32.10/xsxk/swichAction.do",
"Accept-Language":" zh-CN",
"Content-Type":" application/x-www-form-urlencoded",
"Accept-Encoding":" gzip, deflate",
"User-Agent":" Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)",
"Host":" 222.30.32.10",
"Pragma":" no-cache",
"Cookie":cookie
}
conn=httplib.HTTPConnection("222.30.32.10")
conn.request("GET","http://222.30.32.10/ValidateCode","",headers)
res=conn.getresponse()
f=open("ValidateCode.jpg","w+b")
f.write(res.read())
f.close()
conn.close()

於是,我們get到了驗證碼的圖片~

並且保存成了一個文件

好的,現在進入苦大仇深的GUI設計環節……氖萌可以搜一下,Tkinter有一個VB插件是可以把畫出來的界面轉換成tk代碼的……網址我等會再給你們……

順便告訴你們怎麼把照片貼進tk做的界面裡面

self.photo=PIL.Image.open("ValidateCode.jpg")
self.im = PIL.ImageTk.PhotoImage(self.photo)
self.Label6 = Label(self.top,image = self.im)
self.Label6.place(relx=0.094, rely=0.245, relwidth=0.339, relheight=0.072)

這段代碼我找了大概三個小時……

好的……現在我們能登陸了

login~

我們要的在這裡

點一下看看Fiddler告訴我們什麼~

嗯,他讓你開開就讓程序get一下吧

還要再get一次~

於是我們就看到了熟悉的選課界面~~~~

你們就別好奇我選了什麼課了2333333333

好的~讓我們來假裝正經地選一次課

Fiddler君的心靈受到了一點傷害

POST http://222.30.32.10/xsxk/swichAction.do HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Referer: http://222.30.32.10/xsxk/selectMianInitAction.do
Accept-Language: zh-CN
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
Host: 222.30.32.10
Content-Length: 97
Connection: Keep-Alive
Pragma: no-cache
Cookie: JSESSIONID=8F34D3E1F3068B6D213D10523F6A2827

operation=xuankeindex=xkxh1=0051xkxh2=0069xkxh3=0141xkxh4=0253departIncode=%25courseindex=

我覺得是個人都能看出來這裡應該怎麼做了……

循環著往伺服器post啊……寫個循環不就好了嘛╮( ̄▽ ̄")╭

postdata="operation=xuankeindex=xkxh1="+str(c1)+"xkxh2="+str(c2)+"xkxh3="+str(c3)+"xkxh4="+str(c4)+"de=%25courseindex="
conn=httplib.HTTPConnection("222.30.32.10")
conn.request("POST",UpUrl,postdata,headers)

根據廣大南開學子與選課系統鬥爭的經驗,五秒內做這種事超過兩次,伺服器君就會不理你了

所以每次都要記得休睡夠五秒哦~~

嗯……這樣子你的刷課機就具備了基本的功能

剩下的都是人機交互和客戶體驗的問題了,還有程序的魯♂棒♀性

至於某些神奇的學校【比如隔壁技校】的選課系統在選課的時候根本打不開這種事……大概什麼程序都救不了你的……除非強行多線程轟炸靠運氣填伺服器了

源代碼 NKU-SSS/NK-CourseGrabber/Source_Code at master · NKUCodingCat/NKU-SSS · GitHub

靈感來源→_→:按鍵精靈

現在搶課更新位於NKUCodingCat/NKU-SSS-in-One · GitHub,但是原來那個也行╮( ̄▽ ̄")╭

警告:由於代碼實現過程沒有考慮連接復用導致伺服器被拖垮,各位實現的時候務必使用支持自動連接復用的庫,例如Python的urllib3以及requests

以上


別的不知道,反正某濟大學一旦被查出你用機器搶課就鎖你課表。(你搶課很耗伺服器資源啊)


大部分的搶課軟體就是寫一個程序,大概就是你在進教務系統的時候做的那一套,然後重複多遍,總能卡進去。


還是沒找到的


推薦閱讀:

為什麼 Ubuntu 不捆綁 Chrome 瀏覽器?
如何在英文版 Chrome 登錄印象筆記剪藏插件?
移動端 Google Chrome 體驗好嗎?
Google Chrome 為什麼取名 Chrome?
iOS 上的 Chrome 31 是用的谷歌的 Blink 內核嗎?

TAG:GoogleChrome | 網頁瀏覽器 | 火狐瀏覽器Firefox | 大學 | 插件 |