要说这个抢课脚本,我们就得先说一下平时是怎么选课的。
先登录选课系统,然后点击选课。由于当前不再选课时间内,无法直观地看到选课过程。
那么我们就换一个例子说明,就拿我们用的很多的百度搜索来说。
当我们点击了一下“百度一下”究竟发生了什么?
假设我们输入 "python"
点击“百度一下”
浏览器将我们要查询的数据发送到百度服务器上对应的接口
服务器把数据返回给浏览器,浏览器再把数据展示出来
选课亦是如此,我们在浏览器中将我们想要选的课程点击好,然后浏览器帮我们把数据发送到学校的服务器上,在服务器上执行选课命令,最后服务器返回给我们选课成功或者不成功的数据,浏览器把这个数据展示给我们看。
解释到这里,事情就比较清楚了,浏览器就相当于一个中间人。
我跟浏览器说“我要选英语课”,浏览器就跑到服务器那跟服务器说"222***要选英语课",服务器就告诉浏览器:“选课成功或者选课失败”,最后浏览器就告诉我们选课是否成功。
那么我们是否可以跳过浏览器,直接跟服务器进行通信呢?答案是可以的。
这个服务器有很多的门,每个门又有不同的密码,我们都过这些们进行我们想要进行的操作或者得到我们想要的数据。
我们第一步就需要知道服务器的门在哪?需要什么要的密码?这里的门就是“服务器的服务接口”,密码就是需要传送的“数据”。
我们可以打开浏览器,登入研究生管理系统,由于选课的时间已过,我们拿查询已选课程作为例子。
按F12打开开发者控制台
选择网络,找到方法是POST的一条记录。
看这个请求的标头url(http://grdms.bit.edu.cn/yjs/dwr/call/plaincall/YyPyXkRemoteController.stdSelectedCourseResult.dwr)stdSelectedCourseResult,可以看到是学生已选课程结果。这个Url就是我们所谓的门。那么我们想要的密码呢。
我们再看这个请求的正文。
我们先来看响应正文,
这是我们的所选课程结果。
接下来看请求正文,
%E7%AC%AC%E4%BA%8C%E5%AD%A6%E6%9C%9F:第二学期
好了,门和密码我们都知道了,接下来就需要大声喊出芝麻开门了。
coding:utf-8
importrequests
importtimeurl='http://grdms.bit.edu.cn/yjs/dwr/call/plaincall/YyPyXkRemoteController.stdSelectedCourseResult.dwr'header={'User-Agent':'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)'}
cookie={"Cookie":'JSESSIONID=yjs1app1~1EA8E1EF6A745A8F7588BF4BB368E079; SECURITY_AUTHENTICATION_COOKIE=2474352360e8f3fecbde6d19657e64ebe8fb15ac51091222770f80be52083eb2670da5c035c4534e; SECURE_AUTH_ROOT_COOKIE=2474352360e8f3fecbde6d19657e64ebe8fb15ac51091222770f80be52083eb2670da5c035c4534e'}
httpSessionId="yjs1app1~1EA8E1EF6A745A8F7588BF4BB368E079"
scriptSessionId="5A2C5A0CB9E88FADA297F6973312770A254"
student_id="string:[此处填学号]"
params={'callCount':'1',
'page':'/yjs/yanyuan/py/pyjxjh.do?method=stdCourseList',
'httpSessionId':httpSessionId,
'scriptSessionId':scriptSessionId,
'c0-scriptName':'YyPyXkRemoteController',
'c0-methodName':'stdSelectedCourseResult',
'c0-id':'0',
'c0-param0':"string:2017",
'c0-param1':'string:%E7%AC%AC%E4%BA%8C%E5%AD%A6%E6%9C%9F',
'batchId':'0'}
r=requests.post(url,data=params,headers=header,cookies=cookie)
s=r.text
prints
这里httpSessionId,scriptSessionId,cookie,
需要填写自己的值,直接F12,从控制台复制过来即可。
运行结果:
#coding:utf-8importrequestsimporttimeurl='http://grdms.bit.edu.cn/yjs/dwr/call/plaincall/YYPYCommonDWRController.pyJxjhSelectCourse.dwr'
header={'User-Agent':'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; Tablet PC 2.0; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)'}
cookie={"Cookie":'JSESSIONID=yjs1app1~1EA8E1EF6A745A8F7588BF4BB368E079; SECURITY_AUTHENTICATION_COOKIE=2474352360e8f3fecbde6d19657e64ebe8fb15ac51091222770f80be52083eb2670da5c035c4534e; SECURE_AUTH_ROOT_COOKIE=2474352360e8f3fecbde6d19657e64ebe8fb15ac51091222770f80be52083eb2670da5c035c4534e'}
httpSessionId="yjs1app1~1EA8E1EF6A745A8F7588BF4BB368E079"
scriptSessionId="5A2C5A0CB9E88FADA297F6973312770A254"
student_id="string:[你的学号]"
#矩阵分析2
data1={'callCount':'1',
'page':'/yjs/yanyuan/py/pyjxjh.do?method=stdSelectCourseEntry',
'httpSessionId':httpSessionId,
'scriptSessionId':scriptSessionId,
'c0-scriptName':'YYPYCommonDWRController',
'c0-methodName':'pyJxjhSelectCourse',
'c0-id':'0',
'c0-e1':student_id,
'c0-e2':'string:1',
'c0-e3':'string:YY000000000000000000000000485639',
'c0-e4':'string:YY000000000000000000000000485639',
'c0-e5':'string:%E7%A1%95%E5%A3%AB',
'c0-e6':'string:%E7%BB%9F%E6%8B%9B%E7%BB%9F%E5%88%86%E7%A0%94%E7%A9%B6%E7%94%9F',
'c0-e7':'string:2017',
'c0-e8':'string:',
'c0-e9':'string:',
'c0-param0':'Object_Object:',
'c0-e10':'string:YY000000000000000000000000485639',
'c0-e11':'string:2220170598',
'c0-e12':'string:1',
'c0-e13':'string:2017',
'c0-e14':'string:%E7%AC%AC%E4%BA%8C%E5%AD%A6%E6%9C%9F',
'c0-e15':'string:4028480060e8a6d0016103c238963d8c',
'c0-e16':'string:1700002',
'c0-e17':'string:%E6%95%B0%E5%80%BC%E5%88%86%E6%9E%90',
'c0-e18':'string:',
'c0-e19':'string:%E4%B8%93%E4%B8%9A%E5%BF%85%E4%BF%AE%E8%AF%BE',
'c0-e20':'string:%E4%B8%93%E4%B8%9A%E5%BF%85%E4%BF%AE%E8%AF%BE',
'c0-e21':'string:32',
'c0-e22':'string:2',
'c0-e23':'string:',
'c0-param1':'Object_Object:',
'batchId':'6'}
#矩阵分析3 魏丰
data2={'callCount':'1',
'page':'/yjs/yanyuan/py/pyjxjh.do?method=stdSelectCourseEntry',
'httpSessionId':httpSessionId,
'scriptSessionId':scriptSessionId,
'c0-scriptName':'YYPYCommonDWRController',
'c0-methodName':'pyJxjhSelectCourse',
'c0-id':'0',
'c0-e1':student_id,
'c0-e2':'string:1',
'c0-e3':'string:YY000000000000000000000000485639',
'c0-e4':'string:YY000000000000000000000000485639',
'c0-e5':'string:%E7%A1%95%E5%A3%AB',
'c0-e6':'string:%E7%BB%9F%E6%8B%9B%E7%BB%9F%E5%88%86%E7%A0%94%E7%A9%B6%E7%94%9F',
'c0-e7':'string:2017',
'c0-e8':'string:',
'c0-e9':'string:',
'c0-param0':'Object_Object:',
'c0-e10':'string:YY000000000000000000000000485639',
'c0-e11':student_id,
'c0-e12':'string:1',
'c0-e13':'string:2017',
'c0-e14':'string:%E7%AC%AC%E4%BA%8C%E5%AD%A6%E6%9C%9F',
'c0-e15':'string:402848c060e89db901610873a5dc4fb8',
'c0-e16':'string:1700002',
'c0-e17':'string:%E6%95%B0%E5%80%BC%E5%88%86%E6%9E%90',
'c0-e18':'string:',
'c0-e19':'string:%E4%B8%93%E4%B8%9A%E5%BF%85%E4%BF%AE%E8%AF%BE',
'c0-e20':'string:%E4%B8%93%E4%B8%9A%E5%BF%85%E4%BF%AE%E8%AF%BE',
'c0-e21':'string:32',
'c0-e22':'string:2',
'c0-e23':'string:',
'c0-param1':'Object_Object:',
'batchId':'6'}
i=
whileTrue:data1['batchId']=i r=requests.post(url,data=data1,headers=header,cookies=cookie)s=r.text
prints
if'success'ins:breaktime.sleep(1)i=i+1data2['batchId']=i r=requests.post(url,data=data2,headers=header,cookies=cookie)s=r.text
prints
if'success'ins:breaktime.sleep(1)i=i+1i=i%100
其中:
'c0-e16':'string:1700002',
这两个参数一个为:teachclassID,另一个为课程代码,我们需要知道这两个值。在某理的选课系统中还是有方法可以提前知道这两个值的。
领取专属 10元无门槛券
私享最新 技术干货