def _get_login_result_tip(self, html): """ 获取获取html的弹框提示信息 """ tip = get_alert_tip(html) if tip: return tip raise LoginException(self.code, '教务系统请求异常')
def _get_api(self, **kwargs): try: res = self._get(self.schedule_url, **kwargs) except TooManyRedirects: raise ScheduleException(self.code, '课表接口已关闭') except RequestException: raise ScheduleException(self.code, '获取课表请求参数失败') tip = get_alert_tip(res.text) if tip: raise ScheduleException(self.code, tip) schedule = ScheduleParse(res.text, self.time_list, self.schedule_type).get_schedule_dict() # 第一次请求的时候,教务系统默认返回当前学年学期课表 # 如果设置了学年跟学期,则获取指定学年学期的课表 if self.schedule_year and self.schedule_term and ( self.schedule_year != schedule['schedule_year'] or self.schedule_term != schedule['schedule_term']): payload = self._get_payload(res.text) try: res = self._post(self.schedule_url, data=payload, **kwargs) except RequestException: raise ScheduleException(self.code, '获取课表信息失败') schedule = ScheduleParse(res.text, self.time_list, self.schedule_type).get_schedule_dict() return schedule
def _handle_login_result(self, res): ''' 处理页面弹框信息 ''' if res is True: # 登录成功 return tip = get_alert_tip(res.text) if tip: if tip == '验证码不正确!!': raise CheckCodeException(self.code, tip) raise IdentityException(self.code, tip) raise LoginException(self.code, '教务系统请求异常')
def get_score(self, score_year=None, score_term=None, use_api=3, **kwargs): ''' 成绩信息 获取入口 :param score_year: 成绩学年 :param score_term: 成绩学期 :param use_api: 0.接口1, 1.接口2, 2.接口3 ... :param kwargs: requests模块参数 return ''' score_url = self.school_url['SCORE_URL'][use_api] + self.user.account try: view_state = self._get_view_state(score_url, **kwargs) except TooManyRedirects: msg = '可能是成绩接口地址不对,请尝试更改use_api值' raise ScoreException(self.code, msg) except RequestException: msg = '获取成绩请求参数失败' raise ScoreException(self.code, msg) payload = { '__VIEWSTATE': view_state, 'hidLanguage:': '', 'btn_zcj': '历年成绩', 'ddl_kcxz': '', 'ddlXN': '', 'ddlXQ': '' } payload1 = { '__VIEWSTATE': view_state, 'hidLanguage:': '', 'Button1': '成绩统计', 'ddl_kcxz': '', 'ddlXN': '', 'ddlXQ': '' } try: res = self._post(score_url, data=payload, **kwargs) res1 = self._post(score_url, data=payload1, **kwargs) except TooManyRedirects: raise ScoreException(self.code, '成绩接口已关闭') except RequestException: raise ScoreException(self.code, '获取成绩信息失败') html = res.content.decode('GB18030') html1 = res1.content.decode('GB18030') tip = get_alert_tip(html) if tip: raise ScoreException(self.code, tip) return ScoreParse(self.code, html, use_api, html1).get_score(score_year, score_term)
def get_student_info(self, use_api=3, **kwargs): ''' 成绩信息 获取入口 :param score_year: 成绩学年 :param score_term: 成绩学期 :param use_api: 0.接口1, 1.接口2, 3.接口3 ... :param kwargs: requests模块参数 return ''' student_info_url = self.school_url['STUDENT_INFO_URL'][ use_api] + self.user.account try: view_state = self._get_view_state(student_info_url, **kwargs) except TooManyRedirects: msg = '可能是个人信息接口地址不对,请尝试更改use_api值' raise StudentException(self.code, msg) except TooManyRedirects: raise StudentException(self.code, '成绩接口已关闭导致无法获取个人信息') except RequestException: msg = '获取个人信息请求参数失败' raise StudentException(self.code, msg) payload = { '__VIEWSTATE': view_state, 'hidLanguage:': '', 'Button1': '', 'ddl_kcxz': '', 'ddlXN': '', 'ddlXQ': '' } try: res = self._post(student_info_url, data=payload, **kwargs) except TooManyRedirects: raise ScoreException(self.code, '个人信息接口已关闭') except RequestException: raise ScoreException(self.code, '获取个人信息失败') html = res.content.decode('GB18030') tip = get_alert_tip(html) if tip: raise StudentException(self.code, tip) return StudentInfoParse(self.code, html, use_api).get_student_info()
def get_score(self, score_year=None, score_term=None, use_api=0, **kwargs): ''' 成绩信息 获取入口 :param score_year: 成绩学年 :param score_term: 成绩学期 :param use_api: 0.接口1, 1.接口2, 2.接口3 :param kwargs: requests模块参数 return ''' score_url = self.school_url['SCORE_URL'][use_api] + self.account try: view_state = self._get_view_state(score_url, **kwargs) except TooManyRedirects: msg = '可能是成绩接口地址不对,请尝试更改use_api值' raise ScoreException(self.code, msg) except RequestException: msg = '获取成绩请求参数失败' raise ScoreException(self.code, msg) payload = { '__VIEWSTATE': view_state, 'Button2': '在校学习成绩查询', 'btn_zcj': '历年成绩', 'btnCx': ' 查 询 ', 'ddlXN': '', 'ddlXQ': '' } try: res = self._post(score_url, data=payload, **kwargs) if res.status_code == 302: raise ScoreException(self.code, '成绩接口已关闭') elif res.status_code != 200: raise RequestException except RequestException: raise ScoreException(self.code, '获取成绩信息失败') html = res.content.decode('GB18030') tip = get_alert_tip(html) if tip: raise ScoreException(self.code, tip) return ScoreParse(self.code, html, use_api).get_score(score_year, score_term)
def _get_api(self, **kwargs): coding = 'gbk' if self.user_type else 'GB18030' try: res = self._get(self.schedule_url, **kwargs) if res.status_code == 302: raise ScheduleException(self.code, '课表接口已关闭') elif res.status_code != 200: raise RequestException except RequestException: raise ScheduleException(self.code, '获取课表请求参数失败') html = res.content.decode(coding) tip = get_alert_tip(html) if tip: raise ScheduleException(self.code, tip) schedule = ScheduleParse(html, self.time_list, self.schedule_type).get_schedule_dict() # 第一次请求的时候,教务系统默认返回最新课表 # 如果设置了学年跟学期,匹配学年跟学期,不匹配则获取指定学年学期的课表 if self.schedule_year and self.schedule_term: if self.schedule_year != schedule['schedule_year'] or \ self.schedule_term != schedule['schedule_term']: payload = self._get_payload(res.text) try: res = self._post(self.schedule_url, data=payload, **kwargs) if res.status_code != 200: raise RequestException except RequestException: raise ScheduleException(self.code, '获取课表信息失败') html = res.content.decode(coding) schedule = ScheduleParse( html, self.time_list, self.schedule_type).get_schedule_dict() return schedule
def get_score(self, score_year=None, score_term=None, use_api=0, **kwargs): ''' 成绩信息 获取入口 :param score_year: 成绩学年 :param score_term: 成绩学期 :param use_api: 0.接口1, 1.接口2, 2.接口3 ... :param kwargs: requests模块参数 return ''' score_url = self.school_url['SCORE_URL'][use_api] + self.user.account try: view_state = self._get_view_state(score_url, **kwargs) except TooManyRedirects: msg = '可能是成绩接口地址不对,请尝试更改use_api值' raise ScoreException(self.code, msg) except RequestException: msg = '获取成绩请求参数失败' raise ScoreException(self.code, msg) if score_year != None and score_term != None: # 按学年查询 payload = { '__VIEWSTATE': view_state, 'ddlXN': score_year, 'ddlXQ': score_term, 'txtQSCJ': '0', 'txtZZCJ': '100', 'Button1': '按学期查询' } elif score_year != None and score_term == None: # 按学期查询 payload = { '__VIEWSTATE': view_state, 'ddlXN': score_year, 'ddlXQ': '', 'txtQSCJ': '0', 'txtZZCJ': '100', 'Button5': '按学年查询' } elif score_year == None and score_term == None: # 在校成绩查询 payload = { '__VIEWSTATE': view_state, 'Button2': '在校学习成绩查询', 'btn_zcj': '历年成绩', 'btnCx': ' 查 询 ', 'ddlXN': '', 'ddlXQ': '' } try: res = self._post(score_url, data=payload, **kwargs) except TooManyRedirects: raise ScoreException(self.code, '成绩接口已关闭') except RequestException: raise ScoreException(self.code, '获取成绩信息失败') tip = get_alert_tip(res.text) if tip: raise ScoreException(self.code, tip) return ScoreParse(self.code, res.text, use_api, score_year, score_term).get_score(score_year, score_term)