苏大Mooc系统的刷课脚本的制作(3/3)

最后决定用最简单的python脚本进行实现。具体过程部分析了,不过值得一提的是,在登陆获取用户的cookie的时候,他也发送了一个挺长的“随机”串,研究了半天才发现他是使用了md5摘要算法,将密码和密码的摘要一同发给了服务器。。。。。。

以下是源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#cheat.py

import urllib,urllib2,cookielib,md5,re,json,sys

def login(name,pwd):
url_login="http://ids1.suda.edu.cn/amserver/UI/Login?goto=http://myauth.suda.edu.cn/default.aspx?app=kczx"
m=md5.new()
m.update(pwd)
pwd_md5=m.hexdigest()
cj=cookielib.CookieJar()
post_data=urllib.urlencode({
'IDButton':'Submit',
'encoded':'false',
'goto':'',
'gx_charset':'UTF-8',
'IDToken0':'',
'IDToken1':name,
'IDToken9':pwd,
'IDToken2':pwd_md5,
})
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders=[('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36))')]
urllib2.install_opener(opener)
req=urllib2.Request(url_login,post_data)
urllib2.urlopen(req)
return opener

def watch(PlainId,fPartName,fPartId,fSecond,fVideoSecond,fVideoFileId,opener):
if fVideoFileId==u'0':
return
url='http://kczx.suda.edu.cn/G2S/Learning/StudentLearning.ashx?action=GetG2SSetStageLearnPartStudent&fPlanID='+PlainId+'&fPartID='+fPartId+'&fSecond='+fVideoSecond
urllib2.install_opener(opener)
urllib2.urlopen(url)
print fPartName+'has been watched'
return

if __name__=='__main__':
#url_lecture='http://kczx.suda.edu.cn/G2S/Learning/Learning.htm?Part=&Plan=34&type=2'
if len(sys.argv)!=4:
print 'Please enter <number> <pwd> <url>'
sys.exit();
name=sys.argv[1]
pwd=sys.argv[2]
url_lecture=sys.argv[3]
opener=login(name,pwd)
urllib2.install_opener(opener)
PlainId=re.findall(r'(?<=Plan=).*?(?=&)',url_lecture)[0]
url_ajax='http://kczx.suda.edu.cn/G2S/Learning/StudentLearning.ashx?action=GetG2SStageLearnGetChapter&fPlanID='+PlainId
ajax_text=urllib2.urlopen(url_ajax).read()
ajax_text=ajax_text.replace('RowCount','"RowCount"')
ajax_text=ajax_text.replace('Rows','"Rows"')
s=json.loads(ajax_text)
fPartName=[]
fPartId=[]
fSecond=[]
fVideoFileId=[]
fVideoSecond=[]
for k in s['Rows']:
fPartName.append(k['fPartName'])
fPartId.append(k['fPartID'])
fSecond.append(k['fSecond'])
fVideoSecond.append(k['fvideoSecond'])
fVideoFileId.append(k['fVideoFileID'])
for k in range(len(fPartName)):
watch(PlainId,fPartName[k],fPartId[k],fSecond[k],fVideoSecond[k],fVideoFileId[k],opener)

当然,为了省事,没有任何的容错处理和用户界面。。。使用时,输入:

1
myths@myths-X450LD:~$ python cheat.py <学号> <密码> <课程网址>

而且在Linux下,课程网址中的“&”符号需要转义为”&“才能用。。。。。。

基本就是这些了,按理说如果管理员有心,是可以查出我们提交的数据其实是有问题的,不过目测应该是没人看的吧~~~