模拟登陆教务处获取成绩

1 # -*- coding: utf-8 -*-

2 import re

3 import xlrd

4 change_sum=0 #用以存储密码修改的人数

5 grade_course=['*************'] 用以存储计算均分的科目

6 class course():

7 '''the class of course'''

8 def __init__(self,L):

9 self.name=L[2] #学科名称

10 self.credit=L[3] #学科学分

11 self.grade=L[8] #学科分数

12 self.rank=L[9] #学科排名

13 class person():

14 '''the class of person'''

15 def __init__(self,name,S):

16 self.name= name

17 self.courses= S

18 Grade= 0

19 Credit= 0

20 for key,value in S.items():

21 global grade_course

22 if key in grade_course:

23 try:

24 t= float(value.grade)

25 Credit += float(value.credit)

26 Grade +=t*float(value.credit)

27 except:

28 pass

29 self.average=Grade/Credit #均分

30 def save(Path,Data):

31 '''save Data in Path'''

32 file_obj=open(Path,'a')

33 try:

34 file_obj.write(Data)

35 finally:

36 file_obj.close()

37 def gettext(username,password):

38 '''input username & password, return marks text'''

39 import requests

40

41 def getlt(data):

42 '''获取学校教务处hidden的参数lt'''

43 cer=re.findall('(?<=name="lt" value=").+?(?=")',data)

44 return cer[0]

45 def getexecution(data):

46 '''获取学校教务处hidden的参数execution'''

47 cer=re.findall('(?<=name="execution" value=").+?(?=")', data)

48 return cer[0]

49

50 header={ #伪装浏览器

51 'Connection' : 'Keep-Alive',

52 'Accept-Language' : 'zh-CN',

53 'Accept' : 'image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*',

54 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; InfoPath.2; Tablet PC 2.0; GWX:DOWNLOADED; GWX:RESERVED; GWX:QUALIFIED; SMJB)',

55 'Accept-Encoding' : 'gzip, deflate',

56 'Host' : '*********',

57 'DNT': '1'

58 }

59

60 url='**********' #学校教务处网址

61 s=requests.session() #保存cookies

62 r=s.get(url,headers=header)

63

64 lt= getlt(r.text)

65 execution= getexecution(r.text)

66 payload={ #构造请求头

67 'username' : username,

68 'password': password,

69 'submit' : '',

70 'lt' : lt,

71 'execution' : execution,

72 '_eventId' : 'submit',

73 'rmShown' : '1'

74 }

75

76 login=s.post(url,data=payload,headers=header)

77

78 if login.status_code==200:

79 print('%s login success!'%name)

80 temp=s.get('**************',headers=header)

81 preurl='**************'

82 dox='************' #存放成绩的地址

83 newurl=preurl + dox

84 temp=s.get(newurl,headers=header)

85 return temp.text

86 else:

87 print('%s login failed, login.status_code:'%name+login.status_code)

88 return ''

89 def textanal(name,text):

90 '''analysis the text of name, and save its grades'''

91 if text :

92 prepath='***********' #保存个人成绩的地址

93 path=prepath + name +'.txt'

94

95 #从网页中获取成绩

96 marks=text.split('''''')

97 courses= {}

98 n= 0

99 for cours in marks:

100 if n > 0 :

101 L=re.findall('(?<=\s)[^]*?(?=\s)',cours)

102 if len(L) >=10 :

103 while len(L) > 10 :

104 del L[3]

105 key=L[2]

106 value= course(L)

107 save(path,' '.join(L)+'\n')

108 courses[key]= value

109 elif len(L) !=10 :

110 print('Error : wrong course')

111 n +=1

112 if courses :

113 one= person(name,courses)

114 path=prepath + 'allmarks.txt'

115 save(path,name+' '+str(one.average)+'\n') #记录此人均分

116 else :

117 global change_sum

118 change_sum +=1

119 print('%s password changed or exist verification code!'%name)

120

121 #读取每个人的username和password

122 book=xlrd.open_workbook('************')

123 sheet= book.sheet_by_index(0)

124 nrows= sheet.nrows

125 for x in range(nrows):

126 row= sheet.row_values(x)

127 name=row[5]

128 username=row[2]

129 password=row[15][-6:]

130 text= gettext(username,password)

131 textanal(name,text)

132 print(change_sum) #输出修改密码的人的个数