python实现复旦大学选课系统自动抢课神器抢课软件Courcegoblin抢课软件ver 1.0
朋友最近遇上選課困難,手速慢,總是搶不到心儀的課程,我目前正好找不到爬蟲項目練手,于是寫了個面向復旦選課系統的搶課小軟件幫助朋友搶課
首先需要這些模塊:
import requests import re import time import schedule第一步需要做的是通過身份認證并爬取csrf-token,在選課網站登陸后復制cookies到代碼中,這是服務器識別你身份的方式,接著網站會通過生成csrf-token并將其包含在選課請求中來進一步保護信息安全;csrf-token這是網站的一道保護措施,網站根據你提交的cookie信息生成一段隨機的csrf-token碼,你需要將其爬取并應用到后續的請求中。
class csrfscrapy():def csrf_req(self):cookies = {'_WEU': '********','route': '***********','JSESSIONID': '***********','XK_TOKEN': '****************',}#cookie需替換,根據自己登陸后找到的cookie進行替換headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,en-GB;q=0.6','Cache-Control': 'max-age=0','Connection': 'keep-alive','Referer': 'http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/*default/index.do','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46',}res = requests.get('http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkHome/gotoChooseCourse.do',cookies=cookies,headers=headers,verify=False,)return resdef pares_csrf(self, res):csrf=re.findall('csrfToken\W+value=\W+([a-z0-9]+)\W', res.text)csrfstr=csrf[0]print(csrfstr)return csrfstr#從html中找到csrftokendef run(self):responce=self.csrf_req()csrfstr=str(self.pares_csrf(responce))return csrfstr之后要解決的就是提交選課請求,注意在request.post中有個參數param(dict類型),這是時間13位時間戳,需要整合到url里一起提交;另外一個參數是data(dict類型),里面包含csrf-token和選課信息bjdm,lx,bqmc和身份認證csrfToken。其中bjdm是課程代碼,lx是課程類型(數字,專業外語對應7,其他選修課10,公共選修課9),bqmc是課程所在的分類(如專業外語,其他選修課,公共選修課等),lx和bqmc鑰匙可以通過自己要選的課程所在的門類進行填寫,比如要選的xxx課程在公共選修課,那么'lx': '9', 'bqmc': '公共選修課’。bjdm鑰匙需要在瀏覽器開發者模式中尋找對應的代碼,后續詳細說明。csrfToken鑰匙則是上個部分爬取的結果。
class courceburglar():def __init__(self, csrf):self.csrf=csrfdef get_millisecond():millis = int(round(time.time() * 1000))return millisdef cource_req(self):cookies = {'_WEU': '********','route': '***********','JSESSIONID': '***********','XK_TOKEN': '****************',}#cookie需替換,根據自己登陸后找到的cookie進行替換headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,en-GB;q=0.6','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Origin': 'http://yjsxk.fudan.sh.cn','Referer': 'http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkHome/gotoChooseCourse.do','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46','X-Requested-With': 'XMLHttpRequest',}timestramp = courceburglar.get_millisecond()print(timestramp)params = {'_': timestramp,}data = {'bjdm': '************','lx': '7','bqmc': '專業外語','csrfToken': self.csrf,}response = requests.post('http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkCourse/choiceCourse.do',params=params,cookies=cookies,headers=headers,data=data,verify=False,)print(response.status_code)def run(self):responce=self.cource_req()如何尋找cookie:首先登陸自己選課賬號,進入選課界面,f12打開開發者界面中的網絡(或者network)選項卡,刷新你的瀏覽器,在你的開發者界面會有如下的狀態,打開任意一個形如r'\w+do\?_=\d+'命名的文件的請求頭(或者headers)選項卡,在request headers中包含了cookie信息,稍微加工改成dict類型,替換掉兩部分代碼中cookies部分.
如何尋找課程代碼:清空你的開發者界面,將你的選課類別調整到你需要選的類型中,比如你要選公共選修課的課程,你將瀏覽器中的選項點擊到公共選修課,與此同時,在開發者界面會出現響應的文件,打開形如'loadxxxxxcourceinfo.do?_=xxxxxx'文件,打開preview的選項卡,在眾多檢索出的課程中找到你要的課程的BJDM,并替換掉data參數里面的bjdm。
代碼最后就是時間部分:通過schedule模塊控制選課請求發送時間。選課系統一般是下午一點開放。
if __name__=='__main__':def job(cs):crsreq = courceburglar(cs)crsreq.run()csrf=csrfscrapy()csrftoken=csrf.run()#schedule.every(5).to(10).minutes.do(job, csrftoken) #5-10分鐘隨機做一次schedule.every().day.at("13:00").do(job, csrftoken)while True:schedule.run_pending()time.sleep(1)具體參考這位大佬的內容:(10條消息) Python3學習(八):使用schedule模塊定時執行任務_豬笨是念來過倒的博客-CSDN博客_schedule.run_pending()
整合起來全代碼如下:
import requests import re import time import scheduleclass csrfscrapy():def csrf_req(self):cookies = {'_WEU': '********','route': '***********','JSESSIONID': '***********','XK_TOKEN': '****************',}#cookie需替換,根據自己登陸后找到的cookie進行替換headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,en-GB;q=0.6','Cache-Control': 'max-age=0','Connection': 'keep-alive','Referer': 'http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/*default/index.do','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46',}res = requests.get('http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkHome/gotoChooseCourse.do',cookies=cookies,headers=headers,verify=False,)return resdef pares_csrf(self, res):csrf=re.findall('csrfToken\W+value=\W+([a-z0-9]+)\W', res.text)csrfstr=csrf[0]print(csrfstr)return csrfstr#從html中找到csrftokendef run(self):responce=self.csrf_req()csrfstr=str(self.pares_csrf(responce))return csrfstrclass courceburglar():def __init__(self, csrf):self.csrf=csrfdef get_millisecond():millis = int(round(time.time() * 1000))return millisdef cource_req(self):cookies = {'_WEU': '********','route': '***********','JSESSIONID': '***********','XK_TOKEN': '****************',}#cookie需替換,根據自己登陸后找到的cookie進行替換headers = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,en-GB;q=0.6','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Origin': 'http://yjsxk.fudan.sh.cn','Referer': 'http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkHome/gotoChooseCourse.do','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46','X-Requested-With': 'XMLHttpRequest',}timestramp = courceburglar.get_millisecond()print(timestramp)params = {'_': timestramp,}data = {'bjdm': '************','lx': '7','bqmc': '專業外語','csrfToken': self.csrf,}response = requests.post('http://yjsxk.fudan.sh.cn/yjsxkapp/sys/xsxkappfudan/xsxkCourse/choiceCourse.do',params=params,cookies=cookies,headers=headers,data=data,verify=False,)print(response.status_code)def run(self):responce=self.cource_req()if __name__=='__main__':def job(cs):crsreq = courceburglar(cs)crsreq.run()csrf=csrfscrapy()csrftoken=csrf.run()#schedule.every(5).to(10).minutes.do(job, csrftoken) #5-10分鐘隨機做一次schedule.every().day.at("13:00").do(job, csrftoken)while True:schedule.run_pending()time.sleep(1)后續改進可以寫一個可以自動生成需要的選課信息并將信息放進隊列的模塊,以及多線程同時發送選課請求的模塊。
總結
以上是生活随笔為你收集整理的python实现复旦大学选课系统自动抢课神器抢课软件Courcegoblin抢课软件ver 1.0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 群晖传文件到服务器,文件上传到群晖服务器
- 下一篇: 利用Python做假设检验、参数估计、方